PHP ob“获取内容”;有时";在不应该返回空时返回空?

PHP ob“获取内容”;有时";在不应该返回空时返回空?,php,Php,问题:我看到了一种随机情况,ob\u get\u conents()在应该有内容的时候却什么也不返回。每天数千次成功中有几次失败。随机的 基础:我使用输出缓冲和写入文件将特定HTML生成输出包装到变量中。然后,在使用新的HTML构建刷新文件之前,该文件将被分发给所有后续点击,持续X分钟。它是一个基本的内联缓存生成器,附加在旧站点代码上 在看到一些关于空页面的问题后,我发现ob_get_contents()对于给定的刷新运行没有返回任何内容。下一次刷新时,它通常是正常的。然后,出乎意料的是,几个小

问题:我看到了一种随机情况,ob\u get\u conents()在应该有内容的时候却什么也不返回。每天数千次成功中有几次失败。随机的

基础:我使用输出缓冲和写入文件将特定HTML生成输出包装到变量中。然后,在使用新的HTML构建刷新文件之前,该文件将被分发给所有后续点击,持续X分钟。它是一个基本的内联缓存生成器,附加在旧站点代码上

在看到一些关于空页面的问题后,我发现ob_get_contents()对于给定的刷新运行没有返回任何内容。下一次刷新时,它通常是正常的。然后,出乎意料的是,几个小时后再次返回空位(也不要“同时”返回)

这让我抓狂,因为它不一致。当ob_get_contents()返回的内容为空时,我会收到php操作的电子邮件。。。有很多细节。似乎没有什么能说明“为什么”

在将复杂版本的代码缩减到其核心之后。。。这就是导致问题的全部原因:

ob_start();

// A lot of html generation code which would normally just output ...
// This html will ALWAYS have content ...

$guts = ob_get_contents();
if ( empty($guts) ) { /* email me a failure notice! */ }
ob_end_clean();
// write $guts to file and echo ...
其他一些细节:

  • PHP版本5.5.9-1ubuntu4.19(此版本中可能有bug?)
  • 输出缓冲4096
  • ob_get_level()始终返回“2”
  • HTML生成范围从10KB到92KB,具体取决于哪一块
  • 不总是出现在同一个HTML片段上
  • 所有都是没有POST或GET ARG通过的点击
  • 大多数是此类代理(所有随机IP):

    • “红宝石”
    • “Mo%20PTT/2016092702 CFNetwork/808.0.2达尔文/16.0.0”
    • “FeedBurner/1.0”

请注意:它并不总是像其他关于ob\u get\u contents()的堆栈问题一样返回空。我看了一遍,没有人帮忙。。。我希望它总是这样,那么它将是一个明显的修复。

几个月来,我一直在同一个PHP版本(5.5.9)上看到类似的问题。也无法切换到其他PHP版本。 我甚至很难在我们的系统中检测到这一点,但幸运的是,我现在能够追踪并利用它

在PHP5.5.9中,函数
print\u r
在内部使用输出缓冲,并且在该版本中报告了有关
print\u r
和输出缓冲的错误

所以这里是你需要做的

先创建script first.php:
您可以使用cron作业来解决该问题,该作业将重建文件并仅在成功时保存,而服务器仅为静态文件提供服务。这样,您将得到空页

我想我解决了一个类似的问题,在
.htaccess
文件中添加了
php\u flag output\u buffering On
。在我的例子中,我的PHP文件包含了第一个HTML代码,然后是一个PHP块,它调用了
ob\u get\u contents
命令。有时,此ob_get_内容的结果为空。我不确定这是否总是有效,或者为什么。

您是否在其他php版本(如
5.6.25
)中尝试过它?不幸的是,目前还不能。它是一个生产服务器,升级必须经过几个阶段。测试服务器从来没有出现过这个问题,因为它没有获得足够的流量(仅仅是我点击它一百次似乎不会导致这个问题)。PHP v5.5.9中有几个错误,你可以在这里看到:,只需检查有什么变化当然有更多的更新v.5.5.11。。如果可能的话,把你的php版本更新到最新的稳定版本。我会把它推荐给我们的服务器,谢谢。不知道他为什么选择这个5.5。由于这个服务器运行的是非常非常旧的代码,所以我一直在更新。我没有缓存和显示它,基本上将页面命中转换为完整构建命中,而不是缓存拉取。我是说,这很有效。。。但我真希望我能找到它发生的根本原因。由于其他的大项目,我不得不暂时搁置。很抱歉,我没有回来。我已经采取了预防措施,以防止空白输出,所以在这一点上,我放弃了关心,花更多的时间在上面。但是你的信息很有趣,如果是这样的话,你的见解也很深刻。不幸的是,我目前无法真正设置该测试!也许如果我们重新讨论这个问题,我会再次引用它。
<?php
ignore_user_abort(true);// (curl disconnects after 1 second)
ini_set('max_execution_time','180');    // 3 minutes
ini_set('memory_limit','512M');         // 512 MB

function testPrint_r($length)
{
    $test1 = array('TEST'=>'SOMETHING');
    $test2 = print_r($test1, true);
    $test3 = "Array\n(\n    [TEST] => SOMETHING\n)\n";
    if(strcmp($test2, $test3)!==0) {
        throw new Exception("Print_r check failed, output length so far: ".$length);
        // consult your error.log then, or use some other reporting means
    }
}

$message = "123456789\n";
$length = strlen($message);
while(1)
{
    echo $message;
    $total_length += $length;
    testPrint_r($total_length);
}
die('it should not get here');
<?php
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL,    'http://some.server/first.php');
curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 1);
curl_exec($ch);
curl_close($ch);

echo "all done";