問題タブ [proc-open]

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.

0 投票する
0 に答える
1817 参照

php - PHP スクリプトから WP-CLI を実行する

現在、php スクリプトからwp cliコマンドを実行しようとしています。WP-CLIに慣れていない人にとっては、Wordpress 用のクールなコマンド ライン インターフェイスです。以下は私の次のスクリプトです:

内部error-output.txtでは、次のエラーが表示されます。

sh: /usr/local/bin/wp: Permission denied

私が収集できることから、これはパーミッションの問題であり、apache(php スクリプトを実行している現在のユーザー) は何らかの理由でwpbin ファイルを実行できません。

好奇心から私は次のことをしました:

  1. wp --infowp-cli に関する情報を出力し、別のディレクトリへの書き込みを必要としない、実行したいコマンドを変更しpermission deniedました。
  2. 代わりにwpビンを移動しようとしました。usr/binここでも効果なし。
  3. 必死になってwp777 のアクセス許可を与えようとしましapacheたが、それでも実行できませんでした。

これはサーバーのセットアップ/許可の問題であると認識していますが (おそらく)、これが質問するのに最適な場所であると感じました.

0 投票する
1 に答える
138 参照

php - PHPで起動した外部プロセスのPID

PHP で実行されるプロセスの PID を取得する必要があります。私の問題の概要は次のとおりです。

2 つの外部プログラム (MatLab のプロセス) を実行するスクリプトがあります。2 番目のプログラムは、最初のプログラムの出力を待機する必要があり、ユーザーが必要に応じてそれらを強制終了するには、これらのプロセスの PID が必要です。

最初に exec() を使用しましたが、pid を取得する方法がわかりません。また、私は proc_open() を使用しましたが、最初のプロセスが終了するまで、最初の呼び出しでスクリプトをブロックする必要があります (2 番目のスクリプトの入力は一時ディレクトリに格納され、イメージです)。

私の環境はWindowsです。前もって感謝します。

0 投票する
1 に答える
592 参照

php - PHP proc_openブロックは、Cプログラムが終了するまでstdoutへの読み取りをブロックします

ユーザーの識別に指紋スキャナーを使用するアプリに取り組んでいます。指紋スキャナーとの対話は、PHP で proc_open を使用して呼び出した libfprint を使用する C プログラムで行われます。指紋登録プロセスは、libprintf によってステート マシンとして処理される多段階プロセスです。ライブラリと C プログラムの間で制御が渡され、C プログラムがユーザーにフィードバック (ステージの成功、失敗、およびその理由) を提供できるようになります...

PHP でプロセス リソースからデータを読み取ろうとすると、問題が発生します。サンプル PHP コードは次のとおりです。

?>

var_export を追加して、ブロッキングが発生している場所を絞り込みました。「opened」と「blah」の出力は正常に取得されますが、「blah123」は、指紋スキャナーでの登録プロセスが完了するまで表示されません。この時点で、指紋スキャナーからのすべての出力がそれに伴います。enroll.c アプリは、libfprint に付属するサンプルの enroll.c とほぼ同じですが、特定のステージが成功したときにサウンドを再生するようにいくつかの変更が加えられています。そのプログラムの「重要な」部分は次のとおりです。

C プログラムが終了した後の PHP アプリの出力は次のとおりです。

fgets()Cプログラムが終了するまで呼び出しがブロックされる理由についてのアイデアはfread()ありますか? stream_get_contents()プログラムの実行中に出力が得られることを期待しています。using に切り替えると$cmd = "ping 127.0.0.1";、期待どおりに動作し、ping の各行が stdout に出力されるように出力されます。

更新...修正

以下のバーマーは正しかったので、出力バッファリングをオフにする必要がありました....しかし、そうすることで、同様の問題を抱えている他の人のために文書化したい奇妙な矛盾に遭遇しました...修正は

このコメント によれば、これは次と同等である必要があります

しかし、を使用するsetvbuf(stdout, NULL, _IONBF, 0);と、C プログラムはすべてを正常に出力し、setvbuf(stdout, NULL, _IONBF, 0); . ではsetbuf(stdout, NULL);、すべてが完璧に機能しました。

私が非常に興味深いと思うのは、次のようなプログラムでは、出力バッファリングをオフにすることなく、PHP スクリプトが stdio を問題なく取得できたことです...そして両方のスクリプトに stdio が含まれていたため、両方とも出力バッファリングを有効にする必要がありました.. .

とにかく、それは今修正されました。ありがとう!

0 投票する
1 に答える
575 参照

php - proc_open を使用しているときに、STDIN パイプを常に開いたままにするにはどうすればよいですか?

Windows で PHP スクリプトを使用して、チェス エンジンと通信しています。次のように接続を確立しています。

次のようにコマンドをエンジンに送信できます。

そして、私はこのようなエンジン出力を読みました:

問題は、次のように stdin パイプを閉じるまでエンジン出力を読み取れないことです。

つまり、エンジンとやり取りしたいときはいつでも (proc_open を使用して) 接続を開いたり閉じたりする必要があります。

接続を常に開いたままにするにはどうすればよいですか?

0 投票する
1 に答える
267 参照

php - PHP: パイプ ストリームの読み取り時にスレッドがクラッシュする

私は現在、PHP で展開フレームワークを開発しており、スレッドとストリームに関していくつかの問題があります。

プロセスを開始し、その stdout と stderr を (別々に!) 読み取り、それをエコーし​​、プロセスが終了したときにストリームの完全な内容を返したいと考えています。

その機能を実現するために、私は 2 つのスレッドを使用しており、それぞれが異なるストリーム (stdout|stderr) を読み取っています。これで私が得た問題は、fgetsが2回目に呼び出されたときにphpがクラッシュすることです。(エラー コード 0x5、エラー オフセット 0x000610e7)。

多くの試行錯誤の後、run関数にダミー配列を追加すると、クラッシュが常に発生するとは限らず、期待どおりに機能することがわかりました。なぜこれが起こっているのか誰にも分かりますか?

Windows 7、PHP 5.4.22、MSVC9、pthreads 2.0.9 を使用しています

0 投票する
0 に答える
236 参照

php - パイプと proc_close プロセスを閉じる必要がありますか?

スクリプトを使用して ( proc_open) 5 ~ 50 のプロセスを次々と開きます。それぞれが cURL を実行し、結果を DB に投稿します。実行結果を待ちたくありません。メイン スクリプトの実行中と実行後に実行するだけです。set_time_limit(10);各プロセスファイルで 使用します。proc_close プロセスが終了するのを待ち、その終了コードを返します。proc_closeウェブ上で、メインファイルが呼び出しなしで完全に実行されると、php がすべてのパイプと各プロセスを自動的に閉じることがわかりましたがfclose、文書化された証明は見つかりませんでした。

問題は、パイプと proc_close プロセスを fclose する必要があるかどうかです。また、100 ~ 200 人のユーザーがこのスクリプトを同時に実行し、各ユーザーに対して 5 ~ 50 のプロセスが開かれ、呼び出されない場合、問題になる可能性がありproc_closeますfclose。このタスクを行うためのよりエレガントな方法がある場合は教えてください。まず、現在のアプローチに関する情報を取得する必要があります。どうもありがとう。各プロセスを呼び出すために使用するコードは次のとおりです (関数の一部)。