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

Mic*_*ael 46 php usort

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

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

每次页面第一次加载时(页面加载和加载大约需要2分钟),在Linux服务器上页面加载1秒钟.

有没有其他人经历过这个或有任何想法如何解决问题,我已经尝试过玩PHP和Apache内存设置没有运气.

小智 85

即使您不更改阵列,也会出现导致此警告的PHP错误.

简短版本,如果任何PHP调试函数检查排序数组,他们将更改引用计数和技巧,usort()以认为您已更改数据.

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

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

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

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

  • 让我们投票支持那个被修复的人.https://bugs.php.net/bug.php?id=50688 (12认同)
  • 显然,这是"[在PHP 7中修复](https://bugs.php.net/bug.php?id=50688#1437229072)". (3认同)
  • 我只想补充一点,你不必_throw_一个例外.只需使用new创建它,也会触发警告. (2认同)

小智 8

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

1)使用error_reporting

$a = array('id' => 2,'val' => 3, 'ind' => 3);
$errorReporting = error_reporting(0);
usort($a);
error_reporting($errorReporting);
Run Code Online (Sandbox Code Playgroud)

2)使用 @usort($a);

$a = array('id' => 2,'val' => 3, 'ind' => 3);
@usort($a);
Run Code Online (Sandbox Code Playgroud)


tim*_*dev 1

Linux 机器上的 PHP 版本是什么?

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

这个警告几乎肯定不是撒谎。这意味着您传递给 usort() 的比较函数正在更改您尝试排序的数组- 这肯定会使 usort 花费很长时间,甚至可能永远!

我的第一步是研究比较函数,并找出发生这种情况的原因。如果 Linux 机器使用 5.3 之前的版本,则比较函数中使用的某些语言函数的行为可能会有所不同。