13

PHP の pcntl_fork 関数は、C の標準の fork 関数と同じようにプロセスを fork することになっています。
しかし、この関数が本当にプロセスを fork するのか、それとも別の方法でその動作をエミュレートするのか疑問に思っていました。
プロセスが本当にフォークされている場合、それがどのプロセスであるかは明らかです: Apache の子プロセスの 1 つです。
Apache が prefork MPM (つまり、リクエストごとに 1 つのプロセス) を使用している限り、問題ありません。
しかし、Apache がワーカー MPM を使用している場合はどうなりますか??
ワーカー MPM が使用されている場合、すべての Apache 子プロセスには多くのスレッドが含まれ、それぞれが異なる HTTP 要求を処理します。したがって、その状況でプロセスをフォークした場合、処理されているすべてのスレッドとリクエストがどうなるか想像もできません。
したがって、pcntl_fork() が実際にプロセスを fork する場合、Apache でワーカー MPM を使用するように設定している場合、この関数を使用するのは得策ではないと思います。

専門家は何と言っていますか?私はうまく推論していますか、それともナンセンスを話しているだけですか?

4

4 に答える 4

22

pcntl_forkおそらくあなたが思うように動作します: C 関数の fork と同じ方法で現在のプロセスを fork します:

このpcntl_fork()関数は、PID と PPID のみが親プロセスと異なる子プロセスを作成します。お使いのシステムで fork がどのように機能するかについての具体的な詳細については
、お使いのシステムの マニュアル ページを参照してください。fork(2)


ただし、マニュアルの「プロセス制御の紹介」セクションを引用すると、次のようになります。

PHP のプロセス制御サポートは、Unix スタイルのプロセス作成、プログラム実行、シグナル処理、およびプロセス終了を実装します。
Process Control は Web サーバー環境内で有効にしないでください。Web サーバー環境内で Process Control 機能を使用すると、予期しない結果が生じる可能性があります。

そのため、実際には Apache 経由で実行される PHP スクリプトからその関数を使用しないでください。コマンドラインから PHP スクリプトを実行する場合にのみ使用してください。


そして、その機能を使い始める前に、次のことを忘れないでください:

注: この拡張機能は、Windows プラットフォームでは使用できません。

于 2010-01-10T21:10:06.700 に答える
3

私は迅速かつ簡潔にしようとしますが、

Apacheを介して「フォーク」を使用することは可能です。「インストール」してから、php.iniで機能を有効にする必要があります。最後に、Apacheディレクトリに拡張機能を追加する必要があります(シンボリックリンクでも作業が完了します)例:

echo "extension=pcntl.so" > /etc/php5/conf.d/pcntl.ini
ln -s /etc/php5/apache2/conf.d/pcntl.ini /etc/php5/mods-available/pcntl.ini 

一方、私は多くのプロジェクトでフォークを使用しており、それらのほとんどを最適化するのに非常に優れていますが、Apacheでそれを悪用するとバグがあり、基本的にフォークされた子をフォークし、あらゆる種類のことを行いますハードコアなもので動作します...かなり良いですが、負荷がかかると、ゾンビプロセスの作成を開始する前にしばらく動作します。「pcntl_signal(SIGCHLD, SIG_IGN);」を使用してゾンビプロセスを管理できます。これは基本的に、子供がタスクを完了するとすぐにプロセスを削除します。これは少し役立ちます。次に、apache が狂ってスレッド自体が開始され、最終的にサーバーがクラッシュするときです。この動作を説明することはできません (まだですが、説明します)。 apache によって作成されたこの堰/悪ツリーは、"ps" からも、server-status または apache ログからも見ることができません。

一言で言えば:

Apache を使用したフォークは機能しますか? そのとおり

それを乱用しないでください

これが誰かを助けることを願っています

于 2016-01-11T15:38:07.390 に答える
3

PHP はスレッドセーフではないため、そもそもワーカー MPM 用に構成された Apache インストールで PHP をモジュールとして実行することはお勧めできません (PHP マニュアルのどこかに記載されていると思います)。

はい、プロセスをフォークする必要があります。PHP マニュアルには、詳細な手順について読む必要があるとさえ記載されているman fork(2)ため、おそらく C fork 関数のラッパーにすぎません。

更新: ワーカー MPM の PHP マニュアルの関連ページは次のとおりです: http://php.net/install.unix.apache2.php

注: Apache のマルチスレッド バージョンをビルドするには、ターゲット システムがスレッドをサポートしている必要があります。この場合、PHP は実験的な Zend Thread Safety (ZTS) で構築する必要があります。この構成では、すべての拡張機能が使用できるわけではありません。推奨されるセットアップは、デフォルトの prefork MPM-Module を使用して Apache をビルドすることです。

また、いくつかの詳細な手順が記載されたこのページを見つけました: http://www.stevekallestad.com/blog/apache_worker_mpm_with_php.html

于 2010-01-10T21:04:20.533 に答える
0

私はapache経由でpcntl_forkを使用しようとしましたが、奇妙な状況は、子プロセスをフォークした後、親がその子に標準出力(ブラウザ)を与えることです。したがって、ブラウザは親プロセスからの出力を受け取ることができません。

于 2012-07-06T08:53:19.337 に答える