PHP ベースの Web アプリケーションを開発する場合、問題とプロジェクトの要件を解決するだけでは十分ではありません。ストレージ、メモリ、CPU 数などのサーバー リソースはホスティングの価格に影響するため、開発者は Web アプリケーションを開発するときにこれらのリソースを考慮する必要があります。さらに、アプリケーションはスムーズに実行される必要があります。 Web アプリケーションで何らかのパフォーマンスの最適化を実行するには何百もの方法がありますが、ここでは PHP のパフォーマンスを最適化するためのいくつかの方法の概要を示します。
1. PHP バージョンは非常に重要です
PHP バージョン 7 は PHP5 よりもはるかに高速です。 PHP バージョンは、最初のリリースから 2 年間完全にサポートされます。サポートされている PHP バージョンは以下のとおりです。
2 つのバージョン間で移行する場合、互換性の問題が発生しますが、その利点、特にパフォーマンスの向上は、開発コストや変更時間を上回るでしょう。以下のバージョンを使用している場合は、パフォーマンスを向上させるために、PHP の現在のバージョンにアップグレードすることをお勧めします。
2. 一重引用符と二重引用符の使用は重要です
これは開発者が最も注意すべきことのようですしかし、特に大きなループや文字列では、一重引用符を使用する方が二重引用符を使用するよりもはるかに高速であることを証明するために、多くのテストが行われています。二重引用符で囲まれた文字列は、文字列自体を表示する前に、まず変数の一部を検索するため、一重引用符で囲まれた文字列を出力するよりも若干遅くなります。 PHP プロジェクトのパフォーマンスの最適化を考える場合、文字列に一重引用符を使用することが重要です。
function doubleQuotes($iterations) { doubleQuotes($iterations) { $temp_str = "";= ""; $start_time = microtime(true);= microtime(true); for ($x=0; $x<$iterations; $x++) {for ($x=0; $x<$iterations; $x++) { $temp_str .= "Hello World! ";.= "Hello World! "; }} echo "Time for doubleQuotes(): " . (microtime(true)-$start_time) . "</br>";"Time for doubleQuotes(): " . (microtime(true)-$start_time) . "</br>"; }} function singleQuotes($iterations) {function singleQuotes($iterations) { $temp_str = '';= ''; $start_time = microtime(true);= microtime(true); for ($x=0; $x<$iterations; $x++) {for ($x=0; $x<$iterations; $x++) { $temp_str .= 'Hello World! ';.= 'Hello World! '; }} echo 'Time for singleQuotes(): ' . (microtime(true)-$start_time) . '</br>';'Time for singleQuotes(): ' . (microtime(true)-$start_time) . '</br>'; }} doubleQuotes(500000);(500000); singleQuotes(500000);(500000); Time for doubleQuotes(): 0.065473079681396Time for doubleQuotes(): 0.065473079681396 Time for singleQuotes(): 0.027308940887451Time for singleQuotes(): 0.027308940887451
このテスト以降、一重引用符で囲まれた文字列は、二重引用符で囲まれた文字列テストに比べて 2 倍以上の速度で実行されます。ミリ秒単位の違いは無視できるように思えるかもしれませんが、このパフォーマンスの向上は、毎分数百人のユーザーがアクセスする Web アプリケーションに役立ちます。したがって、変数の値を表示する必要がある場合は、二重引用符で囲んでエコーするだけですが、そうでない場合は、一重引用符で文字列をエコーした方がはるかに高速です。
3, ループ内のカウント関数の影響
ループは主に配列を走査するために使用されますが、ループでは count 関数を使用して配列の要素数を計算します。この関数を使用するとオーバーヘッドが発生します。
for ($x=0; $x<count($arr); $x++) { } ($x=0; $x<count($arr); $x++) { } $count = count($arr);= count($arr); for ($x=0; $x<$count; $x++) { }for ($x=0; $x<$count; $x++) { }
ループを使用して配列を反復処理する最良の方法は、要素の数を配列に一度保存し、その変数をループ条件に使用することです。 count 関数が for ループまたはループで使用される場合、ループが反復されるたびにプログラムが配列を再計算し、各反復でのプロセスの数が増加するためです。開発者がループ内で count を使用する必要がある唯一の方法は、ループ内で配列を操作する場合です。
4, 変数を閉じるか設定解除する
データベースにクエリを実行するときは、接続を確立する必要があります。1 つの方法は、接続変数を宣言することです。使用または宣言されたすべての変数がメモリを使用することは誰もが知っているため、クエリまたはすべてのクエリが完了した後に接続を閉じることをお勧めします。 ,
$conn = new mysqli($servername, $username, $password, $dbname);= new mysqli($servername, $username, $password, $dbname); //查询//查询 $conn->close();->close(); $myfile = fopen("sample-file.txt", "r") or die("Unable to open file!");= fopen("sample-file.txt", "r") or die("Unable to open file!"); //读取内容//读取内容 fclose($myfile);($myfile);
ファイルを開く場合と同様に、ファイルの読み取りまたは書き込み後、接続を処理する変数を閉じる必要があります。複数のユーザーが Web アプリケーションの同じリクエストにアクセスした場合でも、接続を閉じることでメモリ使用量が大幅に節約されます。
5. 静的メソッドまたは属性は使用するリソースが少なくなります
クラス内の静的メソッドは、使用時にそのクラスをインスタンス化する必要がありません。アクセスする前にインスタンス化する必要があるパブリック メソッドやプロパティとは異なり、静的メソッドは直接呼び出すことができます。メソッドが 1 つしかないクラスが他のクラスから頻繁に呼び出される場合、このメソッドは static として宣言する必要があります。変数またはクラスのインスタンス化にはメモリが必要となるため、これによりアプリケーションのメモリ使用量が削減されます。
6. SQL クエリの最適化
接続によりコードが短縮されるだけでなく、パフォーマンスも向上します。初心者は通常、最初のテーブルに対して選択クエリを実行し、最初の選択クエリの結果に基づいて別の選択クエリを実行します。
$query1 = mysql_query("SELECT id FROM users");= mysql_query("SELECT id FROM users"); while ($row = mysql_fetch_assoc($query1)) {while ($row = mysql_fetch_assoc($query1)) { $query2 = mysql_query("SELECT * FROM user_info WHERE user_id = {$row['id']}");= mysql_query("SELECT * FROM user_info WHERE user_id = {$row['id']}"); }}
さらに、複数のデータベース クエリを含む HTTP リクエストは、Web 開発ではタブーです。結合を使用して関連するデータベース テーブルをクエリできない場合は、データベースを正規化する必要があります。
SQL クエリのパフォーマンスを最適化するもう 1 つの方法は、特定の列にインデックスを追加することです。こうすることで、インデックス列を使用したレコードの取得が高速になります。インデックスには通常の列に比べて追加のストレージが必要ですが、レコードの取得速度が速いと、ユーザー エクスペリエンスが向上します。通常、インデックスを作成する必要がある列は、JOIN、ORDER BY、GROUP BY、および WHERE 句で使用される列です。
SELECT * FROM employees WHERE address LIKE '%Kansas City%'* FROM employees WHERE address LIKE '%Kansas City%'
クエリでワイルドカードを使用すると、確かに結果のフィルタリングが簡単になりますが、そのようなクエリは Web アプリケーションの速度が低下する主な原因の 1 つです。文字列を使用して都市や国などの繰り返し値を保存する代わりに、これらのタイプのフィールドを整数として保存し、別のデータベース テーブルを使用してこれらの整数とそれぞれの文字列値を保存します。このようにして、これらのフィールドを使用した検索には文字列ではなく整数が必要になります。
SELECT id, first_name, last_name FROM employees, first_name, last_name FROM employees
如果可能,如果您不打算使用数据库表的所有列,则只指定要使用的SELECT查询中的哪些列而不是SELECT *。查询返回的列越多,内存和处理能力就越大。
7、缩小CSS和JavaScript
性能优化的另一种方法是缩小JS和CSS代码; 这将使人们无法阅读,但当我们谈论生产中的Web应用程序时,代码的可读性不是优先事项。同时缩小代码会减小文件的大小,从而缩短加载时间。浏览器可以快速解析这些文件,因为省略了注释和空格,从而减少了忽略它的过程。当混淆代码使其无法被人阅读时,只需对需要保护的代码进行模糊处理,因为此过程可能会破坏代码。
8、使用CDN优化性能
Web应用程序通常使用Bootstrap和jQuery等库,加载这些文件的最佳方式是通过内容交付网络,如Cloudflare。要优化Web应用程序的性能,请利用内容交付网络(CDN)。我们的大多数图像,CSS或JS文件都是静态的,因此在靠近用户所在位置的服务器上维护内容的缓存副本是明智的。通过这种方式,数据传播的距离更短,执行速度更快,这将减少应用程序的延迟。需要性能改进的Web应用程序必须考虑使用CDN来下载资源。CDN允许用户从更近的源下载内容,而不是从托管整个应用程序的位置加载内容,这将极大地影响应用程序的加载时间。
9、Web应用程序流量
另一件需要考虑的事情是流量以及应用程序响应用户请求的速度。在Web应用程序中,常见问题是流量,访问系统的用户数量以及服务器处理特定请求的请求和响应的能力。比如Stackify Retrace可以监控应用程序的流量。
Retrace确保您的应用程序完美地满足您的需求。Retrace支持Microsoft Azure,Amazon AWS和Google GCP,以最大限度地提高基于云的监控功能,从而确保应用程序的质量。
以上がPHP のパフォーマンスを最適化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。