2011-02-03 2 views
1

Я пытаюсь создать надежную почтовую систему, которая вызывает у меня некоторые проблемы и, как правило, не очень надежна.Использование cURL для большого запроса

В настоящее время у меня есть выделенный сервер, в котором есть пара настроек скриптов php для добавления писем, отправляемых в MySQL db с использованием PEAR mail_queue, а другой для отправки их с использованием PEAR и задания cron. Все это хорошо работает.

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

Информационный бюллетень настраивается и отправляется с панели администратора на бэкэнд сайта, хранящейся на общем сервере. Когда нажата кнопка отправки бюллетеня, она отправляет запрос cURL на выделенный сервер, чтобы заполнить db. Однако при отправке информационного бюллетеня с более 600 подписчиками весь сайт останавливается, и он не возвращается, пока процесс не завершится - что он, по крайней мере, сделает.

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

Вот код:

$hCurl = curl_init(); 

$curl_options = array(CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_URL => "http://DOMAIN/PATH/SCRIPT", CURLOPT_POSTFIELDS => "VARIABLE TO SEND"); 

curl_setopt_array($hCurl, $curl_options); 

$sResp = curl_exec($hCurl); 
curl_close($hCurl); 

скрипт это работает добавляет абонентов к mail_queue после проверки они действительные электронные письма и возвращает статус и недопустимые сообщения электронной почты. Я предполагаю, что добавление 600+ писем в MySQL db - это большая работа для этого.

Любая помощь была бы принята с благодарностью.

+0

Этот запрос cURL должен запускать удаленный скрипт, который по очереди отправляет письма? Функции cURL в любом случае сами не могут инициировать фоновый процесс. Возможно, вам повезло с чем-то вроде 'exec (« nohup curl http: // www/& »)' для запуска автономного бокового задания. – mario

+0

спасибо за ответ. запрос cURL должен заполнить db почтой для отправки - электронные письма затем отправляются через интервалы с помощью задания cron, чтобы уменьшить нагрузку на SMTP-сервер, что было одной из проблем. Мне нужно взглянуть на exec(), чтобы узнать, поможет ли это фоновому процессу. – andyface

ответ

0

В теории, возможно, вы можете использовать fork (хотя я не уверен, что работает вне CLI). Однако, даже если бы это сработало, это, вероятно, было бы более сложным, чем это стоит, потому что вы вряд ли могли отлаживать эту вещь, если вы работаете под Apache. Поэтому лучше всего будет сериализовать все данные, которые вам нужно передать, выгрузить их в файл и вызвать другой php-скрипт с exec(), который затем обрабатывает сериализованные данные и выполняет асинхронную обработку остальной части магии. Разумеется, вызов сценария должен был вытолкнуть его в фоновом режиме, и вам нужно будет передать имя файла, содержащего сериализованные данные.

Сырой скелет будет выглядеть примерно так:

$fname=tempnam("/tmp","curl_"); 
$fp=fopen($fname,'w'); 
fputs($fp,serialize("VARIABLE TO SEND")); 
fclose($fp); 
exec("php do_the_curly.php $fname &"); 

где do_the_curly.php бы Bascially содержать код в оригинальном сценарии, с немного о чтении сериализованные данных предваряется к нему.

Смежные вопросы