让php程序运行几个小时

时间:2011-03-04 10:44:59

标签: php mysql apache

我有大量的数据需要从mysql读取,分析并根据拆分并存储在新记录中的结果。 五个记录大约需要20秒,但是记录长度不一,所以我无法估计程序需要多长时间,但是已经计算出该过程不应该花费超过5个小时的时间,所以我想要运行它过夜并且非常确定当我第二天早上回到办公室时,程序就完成了。

假设代码是故障安全的(我知道正确;)应该如何设置Apache / PHP / Mysql设置,这样当我执行脚本时我可以确保程序不会超时和/或不运行从公羊出来?

它基本上是在循环中运行,获取100行的集合,直到它不再是循环所以,我希望在每次迭代开始时重置变量的事实将保留内存使用常数。

转储时数据库的实际大小为14mb,因此数据量不是那么高

(旁注,也可能是我没有为服务器设置分配最大资源,所以也许这就是运行5条记录需要20秒的原因)

7 个答案:

答案 0 :(得分:4)

通过在PHP.ini中将此设置为0(无限制)或致电set_time_limit(0),确保已删除任何max_execution_time限制。这将确保PHP不会在执行中停止脚本 如果可能的话,你应该run the script from the CLI,这样你就不必担心Apache会对你的请求进行计时(它不应该,但可能会这样)。
由于您只使用15 MB的数据,我不担心内存使用(128 MB是PHP中的默认值)。如果您真的担心可以通过将memory_limit修改为更高的-1(无限内存)来删除PHP中的内存限制。

请记住,修改PHP.ini将影响该安装解释的所有脚本。我更喜欢在脚本的顶部使用适当的ini设置函数来防止危险的全局更改。


旁注:这听起来不像是PHP的工作。我不打算在此处阻止您使用PHP,但还有其他语言更适合命令行使用。

答案 1 :(得分:1)

最好让脚本退出执行,然后重新启动它。存储点 它最后一次离开的地方。由于垃圾收集中的一些错误,这将确保您没有内存泄漏且脚本内存不足 如果出现意外故障,则继续执行。 一个简单的shell命令是:

while [ 1 ]; do php myPhpScript.php  a; done

您可以进行其他检查以确保正常运行。

答案 2 :(得分:1)

我想指出,默认情况下脚本通过PHP中的CLI运行,默认情况下没有时间限制,与通过CGI,mod_php等运行的脚本不同。

如上所述,避免通过Apache运行。

但是,如果你必须这样做,请考虑将其分解。您可以创建一个可以处理5-10个结果的页面,附加转储文件,然后打印出元刷新或一些JavaScript来重新加载页面,并带有一个参数告诉它它的位置,并继续直到完成。

不推荐。

答案 3 :(得分:1)

在这里添加一些其他好的选项,您可能希望查看http://www.electrictoolbox.com/article/php/process-forking/并向dev / null发送一些请求,如果您不需要它们回馈反馈。

答案 4 :(得分:0)

请勿使用网络界面执行此操作。从命令行运行它;但是看看你的代码是否可以被优化,或者设置断点并在“块”

中进行

答案 5 :(得分:0)

首先http://php.net/manual/en/function.set-time-limit.phpset_time_limit(0);放在脚本的开头。

至于内存,你应该通过取消设置每次迭代不需要的任何变量,数组,指针来处理它。

最好从shell(CLI)或cronjob运行脚本。

答案 6 :(得分:0)

据我所知,MySQL连接没有超时,所以你应该通过设置:

来保证安全
php_value max_execution_time X

在.htaccess文件中或将set_time_limit(X)放在脚本的开头,其中X是一个舒适的值,以秒为单位。