У меня есть небольшая проблема с запуском php-скрипта в фоновом режиме.
У меня есть моя область администрирования, которая имеет HTTP-аутентификацию для доступа и сценарий отправки почты, который я хочу запустить в фоновом режиме. Этот сценарий займет много времени, поэтому я хочу, чтобы он выполнялся в фоновом режиме.
Моя идея – когда я обращаюсь к странице «Отправить», она выполняет сценарий отправки в фоновом режиме и перенаправляет пользователя в другое место.
Однако в настоящее время, пытаясь использовать cURL, я не могу cURL в сценарий отправки, поскольку он возвращает требуемую авторизацию.
Любые советы оценили, спасибо.
Вы можете попробовать 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.