我有一个资源密集型脚本,大约需要30分钟才能完成。随着它的运行,它逐渐消耗内存。一旦完工,它已经消耗了大约300毫巴。我需要运行这个脚本多次,所以这是一个问题。每当我想再次开始运行脚本时,我必须重新启动服务器,因为ram使用率达到100%,脚本停止。
如何强制php或mysql释放内存?PHPVersion5.4.29CentOSVPS 2GB内存PHP脚本的内存设置为512 to。
该脚本进行大量SQL查询。应该在1000年代。它还对5个不同的API进行了50次调用。它从db表中选择50行并循环遍历,调用API等来更新它。
启用了垃圾回收( var_dump(gc_enabled());返回为true
total used free shared buffers cached
Mem: 2048 1522 525 0 0 182
-/+ buffers/cache: 1339 708
Swap: 128 0 128发布于 2014-11-29 20:28:45
当脚本完成时,所有的资源都应该被释放,所以您不应该需要做任何额外的事情,除非您使用的PHP/lib似乎是错误的,并且会泄漏内存。
编辑
内存泄漏是错误的结果,在PHP等语言中,如果内存泄漏发生在PHP或其模块中,您通常无法通过更新PHP或已使用的模块来修复它,因此您希望这将与泄漏修复一起出现。您可以尝试缩小泄漏组件的范围,然后向其作者报告。作为临时解决方案,您可以通过定期重新启动httpd来解决此问题,这将释放由php或模块分配的所有内存。但这只是简单的解决办法
发布于 2014-11-29 20:31:47
发布于 2014-12-01 00:34:44
这不是PHP,它占用了这个内存.
一旦php进程完成,它就会将其所有内存返回给系统。所以这不是PHP造成的。
服务器上的其他应用程序占用了额外的内存,导致php在运行时可用的内存较少。从您所描述的情况来看,很容易想象它是MySQL。你说你要运行1000个查询。MySQL在内部进行分析和缓存以优化这些查询。这绝对会导致它在运行PHP脚本后占用额外的内存。
也可以查看其他服务。如果从脚本中调用了任何服务,但在脚本执行之间继续运行,那么它们也可能占用更大的内存空间。这些服务中的任何一个都可以配置为更小的内存足迹,尽管可能有些不能。
当然,解决方案是在两个不同的服务器上运行PHP和MySQL。将每个应用程序配置为使用其整个服务器比配置它们来很好地共享一台服务器要简单得多。对于一个需要300 GB才能运行的脚本来说,2GB的RAM似乎很低。
如果您的服务器资源是固定的,您可以修改脚本以运行更长时间,但占用的内存也更少。也许您可以在加载下一个数据之前,将最大的数据分段加载,并将每个结果清空。但对我来说,这只是一个暂时的解决办法。
https://stackoverflow.com/questions/27206663
复制相似问题