usort():数组被用户比较函数修改
我有一个在我们的Linux服务器上运行正常的Web应用程序,但是在使用PHP 5.3的Zend Community Edition Server的Mac OS上运行时,我们得到以下错误:
usort():数组被用户比较函数修改
每次页面加载第一次(大约需要2分钟,页面才能打勾并加载,在Linux服务器上,页面在1秒钟内加载)。
有没有其他人经历过这个或有任何想法如何我可以解决这个问题,我试图玩弄PHP和Apache的内存设置,没有运气。
有一个PHP错误,可能会导致此警告,即使您不更改数组。
短版本,如果任何PHPdebuggingfunction检查sorting数组,他们将改变引用计数,并诱使usort()
认为你已经改变了数据。
所以你会通过在你的sorting函数(或者从它调用的任何代码)中进行以下任何操作来得到这个警告:
- 在任何sorting数据上调用
var_dump
或print_r
- 调用
debug_backtrace()
- 抛出exception – 任何exception – 甚至只是创build一个exception
该错误是https://bugs.php.net/bug.php?id=50688它影响所有PHP版本> = 5.2.11(包括5.3。*和可能5. *和6)。
截至2015年1月,它仍然是开放的。
据我所见,唯一的解决方法是“不要这样做”(这对exception来说很难),或者使用错误抑制运算符@usort()
来忽略所有的错误。
要解决这个问题,我们可以如下处理
1)使用error_reporting
$a = array('id' => 2,'val' => 3, 'ind' => 3); $errorReporting = error_reporting(0); usort($a); error_reporting($errorReporting);
2)使用@usort($a);
$a = array('id' => 2,'val' => 3, 'ind' => 3); @usort($a);
当PHP在我的callback函数中抛出一个错误时,我遇到了这个问题。 所以PHP不会吐出实际发生的错误,而会抛出:
usort():数组被用户比较函数修改
什么版本的PHP是在Linux的盒子?
两个盒子上的error_reporting级别是否相同? 尝试将它们都设置为E_ALL。
警告几乎肯定不是说谎。 这就是说,你传递给usort()的比较函数正在改变你正在尝试sorting的数组 – 这肯定会让usort花费很长时间,甚至可能永远!
我的第一步是研究比较function,并找出原因。 如果linux系统使用的是5.3之前的版本,那么比较函数中使用的某些语言函数的行为可能会有所不同。
我发现使用PHP5.4,loggingerror_log($message, $message_type, $destination, $extra_headers)
导致这个错误,当我清理日志条目我的问题解决。 在sortingfunction后禁用和恢复日志logging可能暂时中止日志logging。