Запуск php-скрипта в фоновом режиме без завитки

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

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

Моя идея – когда я обращаюсь к странице «Отправить», она выполняет сценарий отправки в фоновом режиме и перенаправляет пользователя в другое место.

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

Любые советы оценили, спасибо.

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

Вы можете попробовать 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 

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 является PHP_PATH , определенной как define('PHP_PATH', '/opt/bin/php5') или аналогичный)

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

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

Вы пытались отправить auth в 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); 

РЕДАКТИРОВАТЬ

FWIW это похоже на то, что cURL, вероятно, является неправильным инструментом, но он не должен быть дисконтирован из-за проблем с auth

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

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

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

Версия 1:

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

Версия 2:

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