このユーザーフォームがあります。ユーザーがデータを送信します。次に、そのデータを使用して、バックグラウンドで実行される PHP スクリプトにそのデータを送信します。理由は、スクリプトに多くのスリープなどがあり、ユーザーを待たせたくないからです。
したがって、私の質問の基本は次のとおりです。PHPスクリプトをバックグラウンドで実行するにはどうすればよいですか?また、パラメータ(GETなど)を渡すにはどうすればよいですか?
このユーザーフォームがあります。ユーザーがデータを送信します。次に、そのデータを使用して、バックグラウンドで実行される PHP スクリプトにそのデータを送信します。理由は、スクリプトに多くのスリープなどがあり、ユーザーを待たせたくないからです。
したがって、私の質問の基本は次のとおりです。PHPスクリプトをバックグラウンドで実行するにはどうすればよいですか?また、パラメータ(GETなど)を渡すにはどうすればよいですか?
このようなものはうまくいくでしょう
http://gearman.org/index.php?id=manual:job_server
しかし、なぜスクリプトにこれほど多くのスリープが含まれているのでしょうか?
AJAX を使用してみてください。非同期の JavaScript と xml です。簡単な例があります: http://www.w3schools.com/php/php_ajax_intro.asp
AJAX ではページは更新されず、結果は JSON または XML で送信されます。
を使用exec
してバックグラウンド スクリプトを実行できます。次のようなものを使用します
exec('php -f bg_script.php -- '.escapeshellarg($param1).' '.escapeshellarg($param2).' > /dev/null & ');
スクリプト bg.php では、渡されたパラメーターを配列から取得できます$argv
file_get_contents()
タイムアウトについてはどうですか。
if (isset($_GET['async'])) {
for( $i = 0 ; $i <= 5 ; $i++ )
{
append_log(date('l jS \of F Y h:i:s A') . ': background process. parameter ' . $i . ': ' . $_GET[$i] . '<br />');
sleep(1);
}
exit;
}
header( 'Content-type: text/html; charset=utf-8' );
$parameters = array('async' => true, 1 => 'one', 2 => 'two', 3 => 'three', 4 => 'four', 5 => 'five');
pseudo_async($parameters); // this runs this php script in the backbround
echo 'Begin ...<br />';
for( $i = 0 ; $i <= 5 ; $i++ )
{
output_buffer('appended to the log <br />');
append_log(date('l jS \of F Y h:i:s A') . ': main process.<br />');
sleep(1);
}
echo 'End ...<br />';
function pseudo_async($query) {
$timeout = array('http' => array('timeout' => 0.01));
$context = stream_context_create($timeout);
@file_get_contents(selfurl() . '?' . http_build_query($query), false, $context);
}
function append_log($msg) {
$file = __DIR__ . '/log.html';
file_put_contents($file, $msg, FILE_APPEND);
}
function selfurl() {
$pageURL = (@$_SERVER["HTTPS"] == "on") ? "https://" : "http://";
if ($_SERVER["SERVER_PORT"] != "80")
$pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
else
$pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
return $pageURL;
}
function output_buffer($str) {
echo $str;
flush();
ob_flush();
}