usort():数组由用户比较函数修改

时间:2010-07-13 08:29:22

标签: php usort

我有一个在我们的Linux服务器上运行良好的Web应用程序,但是当使用PHP 5.3在Zend社区版服务器上运行Mac OS时,我们收到错误:

  

usort():数组由用户比较函数

修改

每次第一次加载页面时(页面加载并加载大约需要2分钟,在linux服务器上加载页面的时间为1秒)。

有没有其他人经历过这个或者我知道如何解决这个问题,我已经尝试过玩PHP和Apache内存设置而没有运气。

5 个答案:

答案 0 :(得分:85)

有一个PHP错误可能会导致此警告,即使您不更改阵列。

简短版本,如果任何PHP调试函数检查排序数组,它们将更改引用计数并欺骗usort()以认为您已更改数据。

因此,您将通过在sort函数(或从其调用的任何代码)中执行以下任何操作来获得该警告:

  • 在任何排序数据上调用var_dumpprint_r
  • 致电debug_backtrace()
  • 抛出异常 - 任何异常 - 甚至只是创建异常

该错误影响所有PHP 5版本> = 5.2.11但不影响PHP> = 7.有关详细信息,请参阅the bug report

据我所知,唯一的解决方法是“不要那样做”(对于异常很难),或者使用错误抑制运算符@usort()来忽略所有错误。

答案 1 :(得分:8)

要解决此问题,我们可以按照以下方式处理

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);

答案 2 :(得分:3)

当PHP在我的回调函数中抛出错误时,我遇到了这个问题。因此,不是吐出正在发生的实际错误,而是抛出:

  

usort():数组由用户比较函数

修改

答案 3 :(得分:1)

Linux机器上有哪个版本的PHP?

两个方框的error_reporting级别是否相同?尝试将它们都设置为E_ALL。

警告几乎肯定不是谎言。它说你传递给usort()的比较函数是改变你正在尝试排序的数组 - 这肯定会让我们花费很长时间,可能永远!

我的第一步是研究比较功能,并弄清楚为什么会发生这种情况。如果linux盒子使用的是5.3之前的版本,那么比较函数中使用的某些语言函数的行为可能会有所不同。

答案 4 :(得分:1)

我发现使用PHP5.4,使用error_log($message, $message_type, $destination, $extra_headers)进行日志记录会导致此错误,当我清理日志条目时,我的问题就解决了。通过在排序功能后禁用和恢复日志记录,可以暂时暂停日志记录。