如何在脚本完成后强制PHP释放内存

如何在脚本完成后强制PHP释放内存,php,mysql,memory,Php,Mysql,Memory,我有一个资源密集型脚本,大约需要30分钟才能完成。随着其运行,它逐渐消耗RAM。一旦完成,它已经消耗了大约300mb。我需要运行这个脚本多次,所以这是一个问题。每当我想再次开始运行脚本时,我必须重新启动服务器,因为ram使用率达到100%,并且脚本暂停 如何强制php或mysql释放内存? PHP版本5.4.29 Centos副总裁 2GB内存 php脚本的最大内存设置为512mb 该脚本进行大量SQL查询。应该是1000。它还50次调用5个不同的API。它从一个db表中选择50行并在其中循环,

我有一个资源密集型脚本,大约需要30分钟才能完成。随着其运行,它逐渐消耗RAM。一旦完成,它已经消耗了大约300mb。我需要运行这个脚本多次,所以这是一个问题。每当我想再次开始运行脚本时,我必须重新启动服务器,因为ram使用率达到100%,并且脚本暂停

如何强制php或mysql释放内存? PHP版本5.4.29 Centos副总裁 2GB内存 php脚本的最大内存设置为512mb

该脚本进行大量SQL查询。应该是1000。它还50次调用5个不同的API。它从一个db表中选择50行并在其中循环,调用API等来更新它

已启用垃圾收集 var_dump(gc_enabled());返回真值

             total       used       free     shared    buffers     cached
Mem:          2048       1522        525          0          0        182
-/+ buffers/cache:       1339        708
Swap:          128          0        128

当脚本完成时,所有的资源都应该被释放,所以您不需要做任何额外的事情,除非您使用的PHP/lib似乎有缺陷并泄漏内存

编辑


内存泄漏是一个bug的结果,在像PHP这样的语言中,如果PHP或其模块中发生内存泄漏,您通常无法通过将PHP或使用过的模块更新为“永不版本”来修复它,并希望这会随着泄漏的修复而来。您可以尝试缩小泄漏组件的范围,然后向其作者报告。作为临时解决方案,您可以通过定期重新启动httpd来解决这个问题,这将释放php或模块分配的所有内存。但这只是一种快速的解决方法,您可以将变量设置为null以立即释放内存

我认为您需要通过调整缓冲区大小来设置数据库内存限制


检查
ob\u implicit\u flush()
函数


占用内存的不是PHP。

php
过程完成后,它会将所有RAM返回给系统。这不是PHP造成的

服务器上的其他一些应用程序正在占用额外的内存,导致
php
在运行时可用的内存减少。根据您所描述的,很容易想象它是MySQL。你说你正在运行1000个查询。MySQL在内部进行分析和缓存以优化这些查询。这绝对会导致在运行PHP脚本后占用额外的内存

同时检查其他服务。如果从您的脚本调用任何服务,但在脚本执行之间继续运行,那么它们也可能占用更大的内存空间。这些服务中的任何一个都可以配置为更小的内存占用,尽管有些可能不能

当然,解决方案是在两台不同的服务器上运行PHP和MySQL。将每个应用程序配置为使用其整个服务器要比将其配置为很好地共享一台服务器简单得多。对于一个需要300mb才能运行的脚本来说,2GB的RAM似乎很低


如果您的服务器资源是固定的,那么您可以修改脚本以使其运行更长时间,但占用更少的内存。也许您可以加载最大的数据片段,并在加载下一个结果之前刷新每个结果。但对我来说,这只是一个临时解决方案。

您是否通过shell运行php脚本?如果是,请检查脚本结束后剩下的进程。PHP不是一个持续运行的进程,所以在脚本结束后不应该在内存中找到它。我最初是通过wget运行它的,但现在我只是通过浏览器运行它。脚本结束后,它不在内存中。mysql显示为使用4%的ram,这就是我所能看到的使用内存的情况。似乎没有任何进程使用ram。它只是缺失定义“只是缺失”。是什么让你认为记忆没有被释放?(您可能想参考)您是否可以在运行脚本之前显示
free-m
的结果,然后在运行一次、两次、三次等之后,直到我们可以看到模式?最终,当你运行它时,机器的内存用完了?事实上,到目前为止,脚本运行前后top的差异如何?请特别强调
mysqld
行!我怎样才能找到漏洞的根源?或者更重要的是,我可以在脚本中添加代码来清除泄漏的内存吗?我使用了top命令,但没有使用这个ram。Php目前使用的是200mb内存,所以它也不是Php。