Запустите php файл из php в качестве фонового процесса без exec () - PullRequest
1 голос
/ 24 февраля 2012

Я хочу запустить PHP-скрипт в фоновом режиме, используя другой PHP-скрипт.

Я имел в виду это:

exec('/usr/bin/php background.php &');

Мой веб-хост отключил только доступ к exec ().

Единственный другой способ, которым я могу придумать, - это отправлять почту () на сервер пересылки электронной почты, который передается в сценарий, но это скорее дурацкий обходной путь, чем решение.

Кто-нибудь знаетлюбое решение?

Ответы [ 2 ]

5 голосов
/ 24 февраля 2012

Этого можно добиться, используя curl и загрузив скрипт как веб-ресурс, чтобы его можно было выполнить.Если этот скрипт необходимо защитить от публичного доступа, вы можете проверить, поступил ли запрос с того же сервера:

if( $_SERVER['SERVER_NAME'] != 'localhost' 
        || $_SERVER['REMOTE_ADDR'] != '127.0.0.1'
        || stripos( $_SERVER['HTTP_USER_AGENT'], 'wget' )===false
        )
{
    // Access Denied!!
    die();
}

Обязательно сделайте асинхронный запрос с curl, поэтому, если скрипт занимает много временичтобы выполнить, не вешает исходный пользовательский запрос (используйте curl_setopt( $handle, CURLOPT_HEADER, false );

Таким образом, план со страницы, где вы знаете, что нужно выполнить сценарий, запустите запрос Http к сценарию (этоочень простой пример использования библиотеки curl):

$handle = curl_init();
curl_setopt( $handle, CURLOPT_URL, 'http://localhost/your_script.php');
curl_setopt( $handle, CURLOPT_HEADER, false );
curl_exec( $handle );
curl_close( $handle );

Затем в своем сценарии используйте приведенный выше сценарий для защиты запросов, не поступающих с текущего сервера, и выполните задание.

Обновлено
Как указано в этом вопросе: отправка неблокирующего HTTP-запроса POST В своем задании сценария вы можете отправить этот заголовок, чтобы закрыть соединение во время выполнения сценария:

// Send the response to the client
header('Connection: Close');
// Do the background job: just don't output anything!

Обновлено II
Анализируя мой собственный ответ, я проверил, что curl_setopt( $handle, CURLOPT_HEADER, false ); не создает асинхронный запрос. Я до сих пор не нашел, как это сделать.

1 голос
/ 24 февраля 2012

Я не проверял это, но если вы можете использовать curl, вы можете создать background.php с ignore_user_abort() и свернуть его из основного скрипта с небольшим временем ожидания. Сценарий, который видит пользователь, будет немного задержан, потому что он должен ждать истечения времени ожидания запроса curl, но ваш фон должен продолжать работать.

...