php / timeout /连接服务器重置?

时间:2009-10-22 22:43:22

标签: php mysql apache reset

我有一个需要运行一段时间的PHP脚本。

脚本的作用:

  • 连接到mysql
  • 启动100到100,000 cURL请求
  • 每个cURL请求返回1到2000个房地产列表的紧凑解码数据 - 我使用preg-match-all获取所有数据并在每个列表中执行一次mysql插入。每个查询永远不会超过1mb的数据。

因此有很多循环,mysql插入和curl请求正在进行。 php安全模式已关闭,我能够成功地将最大执行时间设置为荒谬的,以允许我的脚本一直运行。

好吧,我的问题是脚本或apache或脚本中间有一个笔划,屏幕进入“已重置服务器连接”屏幕。

有什么想法吗?

6 个答案:

答案 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。如果没有,请尝试使用execshell_exec函数运行curl或wget二进制文件,这样它们就可以作为单独的进程运行,而不是使用PHP的内存。

答案 5 :(得分:0)

100,000 cURL请求???你疯了。打破这些数据!