2

脚本在共享主机上运行并遵循根 php.ini 文件。它使用 PHP 5.4,所以没有 safe_mode,也没有使用 .htaccess 文件。我问支持他们是否有任何限制,她说超时是他们这边的两个小时。在 localhost 上,它不会停止,但会忽略我的限制。

此示例在 601-606 秒(~10 分钟)而不是 1000 秒后停止:

// For immidiately printing in browser
header('Content-Type:text/html; charset=UTF-8');

$limit = 1000;

set_time_limit($limit);
ini_set('max_execution_time', $limit);
ini_set('max_input_time', $limit);
ini_set('memory_limit', $limit . 'M');
ini_set('max_input_time', $limit);
ini_set('post_max_size', $limit);
ini_set('file_uploads', $limit);
ini_set('upload_max_filesize', $limit);

$start = microtime(1);

// Every second prints elapsed seconds
for ($i=0; $i<1000; $i++){
    echo str_pad(round(microtime(1)-$start), 4096);
    flush();
    sleep(1);
}
  1. 最重要的问题是它为什么停止?我不需要 2 小时,但 20-30 分钟会很好。
  2. 为什么它忽略了我的限制?我可以将 $limit 更改为 '1' 但它不会改变任何内容。
4

2 回答 2

4

首先关于超时

set_time_limit()max_execution_time不计算 sleep()、system()、file_get_contents() 和 DB 调用。这就是为什么我认为脚本忽略了我的限制。

我再次与支持人员交谈,结果发现停止脚本的不是 Apache 超时,而是监视脚本并在 10 分钟后为共享 IP 客户停止它的“某些东西”。我向他询问了完整的限制清单:

类型 | 专用 | 共享
------------+-----------+------------
阿帕奇/网络 | 12 小时 | 10分钟
SSH/外壳 | 2 小时 | 1小时
计划工作 | 1 小时 | 30分钟
守护进程 | 无限 | 10分钟

这就是为什么它从 cron 运行良好的原因。

于 2013-04-22T17:10:10.867 回答
2

此类超时通常发生在有 CGI 超时值时,这不是源自 php.ini 的问题。

尝试这个:

set_time_limit(0);  // run foorreeveeerr
for ($i=0; $i<1000; $i++){
    echo str_pad(round(microtime(1)-$start), 4096);
    flush();
    sleep(1);
    set_time_limit(0); // if PHP_CLI SAPI and having error messages
}

请注意,这不是推荐的方式,如果没有控制可能会导致脚本运行时间过长...但是要诊断问题的根源,这可能会派上用场。

将时间限制设置为 0,表示没有时间限制。

如果您的脚本在 IIS 服务器上运行,请查看影响脚本超时的 CGI 超时设置,有关设置请查看此处

如果在 Apache 上,请在 httpd.conf 中检查 Apache 的超时值。

尽管支持说天空是极限,但事情可能会发生;)。

Web 服务器可能会通过 HTTP 超时强制您退出。寻求支持。因为我猜你是从浏览器监控的。

您可以使用(最好这样做)ini_get() 函数来验证以下值:

 ini_get('safe_mode');

 ini_get('max_execution_time'); 

等。特别是后者在设置之前和之后

 ini_set('max_execution_time');

至少验证设置似乎是成功的。

于 2013-04-21T11:24:33.467 回答