0

完了までに 50 秒近くかかる一連の関数を実行する必要があります。しかし、いくつかの関数自体を実行した後にページにリダイレクトし、さらに実行を続けたいです。

以下の関数は、次のようにフォーム送信時に実行されますprocess.php // it wont echo anything

// all function in serprate process page.
func1
func2
func3
// After above 3 function i need to php redirect to redirect now immediately example.com
func4
func5
func6

PHPヘッダーを使用してみましたが、すぐにリダイレクトされません。

header("Location:http://www.example.com");

使用exit();すると、リダイレクトされますが、機能 4、5、および 6 は処理されません。

私が必要としているのは、最初の 3 つの関数の直後にリダイレクトして実行を継続する方法です。

4

2 に答える 2

3

紙の上では、flush() と ignore_user_abort() を組み合わせることでこれを実現できます。

ignore_user_abort(true);
do_stuff();
send_redirect();
flush();
do_more_stuff();

マニュアルページ:

既知の注意点に注意してください: 一部のブラウザー (特に古い IE、場合によっては新しい IE) は、送信したものを処理する前に最小限のバイト数を受信する必要があるため、html コメントに長い文字列を追加する必要がある場合があります。期待どおりに動作します。

実際には、より従来のアプローチは、cron ジョブ タスクを何らかのテーブルに登録し、cron.php ファイルに保留中のタスクを完全に別の (独立した) リクエストで処理させることです。

コメントでは、あまり一般的でないアプローチも強調されています。シェルコマンドまたは何かをその順序で発行します。これを行う場合は、入力のサニタイズに非常に注意してください。


参照用にこれを追加します(以下のコメントを参照):

<!-- IE bug fix: pad the page with enough characters such that it is greater than 512 bytes, even after gzip compression abcdefghijklmnopqrstuvwxyz1234567890aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz11223344556677889900abacbcbdcdcededfefegfgfhghgihihjijikjkjlklkmlmlnmnmononpopoqpqprqrqsrsrtstsubcbcdcdedefefgfabcadefbghicjkldmnoepqrfstugvwxhyz1i234j567k890laabmbccnddeoeffpgghqhiirjjksklltmmnunoovppqwqrrxsstytuuzvvw0wxx1yyz2z113223434455666777889890091abc2def3ghi4jkl5mno6pqr7stu8vwx9yz11aab2bcc3dd4ee5ff6gg7hh8ii9j0jk1kl2lmm3nnoo4p5pq6qrr7ss8tt9uuvv0wwx1x2yyzz13aba4cbcb5dcdc6dedfef8egf9gfh0ghg1ihi2hji3jik4jkj5lkl6kml7mln8mnm9ono
—&gt;

参考文献:

(実際には、再試行した後、http エラーにのみ適用されます。)

于 2013-11-08T13:13:30.633 に答える
2

と(ie)process.phpの 2 つのファイルに分割してみてください。unix os サーバーの下にあると仮定します。process.phpprocess_more.php

のコードprocess.php:

// code to execute before redirect
func1();
func2();
func3();
// code to execute after redirect in background
// you can pass some parameters
$command = "php -f /path/to/process_more.php param1 param2"
exec($command . " > /dev/null &"); 
header('Location: http://dn.tld/');
exit();

$argv変数でパラメーターを使用するには、詳細を参照してください。ユーザーがパラメーター内に別のコマンドを挿入しないように注意してください。

のコードprocess_more.php:

func2();
func3();
func4();

$_GETまたは$_POST変数にアクセスできないわけではありません。call コマンド内で必要な変数を渡す必要があります。

于 2013-11-08T13:45:12.850 に答える