PHP7の複数プロセスに関する予備調査
準備
PHP が単一プロセスで実行されることは誰もが知っていますが、PHP によるマルチ同時実行の処理は、主にサーバーのマルチプロセスまたは PHP-FPM とプロセスの再利用は重要ですが、PHP 複数のプロセスを実装することも、特にバックグラウンドの Cli モードで大量のデータを処理する場合や、バックグラウンドで DEMON
デーモン プロセスを実行する場合に非常に重要です。複数のプロセスの利点は言うまでもありません。
PHP のマルチスレッドについても言及されていますが、プロセス内でのマルチスレッドのリソース共有と割り当ての問題は解決が困難です。 PHP にもマルチスレッド拡張機能 pthreads
がありますが、不安定でスレッドセーフな環境が必要と言われているため、あまり使われていません。
過去に、PHP グループの偉大な達人が、バックグラウンド PHP を進めたいならマルチプロセスを避けなければならないと指導したことがありますが、たまたま社内のデーモン プロセスも PHP を使用しているためです。マルチプロセス、Gu Ge のさまざまな情報と組み合わせた情報とマニュアルを読んだ後、ようやくマルチプロセスを理解し、小さなデモ (Linux システム上で実装) を作成しました。この記事にまとめておきます。間違いや漏れがあれば、 、言及していただきありがとうございます。
PHP マルチプロセスを実装するには、pcntl
と posix
という 2 つの拡張機能が必要ですが、インストール方法についてはここでは説明しません。
php では、pcntl_fork()
を使用して複数のプロセスを作成します (*NIX システムの C 言語プログラミングでは、既存のプロセスは fork 関数を呼び出すことで新しいプロセスを生成します)。フォーク後の新しいプロセスは子プロセスになり、元のプロセスは親プロセスになり、子プロセスは親プロセスのコピーを持ちます。ここで注意してください:
• 子プロセスは、親プロセスとプログラム テキスト セグメントを共有します。
• 子プロセスは、親プロセスのデータ領域、ヒープ、およびスタックのコピーを持っています。共有ではなくコピーです
• 親プロセスと子プロセスはフォーク後もプログラム コードを実行し続けます
#• フォーク後、親プロセスと子プロセスのどちらが実行されるか最初は確認できず、システムのスケジューリングに依存します (信念に依存します)ここでは、子プロセスが親プロセスのデータ領域、ヒープ、およびスタックのコピーを持っていると言われています。ほとんどの実装では、真の完全なコピーではありません。さらに重要なのは、COW (Copy On Write) テクノロジーを使用してストレージ容量を節約していることです。簡単に言うと、親プロセスも子プロセスもこれらのデータ、ヒープ、スタックを変更しない場合、親プロセスと子プロセスは一時的に同じデータ、ヒープ、スタックを共有します。親プロセスまたは子プロセスがデータ、ヒープ、およびスタックを変更しようとした場合にのみ、コピー操作が発生します。これはコピーオンライトと呼ばれます。 pcntl_fork() を呼び出した後、この関数は 2 つの値を返します。親プロセス内の子プロセスのプロセス ID を返し、子プロセス自体の内部では数値 0 を返します。 Apache や fpm 環境では複数のプロセスを適切に実行できないため、php cli 環境でコードを実行する必要があります。サブプロセスの作成
PHP サブプロセスの作成は複数のプロセスの始まりです。pcntl_fork() 関数が必要です。
fork関数の詳細説明
pcntl_fork() # 現在のプロセスの現在位置に分岐(子プロセス)を生成します。この関数が新しい子プロセスを作成した後、子プロセスは親プロセスの現在のコンテキストを継承し、親プロセスと同様に
pcntl_fork() 関数から下位に実行を続けます。ただし、
pcntl_forkが得られます() 戻り値が異なりますので、戻り値を判断することで親プロセスと子プロセスを区別し、親プロセスと子プロセスに異なる論理処理を割り当てることができます。
fork 子プロセス
$ppid = posix_getpid();
$pid = pcntl_fork();
if ($pid == -1) {
throw new Exception('fork child process fail');
} elseif ($pid > 0) {
cli_set_process_title("我是父 process,pid is : {$ppid}.");
sleep(30);
} else {
$cpid = posix_getpid();
cli_set_process_title("我是 {$ppid} 子的 process,我的 process pid is : {$cpid}.");
sleep(30);
}
posix_getpid(): 現在のプロセス id を返します。
cli_set_process_title('プロセス名'): 現在のプロセスにわかりやすい名前を付けます。
この例を実行すると、現在の 2 つの PHP プロセスが表示されます。
www@iZ2zec3dge6rwz2uw4tveuZ:~/test$ ps aux|grep -v grep |grep 我 www 18026 0.5 1.2 204068 25772 pts/0 S+ 14:08 0:00 我是父 process,pid is : 18026. www 18027 0.0 0.3 204068 6640 pts/0 S+ 14:08 0:00 我 18026 子的 process,我的 process pid is : 18027.
コードの最初のセクションでは、プログラムが pcntl_fork() から開始された後、親プロセスと子プロセスがコードの実行を継続します:
$pid = pcntl_fork(); if( $pid > 0 ){ echo "我是父亲".PHP_EOL; } else if( 0 == $pid ) { echo "我是儿子".PHP_EOL; } else { echo "fork失败".PHP_EOL; }
結果:
www@iZ2zec3dge6rwz2uw4tveuZ:~/test$ php 123.php 我是父亲 我是儿子
2 番目のセクション 子プロセスが親プロセスのデータを共有するのではなくコピーを持つことを示すコード:
// 初始化一个 number变量 数值为1 $number = 1; $pid = pcntl_fork(); if ($pid > 0) { $number += 1; echo "我是父亲,number+1 : { $number }" . PHP_EOL; } else if (0 == $pid) { $number += 2; echo "我是儿子,number+2 : { $number }" . PHP_EOL; } else { echo "fork失败" . PHP_EOL; }
Result
www@iZ2zec3dge6rwz2uw4tveuZ:~/test$ php 1234.php 我是父亲,number+1 : { 2 } 我是儿子,number+2 : { 3 }
以上がPHP7の複数プロセスに関する予備調査の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









