我正在尝试构建一个可靠的邮件系统,这会给我带来麻烦,而且通常不太可靠。
我目前有一个专用服务器,它有几个php脚本设置,用于添加邮件,使用PEAR mail_queue发送到MySQL数据库,另一个使用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,并返回状态和任何无效的电子邮件。我想在MySQL数据库中添加600多封电子邮件需要做很多工作。
非常感谢任何帮助。
答案 0 :(得分:0)
理论上,你可能会分叉(虽然我不确定它是否在CLI之外工作)。然而,即使它确实有效,它可能会比它的价值更麻烦,因为如果你在Apache下运行,你几乎无法调试。因此,最好的选择可能是序列化您需要传递的任何数据,将其转储到文件中,然后使用exec()调用另一个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将基本上包含原始脚本中的代码,其中包含有关读取前缀的序列化数据的信息。