問題タブ [pcntl]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
multithreading - CLIアプリ/スクリプトを開発するための最良/人気のあるライブラリは何ですか?
私が精通しているコンポーネントライブラリとツールキットの多くには、CLI固有のライブラリ(zend、kohanaなど)がありません。CLIアプリケーションを開発するために特別に設計されたライブラリ/ツール(phpのマルチスレッドライブラリの抽象化、pcntl / posixなど)はありますか?
php - pcntl_fork() による HTML スクレーパーの効率の改善
前の 2 つの質問の助けを借りて、製品情報をデータベースにフィードする HTML スクレーパーが動作するようになりました。私が今やろうとしているのは、スクレーパーをpcntl_fork
.
php5-cli スクリプトを 10 個の個別のチャンクに分割すると、全体のランタイムが大幅に改善されるため、I/O や CPU に縛られているわけではなく、スクレイピング関数の線形的な性質によって制限されているだけであることがわかります。
複数のソースからまとめたコードを使用して、次の動作テストを行いました。
これにより、次の疑問が生じます。
1) 私の hrefArray に 4 つの URL が含まれているとします。たとえば、配列に 1,000 個の製品 URL が含まれている場合、このコードは 1,000 個の子プロセスを生成しますか? その場合、プロセスの量を 10 に制限する最善の方法は何ですか。例として 1,000 の URL では、子の作業負荷を子ごとに 100 製品 (10 x 100) に分割します。
2) pcntl_fork がプロセスとすべての変数、クラスなどのコピーを作成することを学びました。私がやりたいのは、hrefArray 変数を、スクレイピングする製品のリストを作成してからフィードする DOMDocument クエリに置き換えることです。処理を行うために子プロセスにオフにするため、10 の子ワーカーに負荷が分散されます。
私の脳は、次のようなことをする必要があると言っています(明らかにこれは機能しないので、実行しないでください):
しかし、私が理解できないのは、私の hrefsArray[] をマスター/親プロセスでのみ構築し、それを子プロセスに供給する方法です。現在、私が試したことはすべて、子プロセスでループを引き起こします。つまり、私の hrefsArray はマスターと後続の各子プロセスで構築されます。
私はこれについて完全に間違っていると確信しているので、正しい方向への一般的なナッジだけを大いに感謝します.
php - PHP: pcntl_alarm() と socket_select() は平和的に同じスレッドに存在できますか?
チャット クライアントが接続するためのチャット サーバーとして機能する PHP CLI スクリプトを主に作成しています (なぜ PHP でそれを行っているのかは聞かないでください。それは別の話です)。
私のスクリプトは、socket_select() 関数を使用して、ソケットで何かが発生するまで実行を停止します。その時点で、ソケットは起動し、イベントを処理し、次のイベントまで待機します。ここで、30 秒ごとに実行する必要のあるルーチン タスクがいくつかあります (tempban されたユーザーの禁止を解除する必要があるかどうかを確認し、ユーザー データベースを保存し、その他のさまざまなことを行います)。
私が言えることは、PHP には非常に優れたマルチスレッド サポートがまったくないということです。私が最初に考えたのは、ソケットがイベントを生成し、プログラムが再び流れるたびにタイムスタンプを比較することでしたが、サーバーが何時間もアイドル状態のままで、クリーンアップ ルーチンが実行されない可能性があるため、これは非常に一貫性がありません。
PHP pcntl 拡張機能に出会いました。これにより、SIGALRM が送信される時間間隔を割り当て、送信されるたびに関数が実行されます。これは私の問題に対する理想的な解決策のように思えますが、pcntl_alarm() と socket_select() がかなり衝突します。SIGALRM がトリガーされるたびに、ソケット制御コードにあらゆる種類のクレイジーなことが起こります。
私のプログラムはかなり長いので、ここにすべてを投稿することはできませんが、コードに関して何か間違ったことをしているとは思わないので、問題ではありません。私の質問は: SIGALRM を待機中の socket_select() と同じスレッドで処理する方法はありますか? もしそうなら、どのように?そうでない場合、ここで私の代替手段は何ですか?
これが私のプログラムからの出力です。私のアラーム機能は単に「Tick!」を出力します。呼び出されるたびに、いつ何かが起こっているかを簡単に知ることができます。これは、4回ティックを許可した後の出力(エラーを含む)です(サーバーへの実際の接続試行はありませんでした):
[05-28-10 @ 20:01:05] チャット サーバーが 192.168.1.28 ポート 4050 で開始されました
[05-28-10 @ 20:01:05] ファイルから 2 人のユーザーを読み込みました
PHP 通知: 未定義のオフセット: 112 行目の /home/danny/projects/PHPChatServ/ChatServ.php の 0
PHP 警告: socket_select(): [4] を選択できません: 116 行目の /home/danny/projects/PHPChatServ/ChatServ.php でシステム コールが中断されました
[05-28-10 @ 20:01:15] カチカチ!
PHP 警告: socket_accept(): 着信接続を受け入れることができません [4]: 126 行目の /home/danny/projects/PHPChatServ/ChatServ.php でシステム呼び出しが中断されました
[05-28-10 @ 20:01:25] カチカチ!PHP 警告: socket_getpeername() は、パラメーター 1 がリソースであると想定しており、129 行目の /home/danny/projects/PHPChatServ/ChatServ.php で指定されたブール値です
[05-28-10 @ 20:01:25] PHP からのソケット接続の受け入れ通知: 未定義のオフセット: 1 の /home/danny/projects/PHPChatServ/ChatServ.php 行 112
PHP 警告: socket_select(): [4] を選択できません: 116 行目の /home/danny/projects/PHPChatServ/ChatServ.php でシステム コールが中断されました
[05-28-10 @ 20:01:35] カチカチ!
PHP 警告: socket_accept(): 着信接続を受け入れることができません [4]: 126 行目の /home/danny/projects/PHPChatServ/ChatServ.php でシステム呼び出しが中断されました
[05-28-10 @ 20:01:45] カチカチ!
PHP 警告: socket_getpeername() は、パラメーター 1 がリソースであると想定しており、129 行目の /home/danny/projects/PHPChatServ/ChatServ.php で指定されたブール値です
[05-28-10 @ 20:01:45] からのソケット接続を受け入れています
PHP Notice: Undefined offset: 2 in /home/danny/projects/PHPChatServ/ChatServ.php 行 112
php - pcntl_fork()関数
Webのクロールには多くの時間がかかる可能性があるため、pcntl_fork()を使用して、コードを部分的に分割する複数の子を作成できるようにします。
- マスター-ドメインをクロールする
- 子-リンクを受信するとき、子はドメインで見つかったリンクをクロールする必要があります
- 子-新しいリンクを受信するときは、2。と同じことを行う必要があります。
必要な数だけ作成できますか、それとも最大数の子を設定する必要がありますか?
これが私のコードです:
言うのを忘れた:私はWIN x(86)32ビットの回避策が必要です!
私のクライアントではサポートされていないからです。
php - 長いPHPSOAPプロセス
私はSOAPを介してすべてのデータを取得するWebサイトに取り組んできました。一部のページでは、soapサーバーへの呼び出しが3〜4回行われる場合があり、一部の呼び出しには非常に長い時間(30〜60秒)がかかる場合があります。
私が気付いたのは、30秒の長い通話の1つでリクエストを中断し(ブラウザの読み込みを停止)、それほど時間のかからない通話に別のリクエストを発行した場合(短い通話で別のURLを読み込む)です。最初の呼び出しの30秒が経過するまで(またはそう思われるまで)要求を受け取りません。
ここで正確に何が起こっているのでしょうか、それを回避する方法はありますか?
これはpcntlが軽減するのに役立つものですか?
また、Nginxを介してFPMを使用してPHPをセットアップすることも検討しています。これは物事に影響しますか?
みんなありがとう!
php - shell_exec phpfile
私は現在このコードを使用しています:
私のcontent.phpには、次のコードがあります。
ここで、フォームに入力して送信することで、shell_execが実際に機能するかどうかを確認したいと思います。ただし、何もエコーされません。
間違ったコードを書きましたか?
php - pcntl_waitpid() によって返される $status を使用するにはどうすればよいですか?
保護者/労働者の取り決めが進行中です。親はワーカー PID を配列に保持し、次のループでそれらがまだ生きていることを常にチェックします。
問題は、pcntl_waitpid()
常に$status
0 に設定されていることです。そのため、このループが最初に実行されると、親は、まだ実行されているにもかかわらず、すべての子が正常に終了したと見なします。私はpcntl_waitpid()
間違って使用していますか、それともそうでないことを期待していますか?
php - pcntl_wifexitedは常にtrueを返します
子プロセスはエラーで終了する可能性がありますが、pcntl_wifexitedは常にtrueを返します
シグナルを使用してエラーを見つけることはできますが、pcntl_wifexited()の何が問題になっているのかわかりません。
これはオプションに関連していWNOHANG
ますか?
php - php での pcntl ライブラリの使用が prod-serv で推奨されないのはなぜですか?
実稼働サーバーで pcntl lib を使用することが推奨されない理由を誰か教えてもらえますか? PHP マニュアルはそれについて非常に簡単に説明しており、私はこのライブラリを使用する必要があります... PHP で同じことを行う別の方法はありますか?