我有一个客户收到一个与脚本超时有关的错误。我已经包含了下面的代码,但我认为问题是需要延长超时时间。
这是我可以在代码中设置的东西,还是必须由网络主机(GoDaddy)设置?
致命错误:在第170行的D:''hosting''123''html''siteame''wp-content''plugins''myplugin''myplugin.php中超过了30秒的最长执行时间
此时的代码是:
function my_copy_recurse($src,$dst){
$dir = opendir($src);
@mkdir($dst);
while(false !== ( $file = readdir($dir)) )
{
if (( $file != '.' ) && ( $file != '..' ))
{
if ( is_dir($src . '/' . $file) ) {
my_copy_recurse($src . '/' . $file,$dst . '/' . $file);
}
else {
copy($src . '/' . $file,$dst . '/' . $file);
}
} //THIS IS LINE 170
}
closedir($dir);
}
如果你已经在GoDaddy、Windows主机上托管了你的网站,并且正在使用WordPress,你迟早会面临最长执行时间的问题。我面对这个问题已经有很长一段时间了,我环顾谷歌,撞到了头。如果你遇到了与以下相同的一系列问题:
- 你在GoDaddy上被托管,认为它们很棒,但你发现wordpress抛出了执行时间错误
- 您联系了支持人员。他们显然要么对你冷遇,要么让你写一个自定义的php.ini/php5.ini
- 你不知道该怎么办,而你的老板却在你的头上
- 你试图获得GoDaddy的ini文件,你不能
- 最后,你决定写自己的PHP.ini文件,但要么害怕破坏什么,要么就是不知道从哪里开始
这篇文章是给你的>
- 打开你的文本编辑器。我推荐记事本++。创建以下文件:info.php
-
将info.php上传到您的主机根目录。现在浏览到http://yourhost/info.php.屏幕上加载的是PHP配置。查找已加载的配置文件并记下其值。在我的情况下,它是C:''PHP5''php.ini。我们需要在自定义PHP5.ini文件中提供所有这些信息,但它的信息太多,无法复制和格式化,所以我们将复制GoDaddy的默认文件,并根据需要对其进行编辑。
-
启动文本编辑器并创建以下文件:getconfig.php
<?php copy('C:'PHP5'php.ini'*, 'PHP5.ini'); echo('finally'); ?>
(用加载的配置文件中显示的任何路径替换*) - 打开GoDaddy主机管理员(是的,通过他们的网站)。启动文件管理器
- 在你的主机根上创建一个文件夹"baddaddy"
- 选择新创建的文件夹"baddaddy",然后单击权限使其在web上可写
-
将文件getconfig.php复制到badaddy,现在浏览到http://yourhost/baddaddy/getconfig.php.
-
一旦你看到屏幕上写着"finally",回到GoDaddy控制面板中的文件管理器,转到baddaddy文件夹,你会看到一个新文件PHP5.ini出现在那里。下载此文件。这是GoDaddy设置的副本。
-
做任何你需要的改变(只要知道你在改变什么,我不是PHP专家,所以如果你搞砸了什么,我不负责)。对于我的问题,我将max_execution_time=30更改为max_exection_time=1200。
-
将编辑后的文件上传到应用程序的根目录,然后返回GoDaddy控制面板的IIS管理,点击回收应用程序池,然后等待一段时间(20分钟)
-
浏览回http://yourhost/info.php确认新设置已到位
重要事项**如果你在GoDaddy WordPress博客上看到"500:内部服务器错误",12.将您刚刚编辑的PHP5.ini中的log_errors从log_errors=On更改为log_errors=Off,然后重新上传、回收应用程序池并等待。如果找不到日志文件,则会弹出500错误。
我不是PHP专家,但这件事对我有效,博客加载仍然很慢,但从那以后我再也没有看到任何"致命错误:30秒超时"。
要限制最长执行时间,请使用set_time_limit($seconds)
。如果将$seconds
设置为零,则没有时间限制。因此,只需在脚本的开头添加set_time_limit(0)
,脚本就会一直工作到最后。但是,如果用户的浏览器由于浏览器超时而断开连接,您的脚本可能会被暂停,因此您需要在脚本的开头添加ignore_user_abort(true)
来忽略它,并一直工作到脚本结束。
根据主机允许的设置,您可以使用set_time_limit()在几秒钟内将您希望它在超时前花费的时间传递给它(使用0表示无限)。例如:
set_time_limit(0); //script will now run till completes
GoDaddy可能已经阻止了这一点,所以如果它不起作用,请尝试联系他们
在"php.ini"文件中设置"max_execution_time=600"对我有效。
将代码更改为:
function my_copy_recurse($src,$dst){
$dir = opendir($src);
@mkdir($dst);
while($file = readdir($dir) )
{
if ($file == '.' || $file == '..' ) continue;
if ( is_dir($src . '/' . $file) ) {
my_copy_recurse($src . '/' . $file,$dst . '/' . $file);
}
else {
copy($src . '/' . $file,$dst . '/' . $file);
}
}
closedir($dir);
}