PHP は人気のあるプログラミング言語として、さまざまな分野で広く使用されています。同時実行性が高く、データ量が多く、負荷が高い場合、PHP のシングルスレッド特性によりパフォーマンスのボトルネックが発生します。マシンのすべての CPU、メモリ、IO リソースを最大限に活用し、プログラムのパフォーマンスとスケーラビリティを向上させるには、マルチプロセス テクノロジを使用する必要があります。
オペレーティング システムでは、プロセスとは実行中のプログラムを指します。マルチプロセスプログラミングとは、プログラムを複数のプロセスに分割して実行することで、各プロセスが独立して並行して実行できるため、プログラムのスループットや処理能力が向上します。
PHP では、通常、マルチプロセス プログラミングを実装するために pcntl 拡張ライブラリが使用されます。
まず、php.ini ファイルで pcntl 拡張ライブラリを有効にする必要があります。
extension=pcntl.so
pcntl_fork() 関数を使用して、新しい子プロセスを作成します。子プロセスと親プロセスはコード セグメント、データ セグメント、スタック セグメントを共有しますが、それぞれが独立した実行スペースとプロセス ID を持ちます。
$pid = pcntl_fork();
if ($pid == -1) {
// fork失败
} else if ($pid) {
// 父进程
} else {
// 子进程
}
pcntl_waitpid() 関数を使用して、子プロセスが終了するのを待ち、子プロセスから返されるステータス コードを取得します。
$status = null;
$pid = pcntl_waitpid($child_pid, $status, WNOHANG);
if ($pid == -1) {
// waitpid错误
} else if ($pid) {
// 子进程已结束,$status中是子进程的状态码
} else {
// 子进程还在运行
}
pcntl_sigprocmask() 関数を使用して、プロセスが受信したシグナルをマスク/復元します。
pcntl_sigprocmask(SIG_BLOCK, [SIGTERM]);
// SIGTERM シグナルを受信した後、プロセスはすぐに終了せず、プロセスが完了するまで待ってから終了します。
pcntl_signal(SIGTERM 、function() {
// 处理SIGTERM信号
});
pcntl_sigprocmask(SIG_UNBLOCK, [SIGTERM]);
実際にはアプリケーションでは、プロセスの開始、停止、再起動、監視、その他の機能を含むプロセスを管理する必要があります。一般的に使用されるプロセス管理テクノロジは次のとおりです。
4.1 Supervisord
Supervisor は、複数のプロセスを開始、停止、再起動、監視できるプロセス マネージャーです。クライアントとサーバーがあり、クライアントはサーバーに制御コマンドを送信し、サーバーはプロセスの実行ステータスを制御します。スーパーバイザは、プロセス グループ、ロギング、プログラムの起動に失敗した場合の自動再起動、カスタム スクリプト、その他の機能もサポートしています。
スーパーバイザーの設定ファイルは非常にシンプルで、INI 形式を使用しているため、保守が簡単です。次に、スーパーバイザ設定ファイルの例を示します。
[program:myprogram]
command=/usr/bin/php /path/to/myprogram.php
process_name=%(program_name) s_% (process_num)02d
numprocs=4
directory=/path/to/myprogram
autostart=true
autorestart=true
user=myuser
stdout_logfile=/var/log /myprogram .log
stderr_logfile=/var/log/myprogram.err
4.2 Systemd
Systemd は、sysvinit および upstart を置き換えるために使用される初期化システムであり、プロセスマネージャー。複数のプロセスを開始、停止、再起動、監視することができ、プロセスの依存関係、自動再起動、プロセス ステータスのクエリ、リソース制限などの機能をサポートします。
Systemd の構成ファイルはより複雑で、systemd.units ファイル形式を使用します。以下は Systemd 構成ファイルの例です:
[Unit]
Description=myprogram
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/php /path/to/myprogram.php
PIDFile=/run/myprogram.pid
Restart=on-failure
User=myuser
[ [インストール]
WantedBy=multi-user.target
4.3 Docker
Docker は、コンテナを迅速に作成、デプロイ、実行できるオープン ソース アプリケーション コンテナ エンジンです。 Docker では、各コンテナーは独立したプロセスであり、コンテナーは Docker のコマンド ライン ツールまたは API を使用して管理できます。
Docker は、ファイル システム、プロセス スペース、ネットワークなどを含む、任意のアプリケーションを実行できるオペレーティング システムに似た環境を提供します。 Docker は、分散デプロイメント、コンテナ オーケストレーション、イメージ ウェアハウス、その他の機能もサポートしています。
マルチプロセス プログラミングとプロセス管理テクノロジは、ネットワーク プログラミングとシステム プログラミングで広く使用されています。複数のプロセスを使用することで、プログラムの同時処理能力やスループットが向上し、プロセスマネージャーを使用すると、プロセスの起動、停止、再起動、監視などをより便利に管理できます。実際のアプリケーションでは、実際の状況に基づいて適切なテクノロジーを選択して開発および展開する必要があります。
以上がPHP におけるマルチプロセス プログラミングとプロセス管理テクノロジの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。