usort (): Массив был изменен функцией сравнения пользователей

У меня есть веб-приложение, которое отлично работает на наших Linux-серверах, но при работе в Mac OS с Zend Community Edition Server с использованием PHP 5.3 мы получаем ошибку:

usort (): Массив был изменен функцией сравнения пользователей

каждый раз, когда страница загружается в первый раз (требуется, чтобы страница зацикливалась и загружалась, на серверах Linux страница загружается через 1 секунду).

Кто-нибудь еще испытал это или не знает, как я могу исправить эту проблему, я пробовал играть с настройками памяти PHP и Apache без везения.

Существует ошибка PHP, которая может вызвать это предупреждение, даже если вы не измените массив.

Короткая версия, если какие-либо функции отладки PHP исследуют массив сортировки, они будут изменять счетчик ссылок и трюк usort() думая, что вы изменили данные.

Таким образом, вы получите это предупреждение, выполнив любое из следующих действий в вашей функции сортировки (или любой вызываемый код):

  • вызов var_dump или print_r для любого из данных сортировки
  • вызов debug_backtrace()
  • бросание исключения – любое исключение – или даже просто создание исключения

Ошибка https://bugs.php.net/bug.php?id=50688 Она затрагивает все версии PHP> = 5.2.11 (включая 5.3. * И, вероятно, 5. * и 6).

По состоянию на январь 2015 года он по-прежнему открыт.

Насколько я могу судить, единственным обходным путем является либо «не делать этого» (что бывает сложно для исключений), либо использовать оператор подавления ошибок @usort() чтобы игнорировать все ошибки.

Чтобы решить эту проблему, мы можем обращаться как ниже

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

Я столкнулся с этой проблемой, когда PHP вызывал ошибку в моей функции обратного вызова. Поэтому, вместо того, чтобы выплевывать фактическую ошибку, происходящую, PHP будет бросать:

usort (): Массив был изменен функцией сравнения пользователей

Какая версия PHP находится в окне linux?

Являются ли уровни error_reporting одинаковыми в обоих случаях? Попробуйте установить их как E_ALL.

Предупреждение почти наверняка не лжет. Это говорит о том, что функция сравнения, которую вы передаете usort (), меняет массив, который вы пытаетесь сортировать, – это, безусловно, может привести к сокращению длительности, возможно, навсегда!

Моим первым шагом было бы изучить функцию сравнения и выяснить, почему это происходит. Вполне возможно, что если ящики linux используют версию pre-5.3, есть некоторая разница в поведении некоторой языковой функции, используемой в функции сравнения.

Я обнаружил, что при использовании PHP5.4 регистрация с помощью error_log($message, $message_type, $destination, $extra_headers) вызывает эту ошибку, когда я error_log($message, $message_type, $destination, $extra_headers) записи в журнале, моя проблема решена. Регистрация может временно приостанавливаться, отключая и восстанавливая ведение журнала после функции сортировки.