我正在为WordPress
. 我的目标是让它适用于所有人。有些页面使用ajax
响应。一些用户激活了 WP_DEBUG 常量,该常量显示来自主题和其他插件的错误和警告。
这破坏了我的 Ajax PHP,因为我包含了Wordpress
核心,然后 WP 可以在一些博客中显示警告!
我解决这个问题的旧方法是:
<?php
ob_start();
//The wordpress core require
ob_end_clean();
//Now the ajax response:
echo '0';
?>
然而,一位用户报告了一个非常奇怪的错误:ajax
页面没有响应,只在 Opera 中有效,而谷歌浏览器显示:错误 330 (net::ERR_CONTENT_DECODING_FAILED):
挖掘用户网络服务器,我发现 WP 配置或插件使用 ob_start("ob gzhandler")。
ob_get_status(true) 显示在我的工作网络服务器中:
Array
(
[0] => Array
(
[chunk_size] => 4096
[type] => 1
[status] => 0
[name] => default output handler
[del] => 1
)
[1] => Array
(
[chunk_size] => 0
[size] => 40960
[block_size] => 10240
[type] => 1
[status] => 0
[name] => default output handler
[del] => 1
)
)
在错误的网络服务器中:
Array
(
[0] => Array
(
[chunk_size] => 4096
[type] => 1
[status] => 0
[name] => default output handler
[del] => 1
)
[1] => Array
(
[chunk_size] => 0
[size] => 40960
[block_size] => 10240
[type] => 1
[status] => 0
[name] => default output handler
[del] => 1
)
[2] => Array
(
[chunk_size] => 0
[size] => 40960
[block_size] => 10240
[type] => 1
[status] => 0
[name] => ob_gzhandler
[del] => 1
)
)
我的用户网络服务器中的序列是:
- 我的代码调用 ob_start()
- 包括WP核心,WP初始化所有并调用ob_start("ob gzhandler")
- 当我的代码调用 ob_end_clean() 时,它失败了。
我需要一种安全的方法来隐藏 WP 警告,但我无法破坏启用 GZIP 的配置(我怀疑是某些插件)。如果不可能,我更喜欢在警告系统中留下破坏 ajax 并忘记缓冲方法。
我认为一个干净的方法可能是:
$buffers = count(ob_get_status(true));
ob_start();
//The wordpress core require
if (count(ob_get_status(true)) == $buffers + 1) {
ob_end_clean();
} else {
ob_flush();
}
//Now the ajax response:
echo '0';
但我担心通过 PHP 版本和配置、WP 版本、插件和配置的一些无限组合会破坏某些人。您认为解决这个问题的好方法是什么?