我有一个网络应用程序,在我们的Linux服务器上运行良好。但是当在Mac OS上使用Zend Community Edition Server,使用PHP 5.3运行时,我们会出现以下错误:
usort():数组被用户比较函数修改
每次页面第一次加载时都会出现这个错误(加载一个页面需要大约2分钟时间,在Linux服务器上,该页面可以在1秒钟内加载完成)。
是否有其他人遇到过此问题或者有任何想法如何解决该问题?我尝试过调整PHP和Apache内存设置,但没有成功。
即使您不更改数组,也有一个 PHP 错误可能会导致此警告。
简而言之,如果任何 PHP 调试函数检查排序数组,它们将更改引用计数并欺骗 usort()
让它认为您已经更改了数据。
因此,在您的排序函数中(或从中调用的任何代码中)执行以下任何操作都会导致警告:
var_dump
或 print_r
debug_backtrace()
该错误影响所有 PHP 5 版本 >= 5.2.11,但不影响 PHP >= 7。有关详细信息,请参见错误报告。
据我所见,唯一的解决方法要么是“不要这样做”(这对于异常来说有点困难),要么使用错误抑制运算符 @usort()
忽略所有错误。
$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);
error_log($message, $message_type, $destination, $extra_headers)
记录日志会导致这个错误,当我清除日志条目后问题得到解决。可以通过禁用和恢复排序函数后暂时停止记录日志。Linux系统上的PHP版本是多少?
两个系统的error_reporting级别是否相同?尝试将它们都设置为E_ALL。
警告几乎肯定不是在撒谎。它说你传递给usort()的比较函数正在更改你试图对其进行排序的数组 - 这肯定会使usort花费很长时间,可能是永远!
我的第一步将是研究比较函数,并弄清楚为什么会发生这种情况。如果linux系统使用的是5.3版本之前的预先版本,则有可能某些比较函数中使用的语言函数的行为存在差异。
wp-includes\class-wp-theme.php
的第 1208 行,使用 uasort 的函数被wp-admin\includes\theme.php
和其他两个文件各调用一次... 它们都有 sprintf,但没有 print_r/var_dump/debug 之类的东西或者抛出异常。目前我按照你的建议使用了@uasort
来忽略它,这样就不会再搞乱仪表盘了。 - Armfoot