Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

Существует ошибка 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(), чтобы игнорировать все ошибки.

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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

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

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

Ответ 5

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