問題タブ [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.
php - 長いスクリプトの処理中のphp-captureコンソール出力
ssh スクリプトの出力を最後にではなく、実行時にブラウザにキャプチャすることに問題があります。
書かれたスクリプト:
シェル スクリプトの実行には 10 分かかります。$counter=10 の場合、実際の出力を画面に表示するのに時間がかかりすぎます。何が起こっているのかを知るために、実行中にストリーム出力を表示し続ける必要があります。バッファリングのケースはありますか?
php - PHP プロセス実行タイムアウト
次のコードがあります。
それには2つの「問題」があります。
- コードは同期的です。ターゲットプロセスが閉じるまでフリーズします。
- これまでのところ、別の種類のコマンド (
$cmd > /dev/null &
Linux やstart /B $cmd
Windows など)を発行せずに「フリーズ」することはできませんでした。
「フリーズ」は全く気にならない。そのタイムアウトを実装するだけです。
注:ソリューションがクロスプラットフォーム互換であることが重要です。を変更する必要がないことも重要$cmd
です - 私はいくつかの複雑なコマンドを実行していて、いくつかの問題があるのではないかと心配していますが、これは修正の種類によって異なります - これらを聞いてうれしいです別の選択肢を好むというだけです。
役立つリソースをいくつか見つけました。
php - PHP での適切なシェル実行
問題
proc_open()
シェルコマンドを呼び出すために利用した関数を使用していました。STDIO のやり方が間違っていたようで、PHP やターゲット コマンドがロックされることがありました。これは元のコードです:
ほとんどの場合は機能しますが、それだけでは十分ではなく、常に機能するようにしたいと考えています。
この問題はstream_get_contents()
、STDIO バッファが 4k のデータを超える場合にロックアップすることにあります。
テストケース
STDERR と STDOUT に、合わせて 4120 バイト (4k を超える) の文字列を 2 回出力します。これにより、PHP が両側でロックアップします。
解決
どうやら、stream_select()
行く方法です。次のコードがあります。
パズルの唯一の残りのピースは、STDIN の処理です ( の行を参照(???)
)。
STDIN は、自分の関数を呼び出しているものによって提供される必要があることがわかりましたexecute()
。しかし、STDIN をまったく使用したくない場合はどうすればよいでしょうか。上記のテストケースでは、入力を求めませんでしたが、STDIN に対して何かを行うことになっています。
とはいえ、上記のアプローチは依然として でフリーズしstream_get_contents()
ます。私は何をすべきか/次に何をしようとしているのかよくわかりません.
クレジット
解決策は、元の問題を発見しただけでなく、Jakob Truelsen によって提案されました。4kのヒントも彼のアイデアでした。これに先立って、関数が正常に動作する理由について困惑していました (すべてがバッファ サイズに依存していることを知りませんでした)。
php - proc_open() の出力を取得する方法
PHPのメソッドから出力を取得しようとしましproc_open
たが、印刷すると空になりました。
私が知っている限り、出力を得ることができますstream_get_contents()
しかし、私はそれを行うことはできません..何か提案はありますか?
前にThx...
php - PHP proc_open が機能しない - 「Missing handle qualifier in array」というメッセージが表示される
警告: proc_open(): 102 行目の C:\...\updatedots.php の配列にハンドル修飾子がありません
2秒後にメモ帳を閉じようとしています。これは私のコードです:
このエラーの意味と原因は何ですか?
php - PHP CMD コマンド プロンプト ウィンドウを表示 (Windows)
通常、CMD ウィンドウを非表示にする必要があります。私の場合、PHP+CLI でいくつかのテストを行います。CLI ポップアップを起動するように PHP を作成できれば、非常に便利です。しかし、残念ながら、そこにたどり着く方法が見つかりません。
次のコマンドで機能するはずですが、機能しません。
問題の PHP コードは以下に基づいていproc_open()
ます。
コマンドは正常に実行されますが、ポップアップは表示されません。これはApacheの機能だと思います。親から CMD を完全に切り離す方法はありますか?
また、環境を初期化する小さなスクリプト/バッチ/プログラムに置き換えるDIR
ので、ポップアップが表示された後にプログラムを実行できることが重要です。
(これは主に教育目的のためであり、本番環境には適用されません。)
java - PHP とパイプでの Proc_Open
これは、MySQL サーバーとの Web インターフェースを介して minecraft サーバーを制御するためのソース コードです。実行されていないように見える 29 行目を除いて、すべて正常に動作します。サーバーcinには何も表示されません。また、何も起こりません...なぜそうなのか、誰かが考えを持っていますか?
php - Linux で非標準のファイル記述子で proc_open() を使用するにはどうすればよいですか?
proc_open()
ドキュメントには、標準のもの以外のファイル記述子を使用できると記載されています。
ファイル記述子番号は 0、1、および 2 に限定されません。有効なファイル記述子番号を指定すると、子プロセスに渡されます。
しかし、実際にこれを行うにはどうすればよいでしょうか。
たとえば、proc_open 呼び出しで追加の入力パイプと出力パイプを使用するには、親プロセスと子プロセスで何をする必要がありますか?
編集:
関連する質問 - 起動されたプロセスが PHP 関数でもある場合、ストリーム ラッパーを使用して PHP の任意の fd にアクセスできますphp://fd/3
(3 を fd 番号に置き換えます) が、この機能は PHP 5.3.6+ でのみ使用できます。PHP 5.2 で任意の fd にアクセスする方法はありますか?
php - PHP の proc_open + bypass_shell を使用して実行可能ファイルをバックグラウンドで実行し、正しい PID を取得しますか?
では、Windows 上の PHP では、バックグラウンドで実行可能ファイルを実行し、そのPIDを取得することは可能ですか? 両方のタスクを別々に達成することは可能ですが、一緒にすることはできないと推測しました。
プロセスのバックグラウンド化
シェル経由で起動されたプロセスをバックグラウンドにするには、コマンド'start /B "bg" myprog.exe'
を使用する必要があり、その直後にシェル プロセスを閉じる必要があります。
これを行うには、多くの人がpclose( popen( ... ) )
そのように使用しますが、私の知る限り、 popen を使用するときに をpclose( popen( 'start /B "bg" myprog.exe', 'r') );
取得することは不可能です。pid
popen では取得できpid
ないため、proc_open を参照する必要があります。
PID の取得
を使用すると、true に設定されている場合にのみproc_open
、exe の pid を取得できます。 bypass_shell
bypass_shell
が false (デフォルト) に設定されている場合、Windows はpid
SHELL の を返します。詳細については、https ://bugs.php.net/bug.php?id=41052 を参照してください。
問題の説明
start /B
コマンドが proc_open に渡されると失敗します。bypass_shell = true
これは、SHELL をスキップし、コマンドライン引数を myprog.exe に直接送信するためです。
逆に、bypass_shell = false
シェルをすぐに閉じるために proc_close を使用した場合 (デフォルト)、myprog.exe はバックグラウンドで実行されますが、使用した場合と同じようにpclose( popen( ... ) )
、間違っ pid
た結果が返されます ( pid
SHELL の を取得します)。
では、バックグラウンド化 + 正しい pid 検索は可能ですか?
そうでない場合、次善の策は何ですか? サードパーティの拡張機能をインストールできないように、共有ホスティングにデプロイされる PHP スクリプトに対してこれを行う必要があります。私が思いつく最善のtasklist
方法は、バックグラウンドで myprog.exe を起動する前後のスナップショットを取り、結果をクロス分析することです。myprog.exe は同時に実行できることに注意してください。
それが役立つ場合、違いはありませんが、myprog.exe は実際には ffmpeg (ほとんどの共有 Web ホストにインストールされています) です。
一時的な解決策
php - PHP-proc_open-env転送はどのように機能しますか?
proc_open関数に関するPHPのドキュメントには、子プロセスを生成するときに、「env」パラメーターの値としてnullを渡して、親スクリプトの環境を子プロセスに転送できると記載されています。ここで誰かがこれを行ったことがありますか?もしそうなら、これについて詳しく説明していただけませんか?
ユーザーが親プロセスにセッションデータを持っている場合、それは子に渡されますか?親プロセスにさまざまなライブラリやクラスなどが含まれている場合、それらも子に渡されますか?
ありがとうございました。