Запуск PHP-кода в фоновом режиме с параметрами

У меня есть эта форма пользователя. Пользователь отправит данные. Затем с этими данными я хочу отправить эти данные в PHP-скрипт, который будет работать в фоновом режиме. Причина в том, что в сценарии много снов и т. Д., И я не хочу заставлять пользователя ждать.

Итак, основы моего вопроса: как я могу запустить PHP-скрипт в фоновом режиме и как я могу передать ему параметр (например, GET)?

4 ответа

Решение

Ты можешь использовать exec запустить свой фоновый скрипт. Используйте что-то вроде

exec('php -f bg_script.php -- '.escapeshellarg($param1).' '.escapeshellarg($param2).' > /dev/null & ');

В вашем скрипте bg.php вы можете получить переданные параметры из массива $argv

Примерно так будет работать

http://gearman.org/index.php?id=manual%3Ajob_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 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(); 
}
Другие вопросы по тегам