PHP では同時実行機能を向上させる方法について詳しく説明しています

WBOY
リリース: 2023-03-16 18:00:02
転載
1533 人が閲覧しました

この記事は、PHP に関する関連知識を提供します。主に、PHP の同時実行機能を向上させるためのソリューションを紹介します。この記事では、サンプル コードを通じて詳しく紹介しており、皆様の学習や仕事に非常に役立ちます。は確かな参考と学習価値があります。一緒に見てみましょう。皆さんのお役に立てれば幸いです。

(推奨チュートリアル: PHP ビデオ チュートリアル)

この記事には、プログラミング学習ノート gitee が含まれています。 PHP、JavaScript、Linux、Golang、MySQL、Redis、オープンソース ツールなどをカバーします。

運用環境で使用される PHP は、PHP 自体のパフォーマンスを向上させるために最適化する必要があり、PHP コードの作成に加えて、php-fpm と php.ini のチューニングも構成する必要があります。この記事では、メモリ、OPcache、アップロード、セッション、セキュリティの側面から php.ini の設定チューニングについて説明します。

他のコンパイル言語と比較した場合、PHP の最大の欠点は、各リクエストで何らかのモジュール解析が必要となり、実際に実行されるのはワークプロセスであることです。作業プロセスの開始にはより多くのリソースが必要です。同時に、リクエストごとに一部のコードが再解析され、解析が繰り返されることになります。

PHP の最適化では、この側面に焦点を当てて最適化を検討できます。

メモリの最適化

PHP を実行するときは、各 PHP プロセスが使用するメモリの量に注意する必要があります。使用量の設定には、php.ini の memory_limit 設定が使用されます。単一の PHP プロセスが使用できるシステム メモリの最大量。

この設定のデフォルト値は 128M で、ほとんどの中小規模の PHP アプリケーションに適しています。ただし、マイクロ PHP アプリケーションを実行している場合は、この値を下げてシステム リソースを節約できます。逆に、メモリを大量に消費する PHP アプリケーションを実行している場合は、この値を増やすことができます。この値のサイズは、利用可能なシステム メモリによって決まります。PHP に割り当てる値の量を決定するのは技術です。PHP に割り当てるメモリの量と、許容できる PHP-FPM プロセスの数を決定するときは、次の基準に基づいて判断できます。次の次元情報について:

  • PHP に割り当てられるメモリの量はどれくらいですか? 2G メモリを備えた VPS を例にとると、このデバイスでは MySQL、Nginx などの他のプロセスも実行できるため、PHP 用に 512M を残しておくのが適切です。
  • 各 PHP プロセスは平均してどのくらいのメモリを消費しますか?プロセスのメモリ使用量を監視するには、コマンド ライン コマンド top を使用するか、PHP スクリプトで memory_get_peak_usage() 関数を呼び出すことができます。同じスクリプトを実行し、平均メモリ消費量を取得します。
  • PHP-FPM プロセスはいくつまで対応できますか? 512M のメモリを PHP に割り当て、各 PHP プロセスが平均 15M のメモリを消費すると仮定すると、34 個の PHP-FPM プロセスを用意できます。

システム リソースは十分ですか?最後に、PHP アプリケーションを実行し、予想されるトラフィックを処理するのに十分なシステム リソースがあることを確認する必要があります。特定の PHP 構成情報については、php-fpm.config 構成ファイルを参照してください。

; 子プロセスがマスターからのシグナルに対する反応を待機する時間制限。
; 使用可能な単位: s(秒)、m(分)、h(時間)、または d( ays)
; デフォルトの単位: 秒
; デフォルト値: 0
;process_control_timeout = 0

; FPM がフォークするプロセスの最大数。これは、
を制御するように設計されています。 ; 多数のプール内で動的 PM を使用する場合のグローバル プロセス数。
; 慎重に使用してください。
; 注: 値 0 は制限がないことを示します。
; デフォルト値: 0
; process.max = 128

; マスター プロセスに適用する nice(2) 優先度を指定します (設定されている場合のみ)
; 値は、-19 (最高の優先度) から 20 (最低の優先度) まで変化します。 )
; 注: - FPM マスター プロセスが root として起動された場合にのみ機能します
; - プール プロセスは、特に指定されていない限り、マスター プロセスの優先順位を継承します
; デフォルト値: no set
; process.priority = -19

