問題タブ [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.
php - デーモンプロセスに対する PCNTL-PHP の利点は何ですか?
私はphpを使用してデーモンプロセスを調査して実行しようとしていましたが、PCNTLを有効にするためにPHPを再コンパイルする必要があることに気付きました。それから私はいくつかのテストを始めました。私は単一の孤立した例をフォークしました:
次に、スクリプトを実行しました:
すべてが順調に進み、ファイル /dev/null.txt が消去され、1 秒ごとに無限ループで更新されていました。
次に、PCNTL の利点について疑問に思ったので、コードを変更しました。
前の例はどちらも同じ結果になりました。私は何かを逃しましたか?案内してもらえますか
php - pcntl_signal 信号が受信されていません
pcntl_signal
別のプロセスから送信されたシグナルを受信できないという問題があります。新しいプロセスをフォークし、2 つのバックグラウンド スレッドを起動し、停止信号 (SIGUSR1) を受信するまでコントローラー (メイン) スレッドをループするスクリプトがありますが、信号は受信されません。これが私のスレッドコードです(デモ目的でループにログインするだけです)。
別のプロセスでは、次のように他のプロセスにシグナルを送ります。
シグナル ハンドラが呼び出されることはありません。
私は何を間違っていますか?
php - PHP pcntl モジュールのインストール
composer を使用して yii フレームワークで作業を開始しようとしています。そのためには、この php pcntl モジュールが機能する必要があります。マニュアルを読むと、デフォルトではubuntuにインストールされていません。そのため、このような指示がいくつか見つかりました
そしてインストールを行いました。しかし、私はメッセージを受け取っていることを知っています
これはおそらく、このモジュールが既に私のシステムにあったことを意味します。それで、私のステップは何ですか?この警告に注意を払わないか、この問題を解決するために何かをしなければなりませんか?
php - オブジェクト メソッドに設定された pcntl_signal コールバック
オブジェクトメソッドに SIGTERM ハンドラを設定しようとしていたのですが、わからないことがありました。次のコードを考えてみましょう。
$a->start() を呼び出すと、SIGTERM は sleep() を中断するだけで、ハンドラは呼び出されません。しかし、実際には以前と同じことである while($a->run()) sleep(2); を試すと、ハンドラーが呼び出され、期待どおりに実行が停止します。誰でもこの動作を説明できますか?
php - 説明が必要 pcnt_fork()
私は pcnt_fork を初めて使用します。
出力: 25347-親 0-子
私の質問は、ここで $pid は子プロセスのプロセス ID、つまり 25347 ですよね? 次に、親のみをエコーする必要があります。なぜ、出力として0-childも与えるのですか...誰でも説明できますか
php - PHP は、同じ排他ロックを持つ 2 つのプロセスをどのように処理しますか?
php が flock() を使用してファイルへの排他ロックを取得し、pcntl_fork を使用して 2 つのプロセスに分割すると、両方のプロセスが同じ排他ロックを持つように見えます。つまり、さらに flock($fd, LOCK_EX ) は、そのファイル ハンドルに対して true を返します。
ただし、flock を使用するポイントは、2 つのプロセスが同時に同じファイルに書き込むのを防ぐことです。では、PHP はこのケースをどのように処理するのでしょうか。どういうわけか両方とも排他ロックを持っている 2 つのプロセスが競合することを許可しますか? あるプロセスが他のプロセスがロックを解除したかどうかを検出する方法は (新しいファイル ハンドラーを作成せずに) ありますか?
これは主に学術的な好奇心です。これは、新しいファイル ハンドラーを作成するか、IPC を使用して他のプロセスに通知する最後の手段として処理できることはわかっていますが、ロックの重複を検出する方法が群れシステムに組み込まれているのだろうか?
php - PHPクラスのようなRAIIで共有メモリとセマフォを削除する正しい戦略
そのような状況はいつ発生しますか?
インターポセス ロック ( pcntl 拡張子を使用) に共有メモリとセマフォを使用している場合は、セマフォと共有メモリ セグメントのライフ サークルに注意する必要があります。たとえば、バックグラウンド ワーカー アプリケーションを作成し、ジョブ処理にマスター プロセスと子プロセス (フォークされた) を使用するとします。共有メモリとセマフォを使用することは、それらの間の IPC に適しています。またRAII
、shm_xxx および sem_xxx のクラス ラッパーと同様に、php 関数も良いアイデアのように見えます。
例
良い選択ではありません-フォークの後、親プロセスに1つのインスタンスと子プロセスに1つのインスタンスがあります。そして、それらのいずれかのデストラクタはセマフォを破壊します。
なぜ重要か
ほとんどの Linux システムには、共有メモリ数のセマフォに関する制限があります。セマフォの多くの共有メモリ セグメントを作成および削除するアプリケーションがある場合、プロセスのシャットダウン時に自動的に解放されるまで待つことはできません。
質問
を使用すると、 shmctlを使用с
できます。削除するセグメントをマークします。実際の削除自体は、現在セグメントに接続されている最後のプロセスがセグメントを適切に切断したときに発生します。もちろん、現在セグメントに接続されているプロセスがない場合、削除はすぐに行われます。単純な参照カウンターのように機能します。しかし、phpは実装していません。IPC_RMID
shmctl
もう 1 つの戦略 - マスター プロセスのデストラクタでのみセマフォを破棄します。
それで、質問は
- PHPでIPC_RMIDを使用する方法はありますか?
- このような場合、どのような戦略を使用する必要がありますか? マスター プロセスのみで破棄しますか? 他のケース?
php - PHP のアップグレード後、pcntl_fork で「errno=32 Broken pipe」が発生する
最近、アップグレード後にphp 5.4.26から5.4.28にアップグレードしましたが、このエラーが発生しています
次のコードを実行するたびに:
子を 1 つだけフォークすると、PHP 通知が表示されません。複数の子を実行すると、最初の子を除くすべての子に対して PHP 通知が表示されます。
ここで何が起こっているかについて手がかりを持っている人はいますか?
Redis 接続を複数回閉じようとしていると思いますが、これは問題なく少なくとも 4 か月間実行しているコードです。
これらの通知は、5.4.28 へのアップグレード後にのみ表示され始めます。
PHP の変更ログを確認しましたが、この問題の原因と思われるものは何も見つかりません。
これをバグとして PHP に報告する必要がありますか?
アップデート:
Redis の問題である可能性があるようです。私はphpredisを使用しています。Redisをロードする代わりに、mysql 接続で同じコードをテストしましたが、エラーは発生しません。