【问题标题】:Using cURL for a large request使用 cURL 处理大型请求
【发布时间】:2011-02-03 20:14:53
【问题描述】:

我正在尝试构建一个可靠的邮件系统,这给我带来了一些麻烦,而且通常不是很可靠。

我目前有一个专用服务器,它有几个 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 并返回状态和任何无效电子邮件。我想将 600 多封电子邮件添加到 MySQL 数据库中需要做很多工作。

任何帮助将不胜感激。

【问题讨论】:

  • 该 cURL 请求是否应该启动一个远程脚本,进而发送邮件?无论如何,cURL 函数本身不能启动后台进程。您可能会遇到类似exec("nohup curl http://www/ &") 这样的好运来开始一项无人看管的副业。
  • 感谢您的回复。 cURL 请求是用要发送的邮件填充数据库 - 然后使用 cron 作业每隔一段时间发送电子邮件以帮助减少 smtp 服务器上的负载 - 这是问题的一部分。我得看看 exec() 看看它是否有助于后台进程。

标签: php curl pear


【解决方案1】:

理论上,您可能会分叉(尽管我不确定它是否适用于 CLI)。然而,即使这确实有效,它也可能比它的价值更麻烦,因为如果你在 Apache 下运行你几乎无法调试这个东西。所以你最好的选择可能是序列化你需要传递的任何数据,将其转储到一个文件中,然后使用 exec() 调用另一个 php 脚本,然后处理序列化的数据并异步执行其余的魔法。当然,脚本调用必须将其推送到后台,并且您必须传递包含序列化数据的文件的名称。

粗略的骨架看起来像这样:

$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 基本上包含原始脚本中的代码,并在其前面加上一些关于读取序列化数据的信息。

【讨论】:

    猜你喜欢
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 2014-03-18
    • 2016-07-06
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多