我有一个需要运行一段时间的PHP脚本。
脚本的作用:
因此有很多循环,mysql插入和curl请求正在进行。 php安全模式已关闭,我能够成功地将最大执行时间设置为荒谬的,以允许我的脚本一直运行。
好吧,我的问题是脚本或apache或脚本中间有一个笔划,屏幕进入“已重置服务器连接”屏幕。
有什么想法吗?
答案 0 :(得分:4)
好吧,无视尝试100,000个cURL请求是绝对疯狂的事实,你可能会达到内存限制。
尝试将内存限制设置为更合理的内容:
ini_set('memory_limit', '256M');
作为一个侧面提示,不要将执行时间设置为荒谬的事情,很可能你最终会找到一种方法用这样的脚本来达到目的。 ]
相反,只需将其设置为0
,它在功能上等同于完全关闭执行限制:
ini_set('max_execution_time', 0);
答案 1 :(得分:3)
很多想法:
1)不要在HTTP请求中执行此操作。编写一个命令行php脚本来驱动它。如有必要,您可以使用Web绑定脚本将其启动。
2)您应该能够将max_execution_time设置为零(或调用set_time_limit(0))以确保您不会因超出时间限制而关闭
3)听起来你真的想把它重构为更健全的东西。考虑建立一个小的工作排队系统,并有一个PHP脚本,让几个孩子咀嚼所有的工作。
正如Josh所说,看看你的error_log,看看为什么你现在被关闭了。试着弄清楚你正在使用多少内存 - 这可能是一个问题。尝试将max_execution_time设置为零。也许这会让你快速到达需要的地方。
但从长远来看,听起来你在一个http请求中有太多的工作要做。把它从http中拿出来,分而治之!
答案 2 :(得分:1)
您可以通过修改PHP.ini并设置脚本执行变量来将超时设置为不确定。
但您可能还想考虑轻微的架构更改。首先考虑“启动并忘记”方法来获得100,000个卷曲请求。其次,考虑使用“wget”而不是curl。
您可以发出一个简单的“wget URL -o UniqueFileName &
”这将检索一个网页,将其保存为“唯一”文件名,并且全部保存在后台。
然后,您可以迭代文件目录,greping(preg_matching)数据,并进行数据库调用。在将文件处理为存档时移动文件并继续迭代直到没有更多文件。
将目录视为“队列”,并让一个进程只处理文件。有第二个过程只是出去抓取网页数据。您可以添加第三个可以“监视”的进程,该进程可以独立工作,只需报告快照统计信息。另外两个可以是没有界面的“Web服务”。
这种类型的多线程功能非常强大,而且恕我直言也未充分利用。对我而言,这是网络的真正力量。
答案 3 :(得分:1)
通过PHP从MySQL获取数据时遇到了同样的问题,其中包含特殊字符,如umlautsä,ö,ü,&符号等。连接已重置,我发现apache日志和php日志都没有错误。首先,我在PHP中确保使用以下方法正确访问了DB上设置的字符:
mysql_query("SET NAMES 'latin1' COLLATE 'latin1_german2_ci'");
mysql_query("SET CHARACTER SET 'latin1'");
Then, finally, I resolved the problem with this line in PHP:
mysql_query("SET character_set_connection='latin1'");
答案 4 :(得分:0)
apache error_log中有什么?你达到了内存限制吗?
编辑:看起来你达到了内存限制。你有权访问PHP.ini吗?如果是,请can raise the memory_limit there。如果没有,请尝试使用exec
或shell_exec
函数运行curl或wget二进制文件,这样它们就可以作为单独的进程运行,而不是使用PHP的内存。
答案 5 :(得分:0)
100,000 cURL请求???你疯了。打破这些数据!