php/超时/服务器连接重置?

php/超时/服务器连接重置?,php,mysql,apache,reset,Php,Mysql,Apache,Reset,我有一个php脚本需要运行很长时间 脚本的作用: 连接到mysql 启动100到100000个cURL请求 每个cURL请求返回1到2000个房地产清单的压缩解码数据——我使用preg match all获取所有数据,并为每个清单插入一个mysql。每个查询的数据量从不超过1mb 所以有很多循环、mysql插入和curl请求正在进行。php安全模式已关闭,我能够成功地将最大执行时间设置为荒谬的值,以允许我的脚本一直运行 < >我的问题是脚本或Apache或者在脚本中间有一个笔划,屏幕转到“到

我有一个php脚本需要运行很长时间

脚本的作用:

  • 连接到mysql
  • 启动100到100000个cURL请求
  • 每个cURL请求返回1到2000个房地产清单的压缩解码数据——我使用preg match all获取所有数据,并为每个清单插入一个mysql。每个查询的数据量从不超过1mb
所以有很多循环、mysql插入和curl请求正在进行。php安全模式已关闭,我能够成功地将最大执行时间设置为荒谬的值,以允许我的脚本一直运行

< >我的问题是脚本或Apache或者在脚本中间有一个笔划,屏幕转到“到服务器的连接已经被重置”屏幕。
有什么想法吗?

apache错误日志中有什么?你达到内存限制了吗


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

100000 curl请求???你疯了。把那些数据拆开

很多想法:

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

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

3) 听起来你真的想把它重构成一个更理智的东西。考虑建立一个小型的作业排队系统,并使用一个php脚本,让几个孩子仔细阅读所有的工作

正如Josh所说,看看你的错误日志,看看为什么你现在被关闭。试着找出你正在使用的内存量——这可能是个问题。尝试将最大执行时间设置为零。也许这会让你快速到达你需要的地方


但从长远来看,听起来在一个http请求中要做的工作太多了。把它从http中去掉,然后分而治之

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

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

ini_set('memory_limit', '256M');
作为一个附带提示,不要将执行时间设置为可笑的事情,有可能你最终会找到一种方法,用这样一个脚本来实现这一点

相反,只需将其设置为
0
,其功能相当于完全关闭执行限制:

ini_set('max_execution_time', 0);

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

<>但是你可能也想考虑一下轻微的架构改变。首先考虑一个“启动和忘记”的方法来获得100000个卷曲请求。第二,考虑使用“WGET”而不是卷曲。 您可以发出一个简单的“
wget URL-o UniqueFileName&
”,这将检索一个网页,将其保存到一个“唯一”的文件名,并将其全部保存在后台

然后,您可以迭代文件目录,对数据进行greping(preg_匹配),并进行DB调用。在处理文件时将其移动到存档中,并继续迭代,直到没有更多文件为止

将目录视为一个“队列”,让一个进程只处理文件。有第二个过程,只需出去抓取网页数据。您可以添加第三个进程,它可以是您的“监视器”,它可以独立工作,并且只报告快照统计信息。另外两个可以是没有接口的“web服务”


这种类型的多线程功能非常强大,而且IMHO的利用率非常低。对我来说,这就是网络的真正力量

通过PHP从MySQL获取包含特殊字符(如umlautsä、ö、ü、ampersands等)的数据时,我遇到了同样的问题。连接被重置,我在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'");

对对不起,允许的内存大小为100663296字节(试图分配2975389字节)这听起来可能更不正常,但我不能在整个脚本或脚本的某些部分执行ob_flush/flush吗?@John:不,缓冲区只是正在使用的内存的一部分。cURL函数本身占用了相当多的内存。那么为什么它会将每个请求都保存在内存中呢?当它启动一个新的请求时,它不会在内存中删除旧的请求吗?@John:不会。因为cURL是一个外部库,它使得PHP的内存管理模型很难正确处理。这通常意味着,如果cURL调用未包含在块(类,甚至函数)中,它们将无法正确处理。每次客户端添加新的MLS时,它必须获得1000到10000个列表-我可以在大约5个cURL请求中获得所有列表。。但是我必须对每个列表执行一个cURL请求才能获得它的图像。@John:那么编写一个包含一次检索一项功能的类怎么样。您可以循环所有列表,并为每个列表实例化一次该类,以确保在销毁该类的过程中,cURL内存也会被释放。@John:基本上,您只需要确保您不会反复检索相同的数据,从而在过程中浪费周期和带宽。通过设置某种描述的作业队列,并将检索到的每个页面存储在数据库中,您可以很容易地防止这种情况。这将使脚本运行更长时间,因为现在它执行一个cURL请求登录,然后在循环中执行所有cURL请求,然后执行cURL请求注销。因此,与其登录(循环20次)注销//22 curl请求,它将执行20*3//60 curl请求-您的