; FPM をバックグラウンドに送信します。デバッグのために FPM をフォアグラウンドに保つには、「no」に設定します。

; デフォルト値: yes
daemonize = no

php-fpm には、固定数のプロセス、オンデマンドのプロセス数、および完全に動的なプロセス数の 3 つの動作モードがあります。

    オンデマンドのプロセスの数。デフォルトでいくつかのプロセスが初期化されます。量が多すぎる場合、いくつかの新しいプロセスが動的に作成されます。リクエストが完了すると、新しく作成されたプロセスは破壊される。
  • プロセス数を固定します。デフォルトでは、いくつかのプロセスが固定されています。プロセス数が十分でない場合、新しいリクエストは待機状態となり、他のプロセスの処理が完了するまで処理されません。
  • 完全に動的プロセスの数は、リクエストの量によって完全に制御されることを意味し、リクエストごとにプロセスが作成され、処理後に破棄されます。
Zend OPcache パフォーマンス アクセラレーションをオンにする

割り当てるメモリ量を決定したら、PHP の Zend OPcache 拡張機能を構成できます。 OPcache は主に一部のコードをバイトコードに解析するため、後続のリクエストでコードのこの部分を繰り返し解析してコンパイルする必要はありません。コンパイルと解析のプロセスを削減すると、PHP の処理速度も向上します。

PHP5.5.0 にはこの拡張機能が組み込まれています。必要な設定情報は次のとおりです:

opcache.memory_consumption = 64: オペコード キャッシュに割り当てられたメモリ (単位は MB) , 割り当てられたメモリの量は、アプリケーション内のすべての PHP スクリプトによってコンパイルされたオペコードを保存できる必要があります。この値は、アプリケーションのサイズに応じて異なるサイズに設定できます。

opcache.interned_strings_buffer = 16: 常駐文字列の保存に使用されるメモリ量 (単位は MB) 常駐文字列とは何ですか?バックグラウンドでは、PHP インタープリタは同じ文字列の複数のインスタンスを検索し、その文字列をメモリに保存します。同じ文字列が再度使用される場合、PHP インタープリタはポインタを使用します。これはメモリを節約するためです。デフォルトでは、PHP 常駐文字列は各 PHP プロセスで分離されます。この設定により、PHP-FPM プロセス プールですべてのプロセス常駐文字列を共有バッファに保存できるようになり、PHP-FPM プロセス プールで処理できるようになります。複数のプロセス間で参照されるため、より多くのメモリが節約されます。

opcache.max_accelerated_files = 4000: オペコード キャッシュに保存できる PHP スクリプトの最大数。この値の範囲は 2000 ~ 100000 です。この値は より大きくする必要があります。 PHP アプリケーションでは、ファイルの数が多くなります。

opcache.validate_timestamps = 1: この設定の値が 1 の場合、PHP は一定期間後に PHP スクリプトの内容が変更されたかどうかをチェックします。チェックの時間間隔は次のとおりです。 opcache.revalidate_freq の指定によって設定されます。この設定の値が 0 の場合、PHP は PHP スクリプトの内容が変更されたかどうかをチェックしないため、キャッシュされたオペコードを自分でクリアする必要があります。開発環境では 1 に設定し、運用環境では 0 に設定することをお勧めします。

opcache.revalidate_freq = 0: PHP スクリプトの内容が変更されたかどうかを確認する頻度 (秒単位) を設定します。 0 秒に設定する意味は、opcache.validate_timestamps が 1 に設定されている場合にのみ、リクエストごとに PHP ファイルが再検証されるということです。そのため、開発環境では PHP ファイルは毎回再検証されますが、開発環境では毎回再検証されません。実稼働環境を確認します。

opcache.fast_shutdown = 1: この設定により、オペコードはより高速なシャットダウン ステップを使用できるようになり、オブジェクトの破棄とメモリの解放は Zend Engine のメモリ マネージャーに任せられます。

ファイルのアップロード

アプリケーションでファイルのアップロードが許可されている場合は、アップロードできる最大ファイル サイズを設定することをお勧めします。さらに、同時にアップロードできるファイルの最大数を設定することをお勧めします:

file_uploads = 1
upload_max_filesize = 10M
max_file_uploads = 3
ログイン後にコピー

