我有一个备份脚本,用于将网站的所有文件备份到zip文件(使用类似于this question的答案的脚本)。但是,对于大型网站,脚本会在完成之前超时。
有什么办法可以延长脚本运行的时间长度吗?这些网站在共享的Windows服务器上运行,因此我无法访问php.ini文件。
答案 0 :(得分:14)
如果您在共享服务器环境中,并且您无权访问php.ini文件,或者您希望基于每个站点设置php参数,则可以使用.htaccess
文件(在Apache Web服务器上运行时)。
例如,要更改max_execution_time
值,您只需编辑.htaccess
(位于您网站的根目录,通常可通过FTP访问),然后添加以下行:
php_value max_execution_time 300
其中300是您希望设置php脚本的最长执行时间的秒数。
在php文件中使用ini_set函数还有另一种方法
例如。要将执行时间设置为5秒,您可以使用
ini_set('max_execution_time', 300); //300 seconds = 5 minutes
如果您需要进一步澄清,请与我们联系。
答案 1 :(得分:12)
设置时间限制,但可能仍受php.ini设置的限制
参数或者set_time_limit(0);
答案 2 :(得分:11)
简单地说;不要发出HTTP请求来启动PHP脚本。您正在设置的边界已设置,因为您正在使用HTTP请求,这意味着您可能会超时。更好的解决方案是使用“ cronjob ”或Microsoft称之为“计划任务”的方式实现此目的。大多数托管服务提供商将允许您在设定的时间运行此类任务。通过从命令行调用脚本,您不必再担心超时,但您仍有可能遇到内存问题。
如果您有一个不错的托管服务提供商,为什么它不提供每日备份开始? :)
答案 3 :(得分:6)
您可以在脚本的开头使用以下内容:
<?php
if(!ini_get('safe_mode')){
set_time_limit(0); //0 in seconds. So you set unlimited time
}
?>
在脚本结束时使用flush()函数告诉PHP发送它生成的内容。
希望这能解决你的问题。
答案 4 :(得分:3)
脚本是否显示“超出xx秒的最长执行时间”错误消息,或者是否显示空白页?如果是这样,ignore_user_abort可能就是你要找的东西。如果与浏览器的通信丢失,它会告诉php不要停止脚本执行,这可能会保护您免受通信中涉及的其他超时机制的影响。
基本上,我会在您的脚本开头执行此操作:
set_time_limit(0);
ignore_user_abort(true);
根据Berry Langerak的建议,您不应该使用HTTP调用来运行备份。一个cronjob是你应该使用的。与set_time_limit(0)
一起,它可以永远运行。
在共享托管环境中,可能不允许更改max_execution_time
指令,并且您可能无法访问任何类型的命令行,我担心没有简单(干净)解决您的问题,最简单的解决方案通常是使用主机提供的备份解决方案(如果有的话)。
答案 5 :(得分:2)
尝试功能:
set_time_limit(300);
在Windows上,您的webhost可能会通过在您的网络服务器的根目录中上传php.ini文件来覆盖设置。如果是这样,请上传包含以下内容的php.ini文件:
max_execution_time = 300
要检查设置是否有效,请执行phpinfo()
并检查本地值以获取max_execution_time。
答案 6 :(得分:1)
选项1:要求托管公司将备份放在php可访问的地方,这样php文件就可以重定向备份。
选项2:将备份脚本分成多个部分,也许使用一些ajax连续几次调用脚本,给用户一个很好的进度条,并将一个zip的脚本调用结果与php和提供下载。