2011-05-10 128 views
14

我有一个备份脚本,它将网站的所有文件备份到zip文件(使用与this question类似的脚本)。但是,对于大型网站,脚本会在完成之前超时。PHP备份脚本超时

有没有什么办法可以延长脚本运行的时间长度?这些网站运行在共享的Windows服务器上,所以我无法访问php.ini文件。

+0

这里可能最好的选择是使用[shell_exec()](http://lv.php.net/manual/en/function.shell-exec.php)在后台运行它,同时也忽略超时设置。 – arma 2011-05-10 08:35:18

+0

Plz不要忘记接受一个答案,如果它解决了你的问题。 – 2011-05-19 12:09:25

+1

在Windows上运行PHP?这听起来像个坏主意。然后再一次,在Mac上运行IE也是如此。 – Xeoncross 2011-05-20 16:03:14

回答

11

简单地说,不要发起HTTP请求来启动PHP脚本。您所遇到的边界是因为您使用HTTP请求而设置的,这意味着您可以暂停。更好的解决方案是使用“cronjob”或Microsoft称之为“计划任务”来实现此目的。大多数托管服务提供商将允许您在特定时间执行此类任务。通过从命令行调用脚本,您不必再担心超时问题,但您仍然有可能遇到内存问题。

如果你有一个体面的托管服务提供商,但它为什么不提供每日备份开始? :)

+0

托管服务提供商都需要进行每日备份;此脚本适用于客户端自己的备份副本,而无需拨动FTP – whostolemyhat 2011-05-23 15:14:22

+1

+1这里最好的答案是,不要创建网页来进行备份。 cron或计划任务 – 2011-05-23 19:30:55

+0

@什么;仍然,使用浏览器来请求备份脚本通常是非常糟糕的想法,这太容易出错了。致电托管服务提供商,并要求他们提供cronjobs或计划任务的可能性。 – 2011-05-24 07:18:17

14

如果你是在一个共享的服务器环境,你没有访问php.ini文件,或者你要设置在每个站点为基础的PHP参数,你可以使用.htaccess文件(在Apache网络服务器上运行时)。

例如,为了改变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 

如果您需要更多说明,请让我知道。

+0

不幸的是,这些是IIS服务器,所以htaccess文件将无法工作:( – whostolemyhat 2011-05-10 09:01:17

+7

好吧没有probs ..谢谢你的回应。希望你已经解决了set_time_limit(0)方法建议的问题..如果不是你仍然可以尝试ini_set()方法 – 2011-05-10 09:08:45

+1

即使有可能使用.htaccess,我也不建议使用它来为单个脚本设置配置。仅限于备份脚本而不是整个页面更改限制 – binaryLV 2011-05-11 07:10:32

6

您可以使用下面的脚本开始:

<?php 
if(!ini_get('safe_mode')){ 
     set_time_limit(0); //0 in seconds. So you set unlimited time 
} 
?> 

,并在脚本的末尾使用flush()函数告诉PHP来发送它已经产生了什么。

希望这可以解决您的问题。

2

尝试的功能:

set_time_limit(300); 

在Windows上,有轻微的可能性,你的虚拟主机提供商允许您通过设置搭在你的web服务器的根目录上传php.ini文件。如果是的话,上传包含一个php.ini文件:

max_execution_time = 300 

要检查是否设置的工作,做一个phpinfo()并检查本地价值为的max_execution_time。

3

是脚本给出“超出最大执行时间xx秒”的错误消息,还是显示空白页?如果是这样,ignore_user_abort可能是你要找的。它告诉php如果与浏览器的通信丢失,不会停止脚本执行,这可以保护您免受通信中涉及的其他超时机制的影响。

基本上,我会在你的脚本开始这样做:

set_time_limit(0); 
ignore_user_abort(true); 

此说,你不应该使用一个HTTP调用运行备份来作为建议由贝瑞Langerak。 cronjob是你应该使用的。随着set_time_limit(0),它可以永远运行。

在共享主机环境中,可能会禁止更改max_execution_time指令,并且您可能无法访问任何类型的命令行,但恐怕没有简单(并且干净)的解决方案问题,最简单的解决方案通常是使用主机提供的备份解决方案(如果有的话)。

1

选项1:要求托管公司将备份置于某处可以通过php访问,因此php文件可以重定向备份。

选项2:将备份脚本分成多个部分,也许使用一些ajax连续调用脚本几次,给用户一个很好的进度条,并将脚本调用的结果与php中的zip结合起来并提供下载。