2009-03-08 13 views
4

私は、スクリプトを開始するPHPページに提出するHTMLフォームを持っています。スクリプトの実行には3秒から30秒かかることがあります。ユーザーはこのスクリプトを完了するために周りにいる必要はありません。PHPでの長いプロセスを放棄する(しかし、完了させる)

PHPスクリプトを起動して、すぐに「ありがとう」をユーザに(あるいは何でも)印刷して、スクリプトが動作し続けている間、気楽に行かせることはできますか?

私の特定のケースでは、フォームデータをPHPスクリプトに送信してから、他の多くの場所にデータを投稿します。すべての投稿が成功するのを待っているのは、私の興味のためではありません。私はちょうどスクリプトを実行させ、ユーザーが自分の好きなことをやり遂げることができるようにしたいと思います。それだけです。

答えて

0

私は次のようになりました。

<?php 

    // Ignore User-Requests to Abort 
    ignore_user_abort(true); 
    // Maximum Execution Time In Seconds 
    set_time_limit(30); 

    header("Content-Length: 0"); 
    flush(); 

    /* 

    Loooooooong process 

    */ 

?> 
2

別のPHPスクリプトに入れ、あなたの長期的な作業を、例えば

background.php:

$unused_but_required = array(); 
proc_close(proc_open ("php background.php &", array(), $unused_but_required)); 
echo("Done); 

foreground.php

sleep(10); 
file_put_contents('foo.txt',mktime()); 

あなたは、すぐに "完了" を参照してくださいよファイルは10秒後に書き込まれます。

私はproc_openにパイプがなくファイル記述子が与えられていないので、proc_closeが機能すると思います。スクリプトは

<?php 
ignore_user_abort(true); 

その方法を:

+0

あなたはあなたの答えを少しわかりやすく説明できますか? – Sampson

+0

どのように動作するのか説明できますか?開いた直後にプロセスを終了しようとするように見えます。 proc_closeのドキュメントによると、プロセスが終了するのを待つでしょう - これを避けたいのですか? – thomasrutter

+0

私はこの方法を使ってスレッディングを行い、実際にうまく動作します –

0

あなたがブラウザにバッファ内にあるものは何でもすぐに送信するflushおよび関連出力バッファ機能を試みることができますユーザーがページを離れるときに終了しません。しかし、このwhithを組み合わせるときには非常に注意してください。

set_time_limit(0); 

その後、スクリプトは永遠に実行される可能性があります。

1

スクリプトでユーザーが設定することができます

1

set_time_limitignore_user_abortを使用できますが、ジョブをキューに入れ、非同期スクリプトを使用して処理することをお勧めします。はるかに簡単で耐久性のあるデザインです。

0

php_forkと呼ばれるpcntl_fork()の周りにAPIラッパーがあります。

また、この質問は、ガラス瓶で釘を打たないでください。Daily WTF ...

関連する問題