PHP:生产服务器上内存使用量很高,而本地机器上内存使用量很低

4
我创建了一个PHP脚本,从网站上爬取一些特定的数据,查找相关信息并将其存储在数据库中。该脚本在本地机器上运行良好,但当我在使用cron job运行它的生产服务器上运行它时,在进行10个数据库插入后停止,并报错:
"Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 35 bytes) in /home/content/36/78632936/html/scripts/simple_html_dom.php on line 809"
我使用get_memory_peak_usage()在本地上检查了相同的脚本,最大使用量约为8 MB。
我很困惑为什么在生产环境中内存使用率非常高。任何帮助将不胜感激。
我的代码简述如下:
DB_table1:包含60000行数据的列表
主要代码开始调用DB1并获取数据,然后使用每行数据形成一个URL。每个URL都将使用simple_html_dom()函数进行抓取,脚本将在每个页面上查找一些特定的信息,并将这些数据存储在另一个表DB_table2中。
如果您需要了解其他内容,请告诉我。谢谢 :)

1
现场服务器和本地服务器正在使用什么操作系统、php版本和mysql版本? - gnur
你正在运行最新版本的PHP吗? :) - dan
2
只要我们不看到simple_html_dom.php文件中809行(以及上下几行,最好是整个代码块),这就是一个愉快的猜测。 - ty812
你是先爬取整个网站再开始插入数据吗?还是边爬边插入? - Quamis
我刚刚注意到.. 我的生产服务器使用的是 PHP 版本 5.2,而我的本地主机则是 5.3.1 .. 这可能是造成这种差异的唯一原因吗? - ankit
2个回答

0

更新:
查看php变更日志,有很多内存问题得到了解决。如果您在使用PHP 5.2中存在泄漏的部分,那么可能会导致这种情况发生。如果您想确定,请尝试使用memory_get_usage包装代码中占用大量内存的部分,并查看内存使用情况之间是否存在差异。


问题/答案:

afuzzyllama: 你的生产环境和本地环境一样吗?可能你的生产数据库比沙盒中的数据多很多。

user743914: 不幸的是我之前没有注意到这个差异,我的生产服务器运行的是php版本5.2,而我的本地主机是在5.3.1上...生产数据库与本地主机的数据量相同...


简单解决方案:
您的服务器允许的最大内存限制是多少?

php.net上搜索“memory_limit”。

正如文档中所述,根据您的PHP版本,您的限制可能低至8MB。我猜测您的限制目前设置为约64M,因为您的脚本在约67MB时失败。

如果您需要暂时提高它,可以使用ini_set()或在php.ini文件中设置并重新启动服务器。


非常感谢您的输入...不幸的是,我之前没有注意到这个区别,我的生产服务器正在运行php版本5.2,而我的本地主机是在5.3.1上...生产数据库与本地主机具有相同数量的数据...版本差异可以是内存使用差异的唯一原因吗?我在每个可能的步骤都使用unset。 - ankit

0

在使用 while/foreach 循环后,不要忘记使用 unset() 来清理不再需要的(DB)结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接