У меня есть эта пользовательская форма. Пользователь будет отправлять данные. Затем с этими данными я хочу отправить эти данные скрипту PHP, который будет работать в фоновом режиме. Причина в том, что сценарий имеет много спальных мест и т. Д., И я не хочу, чтобы пользователь ждал.
Итак, основы моего вопроса: как я могу запустить PHP-скрипт в фоновом режиме и как передать параметр (например, GET)?
Вы можете использовать exec
для запуска фонового скрипта. Используйте что-то вроде
exec('php -f bg_script.php -- '.escapeshellarg($param1).' '.escapeshellarg($param2).' > /dev/null & ');
В вашем скрипте bg.php вы можете получить переданные параметры из массива $argv
Что-то вроде этого будет работать
http://gearman.org/index.php?id=manual:job_server
Но почему у вас так много спит в вашем скрипте?
попробуйте использовать AJAX, это асинхронный javascript и xml, есть простой пример: http://www.w3schools.com/php/php_ajax_intro.asp
в AJAX страница не будет обновляться, и результат будет отправлен JSON или XML.
Как насчет file_get_contents()
с таймаутом.
if (isset($_GET['async'])) { for( $i = 0 ; $i <= 5 ; $i++ ) { append_log(date('l jS \of FY 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 FY 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(); }