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

发布于 2024-09-09 09:08:35 字数 284 浏览 7 评论 0原文

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

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

(页面滚动和加载大约需要 2 分钟,在 Linux 服务器上,页面加载时间为 1 秒)。

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

I have a web application that runs fine on our Linux servers but when running on Mac OS with the Zend Community Edition Server using PHP 5.3 we get the error:

usort(): Array was modified by the user comparison function

every time a page loads for the first time (it takes about 2 minutes for a page to tick over and load, on the linux servers the page loads in 1 second).

Has anyone else experienced this or has any idea how I can fix the problem, I have tried playing around with PHP and Apache memory settings with no luck.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

べ繥欢鉨o。 2024-09-16 09:08:35

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

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

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

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

该错误会影响所有 PHP 5 版本 >= 5.2.11,但不会影响 PHP >= 7。请参阅 < a href="https://bugs.php.net/bug.php?id=50688" rel="nofollow noreferrer">错误报告了解更多详细信息。

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

There is a PHP bug that can cause this warning, even if you don't change the array.

Short version, if any PHP debug functions examine the sort array, they will change the reference count and trick usort() into thinking you've changed the data.

So you will get that warning by doing any of the following in your sort function (or any code called from it):

  • calling var_dump or print_r on any of the sort data
  • calling debug_backtrace()
  • throwing an exception -- any exception -- or even just creating an exception

The bug affects all PHP 5 versions >= 5.2.11 but does not affect PHP >= 7. See the bug report for further details.

As far as I can see, the only workaround is either "don't do that" (which is kind of hard for exceptions), or use the error suppression operator @usort() to ignore all errors.

鸠魁 2024-09-16 09:08:35

要解决这个问题,我们可以按如下方式处理

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

To resolve this issue we can handle as below

1) use error_reporting

$a = array('id' => 2,'val' => 3, 'ind' => 3);
$errorReporting = error_reporting(0);
usort($a);
error_reporting($errorReporting);

2) use @usort($a);

$a = array('id' => 2,'val' => 3, 'ind' => 3);
@usort($a);
合约呢 2024-09-16 09:08:35

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

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

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

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

What version of PHP is on the linux box?

Are the error_reporting levels the same on both boxes? Try setting them both to E_ALL.

The warning is almost certainly not lying. It's saying that the comparison function you're passing to usort() is changing the array that you're trying to sort - that could definitely make usort take a long time, possibly forever!

My first step would be to study the comparison function, and figure out why that's happening. It's possible that if the linux boxes are using a pre-5.3 version, there is some difference in the behavior of some language function used in the comparison function.

ㄖ落Θ余辉 2024-09-16 09:08:35

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

I found that using PHP5.4 , logging with error_log($message, $message_type, $destination, $extra_headers) causes this error , when I clean log entries my problem solved. Logging may temporarily be suspended by disabling and restoring logging after sort function.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文