デフォルトでは、PHP では 1 回のリクエストで 20 個のファイルをアップロードでき、アップロードされるファイルの最大数はここでは、1 回のリクエストで最大 3 ファイルをアップロードできるように設定しており、各ファイルの最大サイズは 10MB です。この値を大きくしすぎるとタイムアウトが発生しますので、この値を設定しないでください。

注: 大きなファイルをアップロードする必要がある場合は、それに応じて Web サーバーの構成を調整する必要があります。 php.ini での設定に加えて、Nginx 仮想ホスト構成の client_max_body_size 設定も調整します。

また、非常に大きなファイルをアップロードする場合は、Webuploader の特殊なアップロード コンポーネントを使用することをお勧めします。フロントエンドで大きなファイルをスライスし、バックエンドの PHP でスライスされたデータをマージしてファイルを復元します。 。 WebUploader アプリケーションの詳細については、このサイトの記事「強力なファイル アップロード コンポーネント - WebUploader」を参照してください。

実行時間

max_execution_time は、単一の PHP プロセスが終了するまでに実行できる最大時間を設定するために使用されます。この設定のデフォルトは 30 秒ですが、5 秒に設定することをお勧めします。

max_execution_time = 5
ログイン後にコピー

PHP スクリプトで set_limit_time() 関数を呼び出して、この設定をオーバーライドできます。

レポートを生成し、その結果を PDF ファイルにしたいとします。このタスクは完了するまでに 10 分かかる可能性がありますが、PHP リクエストを 10 分間待たせることは絶対に避けたいです。別の PHP ファイルを作成し、それを別のバックグラウンド プロセスで実行すると、Web アプリケーションが別のバックグラウンド プロセスを生成して HTTP 応答を返すまでに数ミリ秒しかかかりません。

実際には、完了までに時間がかかるタスクを実行するときは、通常、バックグラウンド プロセスを使用します。たとえば、PHP の swoole 拡張機能を使用してレポートを生成し、バッチで電子メールを送信できますが、これには時間がかかりますタスク。

セッションの処理

PHP のデフォルトの状況では、いわゆるセッション情報など、セッションによって生成された情報がディスクに保存されます。セッションの作成と読み取り時には、ディスク上で I/O 操作が実行されますが、ディスクの読み取りと書き込みは、実際には比較的時間のかかる操作です。また、セッションは分散アプリケーションのセッション メカニズムを処理するには不便です。 Redis や memcached などのインメモリ サービスに配置することをお勧めします。これらのサービスは、読み取りおよび書き込み速度が速く、分散セッション メカニズムで処理できます。

次の例では、セッションなどの情報を memcached メモリに保存します。

session.save_handler = "memcached"
session.save_path = "服务地址:端口号"
ログイン後にコピー

バッファ

少ないデータをより多くのチャンクで送信するのではなく、より多くのデータをより少ないチャンクで送信すると、ネットワークはより効率的になります。つまり、より少ないフラグメントで訪問者のブラウザにコンテンツを配信すると、 HTTP リクエストの総数。

したがって、PHP に出力をバッファリングさせる必要があります。デフォルトでは、PHP は出力バッファリング機能を有効にしています。PHP は、コンテンツを Web サーバーに送信する前に 4096 バイトの出力をバッファします。推奨される構成は次のとおりです:

output_buffering = 4096
implicit_flush = false
ログイン後にコピー

如果想要修改输出缓冲区的大小,确保使用的值是4(32位系统)或8(64位系统)的倍数。

安全设置

open_basedir:使用open_basedir选项能够控制PHP脚本只能访问指定的目录,这样能够避免PHP脚本访问不应该访问的文件,一定程度上限制了phpshell的危害。我们一般可以设置为只能访问网站目录:

open_basedir = /data/www
ログイン後にコピー

disable_functions:一般我们要禁止系统函数和禁止任何文件和目录的操作,如:

disable_functions = '.....'
ログイン後にコピー

expose_php = Off:将此项设置为false即不会再header头输出PHP版本信息。

display_errors = Off:生产环境中,我们应该禁止错误提示,如果是本地开发环境,可以设置为On。

log_errors = On:建议在关闭display_errors后能够把错误信息记录下来,便于查找服务器运行的原因。

error_log:设置PHP错误日志存放的目录。

(推荐教程:PHP视频教程

以上がPHP では同時実行機能を向上させる方法について詳しく説明していますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
php
ソース:jb51.net
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート