1

PHPスクリプト内からPerlスクリプトを実行しようとしています。exec、popen、proc_openなどのさまざまな方法を使用してこれを機能させましたが、古き良きGoogleが答えをくれない回避すべき問題がいくつかあります。

PHPファイル内から.plスクリプトを実行する必要があります(数値であるスクリプトに1つの変数を渡す)が、.plが完了するまでphpスクリプトが待機しないようにする必要があります(.plは4〜5時間かかる可能性があります)サーバー上で実行します)。perlスクリプトからの戻り出力は期待していないので(perlスクリプトはその出力をmysql dbに記録します)、サーバー上で実行してphpスクリプトを続行させるだけで済みます。

apache、php、mysql を実行している Windows マシンで実行する場合、乗り越えなければならないいくつかの障壁があります。

Linux のソリューションを見たことがあると思いますが、Windows マシンにとどまる必要があります。

現在、次のコードを使用して proc_open アプローチを試みています (proc_open 行の 35 は、perl スクリプトに渡す必要があるテスト ID です)。

$descriptorspec = array(
0 => array("pipe","r"),
1 => array("pipe","w"),
2 => array("file","./error.log","a")
) ;

proc_close(proc_open('perl perlscript.pl 35', $descriptorspec, $pipes));

$i = 0;
while ($i < 1000) {
   echo ++$i;  
}

現在、このコードは perl スクリプトを実行しますが、(テストのためだけに) その後に配置した while ループは実行されません (perl スクリプトが終了するのを待って実行するかどうかを確認していません)。 .

4

4 に答える 4

0

3 つのオプションが表示されます。

  • perl スクリプトで使用forkして、フォークの直後に存在する親プロセスで実際の作業をフォークします。ただし、これは Windows では正しく機能しないか、まったく機能しない可能性がありますが、試してみる価値はあります。

    次の「forkWindows の場合」のリファレンスを参照してください。

  • PHP が URL リクエストを起動できる場合 (Perl の LWP または wget と同様)、Perl スクリプトを CGI スクリプトに変換し (自明)、Apache の CGI ディレクトリに貼り付けて、適切な URL を介して に呼び出しますhttp://localhost/...。次に、最悪の場合、何らかの内部 PHP タイムアウトまたは通常の HTTP タイムアウトを介して URL 要求をタイムアウトにします。本当に最悪の場合、Perl は LWP ライブラリを介した URL 呼び出しとタイムアウトを介したタイムアウトの両方を確実にサポートできるため、Perl コード内から同じトリックを実行します。alarm()

  • X 分ごとに Perl スクリプトを起動するスケジューラを設定します。スクリプトは、次のロジックで開始する必要があります。if (-e $flag_file) { unlink $flag_file; do_long_work() } else { exit 0; }where$flag_fileはサーバー上の特別な場所 (たとえばC:\temp\myscript_start_perl.txt) であり、実行do_long_work()する必要がある実際の作業が含まれています。

    次に、PHP スクリプトが Perl スクリプトを開始する必要がある場合、空のフラグ ファイル (同じC:\temp\myscript_start_perl.txt) を作成するだけで、次にスケジューラが Perl スクリプトを実行するときにそれが認識されます。

于 2010-11-26T12:01:53.340 に答える
0

この質問に答えてくれたみんなに感謝します。多くの調査とさまざまなソリューションのいじりの後、私は最終的に機能し、ニーズに合ったものを手に入れました. 完璧にはほど遠いですが、うまく機能するので、あまり文句を言うつもりはありません。

これは他の人が知りたいことのように思われるので、私の解決策を共有したいと思いました。

  1. ここから Hstart (40kb) という小さなプログラムをダウンロードしました: http://www.ntwind.com/software/utilities/hstart.html

  2. ファイルを c:\windows\system32 に抽出しました。

hstart プログラムには、コマンド ウィンドウを開かずにバッチ ファイルを実行する機能があります。.pl ファイルを直接呼び出しても機能しないため、次のように .pl を呼び出すために .bat を作成する必要がありました。

  1. 基本的に、ローカルにインストールされたperlを使用して変数を渡すperlスクリプトを呼び出す.plファイルと同じディレクトリに.batファイルを作成しました。ここに示すように:

    perl script.pl %1

  2. 私の PHP スクリプトでは、次のコマンドを使用して perl ファイルを呼び出しました。

    $cmd = 'hstart /NOCONSOLE "run.bat ' . $id . '" > log.log'; exec($cmd);

  3. php ファイルを実行すると、フラグが設定されているため、hstart が noconsole で開きます。変数として渡した $id を使用して perl ファイルを開き、非表示のコンソール ウィンドウのすべての出力を、コマンドで指定したように log.log に送信します。タスク マネージャで実行されている perl.exe だけが表示されます。

私が言ったように、完璧にはほど遠いですが、うまくいきます。

于 2010-11-29T16:44:35.293 に答える
0

最近、次のようなタスク用のモジュールを公開しました: Win32::Detached

これを perl スクリプトに追加すると、それ自体がデーモン化され、PHP スクリプトを続行できるようになります。

于 2010-11-28T15:43:26.530 に答える
0

2つの可能性があります

  1. 「開始」プログラムを使用します。パイプは使用できず、コマンド ライン引数のみを使用できます。

  2. 常時実行の Perl プログラムを作成します (起動時または Win32::Daemon を使用して実行)。ソケットまたは http を使用して接続します。CPANには準備ができているサーバーがたくさんあるので簡単です

また、Win32::Job または Win32::Process またはその他の CPAN モジュールを使用して、別の Perl プログラムからこれを実行できる場合もあります。

于 2010-11-26T12:14:26.733 に答える