5

次のコードを含むexeファイルがあります。

ながら(1)

printf("こんにちは\n");

shell_exec を使用して php でこの exe を実行しています

$output = shell_exec('C:/Users/thekosmix/Desktop/hello.exe 2>&1');

$ 出力をエコーし​​ます。

タスクマネージャーからプロセスを強制終了し、致命的なエラーが発生するまで、スクリプトは非常に長い間実行されています:

(致命的なエラー: 7 行目の C:\xampp\htdocs\shell\index.php で、134217728 バイトの許容メモリ サイズが使い果たされました (133693440 バイトを割り当てようとしました))

スクリプト(またはこの関数)を特定の期間実行し、致命的なエラーではなく、期間中に生成された出力を出力する必要があります。set_time_limit() も問題を解決していません。

4

3 に答える 3

3

PHP 内からこれを行うことはできませんset_time_limit()。各 PHP ステートメントが実行された後にのみチェックされます。Linuxulimitでは を使用しますが、Windows を使用しているようです。

実行可能ファイルを変更hello.exeしてタイムアウトを構築するか、タイムアウトを呼び出しhello.exeて処理する PHP から呼び出すラッパーを作成する必要があります。簡単にフォークできる言語では、これは些細なことです。

于 2012-04-24T05:54:49.057 に答える
1

要約すると、Linux サーバーを使用している場合は、次のようにします。

shell_exec('ulimit -t 120 && ' . $path_to_program);

これは 2 分間の cpu-usage の後に終了します。これは、プログラムのリソース不足に応じて、リアルタイムで 2 分をはるかに超えます。

于 2019-06-26T17:38:58.537 に答える
0

スクリプトを次のように変更できます

while (shouldKeepRunning())

shouldKeepRunning は、最も粗雑な形式で、特定のファイルが存在するかどうかをチェックして、実行を継続する必要があるかどうかを判断できます。次に、ファイルを作成または削除して、スクリプトを正常にシャットダウンします。Linux ではシグナル ハンドラを使用できますが、Windows では使用できません。とにかく、あなたは要点を理解します。

大規模なコード変更なしで外側の while ループが十分に細分化されていない場合は、ティックを使用できます。http://php.net/manual/en/control-structures.declare.php

于 2012-04-24T06:01:40.657 に答える