忽略cURL响应?

时间:2011-01-02 17:19:12

标签: php

我有一个登录脚本,可以将数据传递到另一个脚本进行处理。该处理与登录脚本无关,但它进行了一些数据检查和记录以进行内部分析。

我正在使用cURL传递此数据,但cURL正在等待响应。我不想等待响应,因为它导致用户必须在分析完成之前等待才能登录。

我知道请求可能会失败,但我并不过分担心。

我基本上希望它像多线程应用程序一样工作,其中cURL用于分叉进程。有没有办法做到这一点?

我的代码如下:

// Log user in

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,'http://site.com/userdata.php?e=' . $email);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$html = curl_exec($ch);
curl_close($ch);

// Redirect user to their home page

尽管如此。但目前它必须等待cURL请求得到响应。

有没有办法提出get请求而不是等待响应?

4 个答案:

答案 0 :(得分:4)

你不需要卷曲。只需打开一个套接字并触发手动HTTP请求,然后关闭套接字即可。这也很有用,因为您可以使用自定义用户代理,以免扭曲您的日志记录。

有关示例,请参阅this answer

显然,它不是“真正的”异步/分叉,但它应该足够快。

答案 1 :(得分:2)

我最喜欢马特的想法,但要加快你的要求 a)只是提出一个明显更快的头请求(CURLOPT_NOBODY)(没有响应主体) 要么 b)只是将请求时间限制设置得非常低,但是我猜你应该测试请求的中止是否真的更快到只有HEADING

答案 2 :(得分:0)

另一种可能性:由于显然不需要立即进行分析,为什么要立即进行分析?如果您的提供者允许cron作业,只需让curl调用的脚本在数据库或文件中快速存储传递的数据,并让cron作业每分钟或每小时或每天执行一次处理脚本。或者,如果您不能这样做,请设置您自己的本地计算机以定期运行调用处理存储数据的远程脚本的脚本。

答案 3 :(得分:0)

令我感到震惊的是,你所描述的是一个队列。您希望启动一系列脱机处理作业,并独立于用户交互处理它们。有很多系统可以做到这一点,不过我特别推荐beanstalkd在PHP中使用pheanstalk。它比cron作业更可靠和可控(例如,在发生故障时管理重试),并且在多个服务器之间分配处理也非常容易。

相当于调用URL而忽略响应是在'tube'中创建一个新作业。它解决了你的特殊问题,因为它会或多或少地立即返回,并且没有任何反应机构可以说。

在处理端,您不需要exec - 在无限循环中运行CLI脚本,该循环从队列中请求作业并处理它们。

您还可以查看ZeroMQ

总的来说,这与GZipp建议的并没有什么不同,它只是使用专为此操作模式设计的系统。

如果您的限制性ISP不允许您运行其他软件,则可能需要找到新的ISP - 亚马逊AWS将为您提供一年免费的EC2微型实例。