5

我有一个需要运行相当长一段时间的 php 脚本。

脚本的作用:

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

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

好吧,我的问题是脚本或 apache 或脚本中间有中风,屏幕转到“与服务器的连接已重置”屏幕。

有任何想法吗?

4

6 回答 6

4

好吧,不管尝试 100,000 个 cURL 请求绝对是疯狂的事实,您可能已经达到了内存限制。

尝试将内存限制设置为更合理的值:

ini_set('memory_limit', '256M');

作为一个小提示,不要将执行时间设置为荒谬的,你最终可能会找到一种方法来使用这样的脚本来实现它。;]

相反,只需将其设置为0,它在功能上等同于完全关闭执行限制:

ini_set('max_execution_time', 0);
于 2009-10-22T22:59:01.410 回答
3

很多想法:

1) 不要在 HTTP 请求中执行此操作。编写一个命令行 php 脚本来驱动它。如有必要,您可以使用网络绑定脚本来启动它。

2)您应该能够将 max_execution_time 设置为零(或调用 set_time_limit(0))以确保您不会因超过时间限制而被关闭

3)听起来您真的想将其重构为更理智的东西。考虑设置一个小作业排队系统,并有一个 php 脚本分叉几个孩子来仔细研究所有的工作。

正如 Josh 所说,查看您的 error_log 并了解您现在被关闭的原因。试着弄清楚你正在使用多少内存——这可能是个问题。尝试将 max_execution_time 设置为零。也许这会让你快速到达你需要的地方。

但从长远来看,听起来你在一个 http 请求中要做的工作太多了。把它从http中拿出来,分而治之!

于 2009-10-22T22:54:17.190 回答
1

当通过 PHP 从 MySQL 获取包含特殊字符(如元音变音符号 ä、ö、ü、& 符号等)的数据时,我遇到了同样的问题。连接已重置,我在 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'");
于 2012-02-16T14:00:28.220 回答
1

您可以通过修改 PHP.ini 并设置脚本执行变量来将超时设置为不确定。

但是您可能还需要考虑对架构进行轻微的更改。首先考虑获取 100,000 个 curl 请求的“启动后忘记”方法。其次,考虑使用“wget”而不是 curl。

您可以发出一个简单的“ wget URL -o UniqueFileName &”,这将检索一个网页,将其保存为一个“唯一”文件名并在后台进行。

然后,您可以遍历文件目录、greping (preg_matching) 数据并进行数据库调用。在处理文件时将它们移动到存档并继续迭代,直到没有更多文件为止。

将目录想象成一个“队列”,让一个进程只处理文件。让第二个进程简单地出去获取网页数据。您可以添加第三个进程,它可以作为您的“监控器”,它独立工作并简单地报告快照统计信息。其他两个可以只是没有接口的“Web 服务”。

恕我直言,这种类型的多线程确实非常强大且未被充分利用。对我来说,这就是网络的真正力量。

于 2009-10-22T22:59:57.900 回答
0

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

于 2009-10-22T22:52:50.640 回答
0

apache error_log 中有什么内容?你达到内存限制了吗?

编辑:看起来您已达到内存限制。您可以访问 PHP.ini 吗?如果是这样,您可以在那里提高 memory_limit。如果没有,请尝试使用execorshell_exec函数运行 curl 或 wget 二进制文件,这样它们将作为单独的进程运行,而不是使用 PHP 的内存。

于 2009-10-22T22:48:50.893 回答