2010-11-10 19 views
4

嗨,问题是当你用php执行无限循环时,你如何控制内存清理? 粗略的例子是在infinity while循环中得到结果或从/更新mysql的结果。用php无限循环清理缓存的常用技巧

需要任何常用方法。 谢谢。

PS - 所有的克星和PHP的错误是通过移动到完全蟒蛇...更换

+1

'mysql_free_result','unset()' – ajreal 2010-11-10 11:54:08

+0

我想出了运行后台python进程的最佳方法,但是在php中也应该有一些清理内存的常用方法。当你需要在服务器背景上运行常量静态进程时,mysql_free_result,unset()在大多数情况下都不起作用。 – Conex 2010-11-10 11:59:14

+1

你打算使用PHP创建一个守护进程? PHP的内存问题是编译脚本为二进制,使用APC允许操作码缓存 – ajreal 2010-11-10 12:11:48

回答

2

据我所知在PHP内存时,变量超出范围释放。但也有一些其他的问题:

  1. circullar引用 - PHP 5.3 应该解决它 - 它也允许运行GC,当你想
  2. 如果PHP需要,例如在第一次迭代的 5 MB的 内存过程将占用该内存甚至 如果后面的迭代将采取 例如1 MB
  3. 你必须手动 释放一些东西(像例子中提到 之前数据库结果)

使用脚本语言进行类似进程的运行是非常糟糕的主意。

尝试做另一种方式:

  1. 写一个脚本这将PROCESSS 的数据量,这将需要大约 55-60秒运行。
  2. 添加cron作业,每 分钟运行一次。
  3. 添加某种相互排斥,到 脚本,这样的cron不会运行 并发脚本 - 你可以 数据库表 进行同步(使用SELECT FOR UPDATE)
+0

写一个脚本会处理大约需要55-60秒才能运行的数据量。 - 如果我有一个非常大的超过10分钟超过55-60秒..这是我的旧尝试,GC似乎是好的,我不能配置我的centos服务器与最新版本的PHP,但我认为我将深入python执行.. – Conex 2010-11-10 13:48:04

+0

整个脚本运行10分钟?你不能把它分成10个更小的克伦工作吗? – Daimon 2010-11-11 12:21:20

2

由于PHP 5.3,你可以明确地根据文件here触发gc_collect_cycles()的GC循环。

在此之前,它已经超出了你的控制范围,你必须等待PHP决定是否应该自行清理垃圾 - 或者试图超过内存限制,使用但未连接的记忆物体或在满月下牺牲一只山羊并希望获得最佳效果。