Использование cURL для большого запроса - PullRequest
1 голос
/ 03 февраля 2011

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

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

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

Информационный бюллетень настроен и отправлен сПанель администратора на бэкенде сайта, размещенная на общем сервере.При нажатии кнопки «Отправить новостную рассылку» она отправляет запрос cURL на выделенный сервер для заполнения БД.Однако при отправке бюллетеня с более чем 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 - большая работа для этого.

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

1 Ответ

0 голосов
/ 04 февраля 2011

Теоретически, вы могли бы, вероятно, разветвиться (хотя я не уверен, что это работает вне 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 в основном содержал бы код в вашем оригинальном скрипте с добавлением бит о чтении сериализованных данных.

...