【问题标题】:usort(): Array was modified by the user comparison functionusort():数组被用户比较函数修改
【发布时间】:2011-03-15 04:54:42
【问题描述】:

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

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

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

有没有其他人遇到过这个问题或者知道如何解决这个问题,我尝试过使用 PHP 和 Apache 内存设置,但没有成功。

【问题讨论】:

    标签: php usort


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 两台服务器上的 PHP 版本相同,PHP 5.3.2。我会检查比较函数。
    • 如果版本相同,我会非常热衷于确保代码实际上是相同的,并且任何输入都是相同的。但是查看警告指向的任何行都是一个不错的起点。如果您自己没有发现问题,您可能需要将比较函数和一些示例数据粘贴到您的问题中。
    【解决方案2】:

    有一个 PHP 错误会导致此警告,即使您不更改数组也是如此。

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

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

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

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

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

    【讨论】:

    • 让我们投票支持修复这个错误的人。 bugs.php.net/bug.php?id=50688
    • 我只想补充一点,您不必抛出异常。只需使用 new 创建它,也会触发警告。
    • sprintf 也会触发这个吗?此错误出现在 Wordpress 4.0 管理仪表板上... 引用的文件是 1208 行上的 wp-includes\class-wp-theme.php 并且使用 uasort 的函数由 wp-admin\includes\theme.php 和其他 2 个文件调用一次...他们都有 sprintfs 但没有 print_r/var_dump/debug 的东西或抛出。现在我使用@uasort 来忽略你的建议,它不会再搞砸仪表板了。
    • 显然,这是“fixed in PHP 7”。
    【解决方案3】:

    为了解决这个问题,我们可以如下处理

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多