Запуск php-скрипта в фоновом режиме без скручивания - PullRequest
3 голосов
/ 19 июля 2010

У меня небольшие проблемы с запуском php-скрипта в фоновом режиме.

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

Моя идея заключается в том, что, когда я захожу на страницу отправки, он выполняет сценарий отправки в фоновом режиме и перенаправляет пользователя в другое место.

Однако в настоящее время я пытаюсь использовать cURL. Я не могу войти в скрипт отправки, так как он возвращает требуемую авторизацию.

Любой совет приветствуется, спасибо.

Ответы [ 7 ]

4 голосов
/ 19 июля 2010
  1. Создать некоторую очередь заданий (база данных / файлы / запись непосредственно в какой-либо сокет).
  2. Создайте задание deamon (socket) или cron, которое будет использовать эти задания.
  3. Позвольте работнику сообщать, когда задача выполняется в каком-то хранилище, если это необходимо (база данных / файл / и т. Д.), Если вы хотите предоставить сообщение об «успехе» (или неудаче) позже.
1 голос
/ 20 июля 2010

cURL имеет опции для HTTP-аутентификации ...

Но для сохранения HTTP-запроса ... вот функция, которую я использую для асинхронного выполнения локального PHP ...

/** 
 * Asynchronously execute/include a PHP file. Does not record the output of the file anywhere.  
 * Relies on the PHP_PATH config constant.
 *
 * @param string $filename  file to execute
 * @param string $options   (optional) arguments to pass to file via the command line
 */ 
function asyncInclude($filename, $options = '') {
    exec(PHP_PATH . " -f {$filename} {$options} >> /dev/null &");
}

(где PHP_PATH - это константа, определенная как define('PHP_PATH', '/opt/bin/php5') или аналогичная)

Передает аргументы через командную строку.Чтобы прочитать их в PHP, смотрите argv .

1 голос
/ 20 июля 2010

Вы можете попробовать pcntl_fork () , если вы используете его в Linux. Обратите внимание, что этот подход требует некоторой магии в части установки PHP (pcntl по умолчанию отключен для cgi) и еще больше магии, чтобы заставить ваш скрипт пережить очистку процесса apache. Смотрите комментарий на PHP, чтобы начать работу.

Таким образом, отмена процесса будет выглядеть так:

if ($pid = pcntl_fork())
    die();     // Parent

function shutdown() {
    posix_kill(posix_getpid(), SIGHUP);
}

ob_end_clean(); // Discard the output buffer and close

fclose(STDIN);  // Close all of the standard
fclose(STDOUT); // file descriptors as we
fclose(STDERR); // are running as a daemon.

register_shutdown_function('shutdown');

if (posix_setsid() < 0)
    die();      // <- This is an error

if ($pid = pcntl_fork())
    die();     // Parent

// Do your stuff here
0 голосов
/ 20 июля 2010

Некоторые - другие-- вещи, которые следует учитывать .... мы делаем много рассылок, как вы описали, по крайней мере, 10 КБ / неделю, с пакетами по 20 КБ / день.Наш работает на Cron (регулярно запускается через систему, что замечательно для нашего приложения). Если вы не поставите какой-то газ в свой сценарий, это в конечном итоге истечет, и ваше почтовое задание застрянет без перезапуска,где-то на полпути.Наш тайм-аут и перезапускается после определенного числа, отслеживая путем записи прогресса в базу данных.Из-за частоты работы почтовой программы и неизвестной продолжительности работы мы также используем файл блокировки, который предотвращает двойную отправку одновременных почтовых программ.

Если ваша электронная почта будет приближаться к 15 КБ / пакет, я бы порекомендовал проверитьразмещенное SMTP-решение: http://smtp.com или http://www.socketlabs.com/ Поставьте их в очередь на свой сервер и отправьте через SMTP-ретранслятор для обеспечения надежной доставки.

Независимо от того, сколько писем вы отправляете, незабыть о соответствии CAN-Spam!

0 голосов
/ 19 июля 2010

Версия 1:

system('php your_script &'); - & отправит выполнение в фоновом режиме.

Версия 2:

Не требуйте аутентификации для вашего скрипта, и вы сможете использовать cURL.

0 голосов
/ 19 июля 2010

Из вашего вопроса я понимаю, что у вас есть PHP-скрипт, который запускает другой PHP-скрипт.Вам не нужно использовать CURL для этого, вместо этого просто запустите ваш PHP-скрипт асинхронно .

0 голосов
/ 19 июля 2010

Вы пытались отправить аутентификацию в cURL?

Может быть простым http://user:pass@www.domain.com

или что-то вроде:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
$output = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);

EDIT

Похоже, что cURL, вероятно, не тот инструмент, но его нельзя сбрасывать со счетов из-за проблем с аутентификацией

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...