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_dumpprint_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。