問題タブ [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 - PHPで複数の関数を並行して実行する
5 つの関数を並行して実行したいのですが、これらの関数はすべて SQL から結果を返します。
使用する予定でしたpcntl_fork();
が、これらの変数に値を割り当てる方法がわかりませんでした。
php - HHVM は pcntl_fork を使用できません
CentOs 6.5 に hhvm 3.5 をインストールしましたが、正しく実行できました。しかし、pcntl_fork() 関数を使用して何かを行うとわかりました。
hhvm は次のようにエラーをスローします。
致命的なエラー: サーバー モードでは fork は許可されていません。
nginx + hhvmで発生しました.cliモードではすべて問題ないようです. はpcntl_fork()
cli モードでのみ実行できますか? そうでない場合、それを大丈夫にする方法は?
php - PHP でのプロセスのリスポーンとシグナル処理
仕様
再生成されたプロセスがシグナルを処理していないときに、再生成する前に処理が正しく機能しているとき、PHP に問題があります。コードを非常に基本的なものに絞り込みました。
ご覧のとおり、次のことを行います。
- プロセスを再起動するシャットダウン関数を登録します(親プロセスが終了したとき
nohup
に無視するため)SIGHUP
pcntl_signal()
forSIGTERM
およびを介してハンドラーを登録しSIGCONT
ます。最初はプロセスが終了したというメッセージを記録するだけですが、2番目はプロセスの再生成につながります。これはob_*
関数で実現されるため、フラグを渡すには、シャットダウン関数で何を行う必要がありますか - 終了または再生成のいずれかです。- スクリプトが「生きている」という情報をログ ファイルに記録します。
何が起こっている
だから、私はスクリプトを開始しています:
次に、ログ ファイルに次のようなエントリがあります。
たとえば、私は次のようにしますkill 8849
。
したがって、正常に処理されSIGTERM
ます (そしてスクリプトは実際に終了します)。ここで、代わりに を実行するkill -18 8849
と、(18 は の数値SIGCONT
)が表示されます。
したがって、最初はSIGCONT
正しく処理され、次の「アイドル」メッセージから判断すると、新しく生成されたスクリプトのインスタンスはうまく機能しています。
更新#1:(ppid=1
したがって、init
グローバルプロセス)および孤立プロセスのシグナル処理について考えていましたが、そうではありません。これは、orphan ( ) プロセスが理由ではないことを示しています。ppid=1
アプリを制御してワーカーを起動すると、system()
ワーカーが自分自身を再生成するのと同じように、コマンドで呼び出します。ただし、制御アプリがワーカーを呼び出した後、ppid=1
シグナルを正しく受信して応答しますが、ワーカーが自分自身を再生成した場合、新しいコピーはそれらに応答しませんSIGKILL
。そのため、ワーカーが自分自身を再生成する場合にのみ問題が発生します。
更新 #2 : で何が起こっているのかを分析しようとしましたstrace
。さて、ここに2つのブロックがあります。
- ワーカーがまだ再生成されていない場合-strace の出力。行
4
と を5
SIGCONT
見てください。これはkill -18
、プロセスに送信するときです。そして、すべてのチェーンをトリガーします: ファイルへの書き込み、system()
現在のプロセスの呼び出しと終了。 ワーカーがすでにそれ自体で再生成されている場合 - strace の出力。ここで、行
/li>8
を9
見てください- それらは を受け取った後に現れましたSIGCONT
。1 つ目: プロセスがまだ何らかの形でシグナルを受信しているように見え、2 つ目はシグナルを無視することです。アクションは実行されませんでしたが、送信されたシステムによってプロセスが通知されましたSIGCONT
。なぜプロセスがそれを無視するのか - 問題です (ユーザー ハンドラのインストールがSIGCONT
失敗した場合、プロセスは終了せずに実行を終了する必要があるため)。に関してはSIGKILL
、すでにリスポーンされたワーカーの出力は次のようになります。
これは、そのシグナルが受信され、本来すべきことを行ったことを示しています。
問題
SIGTERM
プロセスがリスポーンされるため、 にも にも反応しませんSIGCONT
。ただし、それを終了することはまだ可能ですSIGKILL
(したがって、kill -9 PID
実際にプロセスを終了します)。たとえば、両方の上のプロセスの場合、何もkill 8875
しkill -18 8875
ません (プロセスはシグナルを無視し、メッセージを記録し続けます)。
ただし、シグナルの登録が完全に失敗しているとは言いません-少なくとも再定義するためですSIGTERM
(通常は終了につながりますが、この場合は無視されます)。またppid = 1
、何か間違ったことを指しているのではないかと思いますが、今ははっきりとは言えません。
また、他の種類のシグナルを試しました(実際、シグナルコードが何であるかは関係ありませんでした。結果は常に同じでした)
質問
そのような行動の理由は何ですか?プロセスを再生成する方法は正しいですか? そうでない場合、新しく生成されたプロセスがユーザー定義のシグナルハンドラーを正しく使用できるようにする他のオプションは何ですか?
php - php pcntl_fork を使用してバックグラウンドで関数を実行する方法
私には2つの機能があります。mysql接続を使用してバックグラウンドで実行し、ブラウザにエラーや何も返さずに実行したい関数の1つ。そして、ブラウザにデータを返す実行したい別の関数。
次のように php pcntl_fork を使用しました。
この場合、 でのみ発生するデータベース エラー番号 2006 が返されますfunction_background()
。
私はfunction_background()
、mysql接続を使用してバックグラウンドで関数を完全かつ独立して実行し、エラーなどでブラウザを妨害することなく実行したいと考えています。そしてfunction_return()
、ブラウザへのメッセージ。
どんな助けにも感謝します。誰かが私に詳細な情報を教えてくれれば素晴らしいです。
ありがとう。
windows - Windows に PCNTL 拡張機能をインストールする方法は?
私は Windows で PHPUnit を実行しており、composer.json経由で PHPUnit をインストールしようとしています:
...この依存関係がありますが、このエラーが発生しています:
phpunit/php-invoker 1.1.3 には ext-pcntl が必要です * -> 要求された PHP 拡張機能 pcntl がシステムにありません。
この拡張機能をインストールするにはどうすればよいですか?
php - PHPシグナルがすぐに処理されない
長時間実行できる PHP で記述されたソフトウェアがあります。コマンドライン (Web アプリケーションではありません) から起動します。ctrl+c で強制終了した場合を含め、ソフトウェアが終了したときに必ず関数を呼び出すようにしたかったのです。シグナルによって強制終了されると、シャットダウン関数 ( register_shutdown_fucntion() で登録されたデストラクタと関数) は呼び出されません。
少し読んだ後、「exit;」を呼び出すためだけに、関連するすべてのシグナルにハンドラーを追加する必要があることに気付きました。そうすることで問題が解決し、機能します。
私の問題は、場合によっては、シグナルがすぐに処理されないことです。数秒、数分かかる場合があり、場合によってはまったく処理されません。ハンドラー コードに到達しなかった場合と同様です。どこからデバッグを開始すればよいかわかりません。私は他のシグナル(sigkill、sighupなど)を試しましたが、同じ動作です。
私のコードはこれらの括弧内にあります
すぐに治療を受ける時間とそうでない時間の間に相関関係は見つかりません.
どんな助けでも大歓迎です。
php - pcntl がインストールされた未定義の pcntl_signal_dispatch()
pcntl
ubuntu サーバー VM での使用に問題があります。
繰り返し処理を行うスレッドを作成する PHP スクリプトがあります。
私のサーバーには、PHP の pcntl 拡張機能があります。
コマンドphp -me
出力を使用すると、次のようになります。
カレンダー
ctype
curl
日付
dom
フィルター
ハッシュ
iconv
json
libxml
mbstring
mysql
pcntl
pcre
PDO
pdo_mysql
pdo_sqlite
posix
リフレクション
セッション
shmop
SimpleXML
SPL
SQLite
標準トーク ナイザー xml xmlreader
xmlwriter zip zlib
コードにログを追加したので、スクリプトによって実行されると確信pcntl_fork
しています。
しかし、を使用している行では、エラーでクラッシュしました:pcntl_wait
pcntl_wexitstatus
pcntl_signal_dispatch()
未定義関数 pcntl_signal_dispatch() の呼び出し
手がかりは大歓迎です:)