结束卷曲请求
我试图做一个排序PHP BOT的。这个想法是必须要php文件,名为a.php和b.php。 a.php做一些事情,然后睡30秒,调用b.php,b.php结束Http请求,做一些处理,然后调用一个结束Http请求的.php,等等。现在结束卷曲请求
唯一的问题是如何结束的Http传请求,使用卷曲发。我用尽下面这段代码:
<?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作业等,但主机不允许它。我无法发送脚本超时限制。所以我唯一的选择是创建重复的PHP脚本。那么我将如何发送Http请求?根据你的问题的新认识
。您正在创建一个系统,每隔30秒检查一次远程URL以监控内容片段。为此,我推荐一个CRON,它可以是基于服务器的:http://en.wikipedia.org/wiki/Cron或基于Web的,如果您的主机不允许它:http://www.webbasedcron.com/(示例)。在这种情况下
退出关闭脚本。我想要做的是结束两个脚本之间的连接,因此一个脚本不必等待另一个脚本完成,否则我将创建一个无限循环。我没有试图关闭脚本,只是结束它的输出,并让浏览器知道在脚本继续处理时关闭它的连接。我无法使用无限的while循环/ goto循环,php脚本有30秒的超时限制,由我的主机设置。 – LostInTheCode 2010-10-29 22:27:11
我使用Google App Engine遇到了类似的问题,它只有30秒的窗口。现在从脚本转换到脚本可能会计入相同的请求中。你有没有想过使用:http://en.wikipedia.org/wiki/Meta_refresh在脚本之间导航。 – 2010-10-29 22:40:14
那么,这需要某种客户端来运行它,每隔一段时间重新加载页面。我正在尝试创建一个自动系统,以便每30秒自动记录一次网站上的号码,只能从我的服务器上记录。 – LostInTheCode 2010-10-29 22:44:29
PHP脚本的上下文中运行,如果Web服务器的请求,因此你不能停止谈论到网络连接,然后继续做的东西,这是我认为你正在试图做的连接关闭。
您在最后看到输出的原因是因为在脚本的末尾PHP将调用隐式刷新(请参阅手册中的ob_implicit_flush),但通过结束PHP脚本来关闭与浏览器的连接。
方式解决此问题:
你也许能够使用的set_time_limit延长执行限制。不要使用零。人们很容易说“把你需要的所有时间”在后处理脚本,但出路在于疯狂和痛苦的系统管理员,加上记得你还在上卷曲的超时秒表运行(尽管你可以扩展为一个选项)。 set_time_limit(5)会再给你五秒钟的时间,所以定期做这些事情可以让你做后期处理,但是如果你小心的话,仍然可以保护你免受无限循环的影响。在Apache请求的上下文中没有执行限制的infinate循环也可能使你不受系统管理员欢迎。
在应用程序中构建一个shell脚本,将其保存到磁盘,在后台执行即,然后在后台删除它自己。这样它将在Web请求上下文之外运行,并且如果在下一次执行请求时该脚本仍然存在,则可以知道其他处理仍在进行。要小心处理可能需要比处决之间的差距更长的事情,因为这样会导致悲伤和更苦的系统管理员。如果你这样做了,那么这个过程就会让你摆脱我的托管环境,尽管它没有先与我谈论它,因为这是一个带有无数可能的安全问题的可怕黑客攻击。
但是你似乎试图在一个他们不想让你这么做的系统上运行常规的批处理过程 - 或者他们会让你访问cron--所以你最好也是最可靠的方法是找到一个真正支持你想要做的事情的主机。
伟大的一套想法。我一定会考虑所有这些。 – LostInTheCode 2010-10-30 14:43:46
我看不出卷曲参与。此外,如果您的主机发现您正在使两个PHP脚本在循环中互相呼叫,您的主机将非常不高兴。 – kijin 2010-10-29 22:03:18
我不知道为什么连接应该在此时关闭,浏览器已关闭连接到Web服务器。现在我重读了你的问题,为什么你不试图关闭连接把数据放在一个数据库中,并有一个单独的线程(脚本)执行作业。 asp.net是我更好的。它不好使用php – 2010-10-29 22:14:43
cURL用于在脚本之间发送请求。我不允许在服务器上执行脚本*叹息* – LostInTheCode 2010-10-29 22:25:33