结束cURL请求

时间:2010-10-29 21:28:43

标签: php curl http-headers

我正在尝试制作一种PHP机器人。这个想法是必须有php文件,名为a.php和b.php。 a.php做某事,然后睡30秒,调用b.php,b.php结束Http请求,做一些处理,然后调用a.php,结束Http请求,依此类推。

现在唯一的问题是如何结束使用cURL制作的Http reqest。我已经尝试过以下代码:

<?php
ob_end_clean();
header("Connection: close");
ignore_user_abort(); // optional
ob_start();
echo ('Text the user will see');
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush();     // Will not work
flush();            // Unless both are called !

// At this point, the browser has closed connection to the web server

// Do processing here
echo('Text user will never see');

轻微的问题是它不起作用,我实际上看到“文本用户永远不会看到”。我已经尝试过cron jobs等,但主持人不允许这样做。我也无法发送脚本超时限制。所以我唯一的选择是创建重复的PHP脚本。那我怎么发送Http请求呢?

2 个答案:

答案 0 :(得分:1)

基于对您的问题的新理解。您正在创建一个每30秒检查一次远程URL以监视内容片段的系统。为此,我建议使用CRON,如果您的主机不允许,可以是基于服务器的http://en.wikipedia.org/wiki/Cron或基于Web的:http://www.webbasedcron.com/(示例)。

答案 1 :(得分:0)

在这种情况下,PHP脚本在Web服务器请求的上下文中运行,因此您无法停止与Web连接通信,然后继续执行操作,这是我认为您尝试使用连接关闭的操作。

您最终看到输出的原因是因为在脚本结束时,PHP将调用隐式刷新(请参阅手册中的ob_implicit_flush),但是通过结束PHP脚本来关闭与浏览器的连接。

围绕这个方法:

您可以使用set_time_limit来扩展执行限制。不要使用零。在后期处理脚本上说“花费你所有需要的时间”很诱人,但这种方式就是疯狂和苦涩的系统管理员,还记得你还在运行curl的超时秒表(尽管你可以将它作为一个选项扩展)。 set_time_limit(5)会给你五秒钟,所以定期这样做可以让你进行后期处理但是 - 如果你小心 - 仍然可以保护你免受无限循环的影响。在apache请求的上下文中没有执行限制的Infinate循环也可能使您不受系统管理员的欢迎。

可以在应用程序中构建一个shell脚本,将其保存到磁盘,在后台执行 并在之后删除它。这样它将在Web请求上下文之外运行,如果下次执行请求时脚本仍然存在,您可以知道其他处理仍在进行中。要非常小心可能需要比执行间隔差距更长的事情,因为这会导致悲伤和更痛苦的系统管理员。如果你没有先与我谈论它,这个行动方案会让你抛弃我的托管环境,因为这是一个可怕的黑客,有无数可能的安全问题。

但您似乎试图在他们不希望您这样做的系统上运行常规批处理 - 或者他们已经让您访问cron - 所以您最好和最可靠的方法是查找一个真正支持你想要做的事情的主持人。