同時実行性の高いプログラミング言語である Golang の組み込みコルーチン メカニズムとマルチスレッド操作により、軽量のマルチタスクが可能になります。ただし、マルチプロセス処理シナリオでは、異なるプロセス間の通信と共有メモリがプログラム開発の重要な問題になります。この記事では、Golangで複数プロセス間で共有メモリを実現する応用方法を紹介します。 1. Golang でマルチプロセスを実装する方法 Golang では、fork、os.Process、

php7.0 に mongo 拡張機能をインストールする方法: 1. mongodb ユーザー グループとユーザーを作成します; 2. mongodb ソース コード パッケージをダウンロードし、ソース コード パッケージを "/usr/local/src/" ディレクトリに配置します; 3. 「src/」ディレクトリに入ります; 4. ソースコードパッケージを解凍します; 5. mongodb ファイルディレクトリを作成します; 6. ファイルを「mongodb/」ディレクトリにコピーします; 7. mongodb 設定ファイルを作成して設定を変更します。

Node.js がシングルスレッドであることは誰もが知っていますが、特別なタスクの処理を高速化するマルチスレッド モジュールも提供していることは知りません。この記事は、Node のマルチスレッドを理解するのに役立ちます。 js さん、もっと詳しく知りたいと思っています。みんな助けてください!

php5 では、fsockopen() 関数を使用して TCP ポートを検出できます。この機能を使用して、ネットワーク接続を開き、ネットワーク通信を実行できます。ただし、php7 では、fsockopen() 関数でポートを開けない、サーバーに接続できないなどの問題が発生する可能性があります。この問題を解決するには、socket_create() 関数とsocket_connect() 関数を使用して TCP ポートを検出します。

PHP 7.0 でインストールされているプラグインが表示されない問題を解決するには: プラグインの設定を確認し、プラグインを有効にします。 PHP を再起動して、構成の変更を適用します。プラグイン ファイルの権限をチェックして、それらが正しいことを確認します。不足している依存関係をインストールして、プラグインが適切に機能することを確認します。他のすべての手順が失敗した場合は、PHP を再構築します。他に考えられる原因としては、プラグインのバージョンに互換性がない、間違ったバージョンをロードしている、PHP 構成の問題などが挙げられます。

Golang はマルチプロセスであり、そのスレッドモデルは MPG モデルですが、全体として Go プロセスとカーネルスレッドは多対多に対応するため、まずマルチスレッド化する必要があります。 Golang には、いわゆる M 比 N モデルがあります。N 個の go ルーチンは、M スレッドで作成できます。一般に、N は M よりもはるかに大きくなります。本質的にはマルチスレッド モデルです。ただし、コルーチンのスケジューリングは、開発者はコルーチン間の同期にチャネルを使用する必要があることが強調されています。

PHP サーバー環境の一般的な解決策には、正しい PHP バージョンがインストールされていること、および関連ファイルがモジュール ディレクトリにコピーされていることを確認することが含まれます。 SELinux を一時的または永続的に無効にします。 PHP.ini をチェックして構成し、必要な拡張機能が追加され、正しく設定されていることを確認します。 PHP-FPM サービスを開始または再起動します。 DNS 設定に解決の問題がないか確認してください。

php7.0 をインストールおよび展開する方法: 1. PHP 公式 Web サイトにアクセスして、ローカル システムに対応するインストール バージョンをダウンロードします; 2. ダウンロードした zip ファイルを指定したディレクトリに解凍します; 3. コマンド ライン ウィンドウを開いて、次のリンクに移動します。 「E:\php7」ディレクトリ 「php -v」コマンドを実行するだけです。
