2012-03-29 17 views
2

私のプロジェクトでは、if-else条件で実行される3つのPHPスクリプトが必要です。最初のスクリプトは、サイトのインデックスページにロードされ、条件が設定されているかどうかを確認し、条件が満たされている場合は、2番目のスクリプトを呼び出します。 2番目のスクリプトは、他の条件が設定されているかどうかをチェックし、すべてが良好であれば最終的に最後のスクリプトを呼び出します。php shell_exec()バックグラウンドでスクリプトを実行するのに必要なヘルプ

これはif文にスクリプトを含めることで可能ですが、最終的な結果はMySQLのダンプホギングなので、元のトリガページとは独立して実行する必要があります。

また、これらのスクリプトは、インデックスページでのユーザーの操作に関係なく、トリガーされた後も引き続きその作業を行う必要があります。

最後のこと:winとnixで実行できるはずです。

どうすればよいですか?

次のコードは意味がありますか?

if ($blah != $blah-size){ 
shell_exec ('php first-script.php > /dev/null 2>/dev/null &'); 
} 
//If the size matches, die 
else { 
} 

ありがとうございます。

更新:他の誰かが同じ取引を行っている場合に備えてください。 スクリプトをcgiとして実行するとPHPにバグがあるようですが、Apacheのコマンドラインはテストしたすべてのバージョンで動作します。

exec("php-cli mybigfile.php > /dev/null 2>/dev/null &"); 

それとも、シェルとしてそれを呼び出すことができます。

ので代わりに私はこのようなスクリプトを呼び出しバグにhttps://bugs.php.net/bug.php?id=11430

を参照してください。それはnixシステムで動作しますが、私のローカルウィンドウは絶望的なので、誰かがそれをWindows上で実行してもうまくいけば、これを更新してください。

+0

cron/windowsスケジューラによって実行される別のスクリプトワーカーを作成 – zerkms

+0

この全体のポイントは、cronを使用せず、ユーザーがトリガーすることでした。:) – Chris81

答えて

1

私が考えることができる最も簡単な方法は、( "画面が-m PHP長時間実行-script.phpを-d")あなたは

のexecを行うことができるということです。

これはすぐに戻り、バックグラウンドで実行されます。画面に接続して何が起こっているかを見ることができます。

あなたは 'nohup php long-running-script.php'でやっていることや、daemonize()を実行してスクリプトを実行する単純なCアプリを書くこともできます。

+0

下記をご覧ください – Chris81

+0

exec(" screen -d -m php myfile.php "); は自分のコードでも動作しません。私がブラウザで各スクリプトを実行すると、彼らは何をすべきかをすべて行いますが、すべて一緒にリンクされていません。 nohubの場合は exec( 'nohup php myfile.php >/dev/null &')のようになります。 ?ありがとう 申し訳ありませんコードが混乱していたので私の質問に答える必要がありました。 – Chris81

+0

nohupのために "リンクされている"という言い回しを得ることはできません - そうです、それは適切な方法です(これは主に "このアプリケーションを実行し、その端末がなくなったことを知らせません –

4

これらのリソースホッギングプロセスのうち、どれだけ一度に実行されるかを制御できないため、シェルのexecによってこれを実行しません。したがって、ユーザーはクリックしてクリックして基本的にマシンを停止させることができます。

代わりに、作業キューを作成します。ダンプを直接実行する代わりに、スクリプトはある種のFIFOキュー(データベーステーブルまたはどこかのdirのテキストファイルである可能性があります)にレコードを送信し、すぐに戻ります。次に、定期的に実行されるcronスクリプトを作成し、キューをチェックして、何か作業があるかどうかを確認します。もしそうなら、それは最も古いものを選んで実行します。この方法では、一度に1つのダンプしか実行していないことが保証されます。

+0

こんにちはアレックス、スクリプトは、時間間隔、データベースのサイズといくつかのものをチェックするためにデータベーステーブルでチェックするように調整されています。 CONNECTが満たされていない場合、else文はデータベース接続を終了させます。これはcronタブを設定しないでセットアップを実行するように設定されているので、Cronジョブは問題ありません。 – Chris81

関連する問題