Usort(): Массив был изменен функцией сравнения пользователей
У меня есть веб-приложение, которое отлично работает на наших Linux-серверах, но при работе на Mac OS с Zend Community Edition Server с использованием PHP 5.3 мы получаем ошибку:
usort(): массив был изменен функцией сравнения пользователей
каждый раз, когда страница загружается в первый раз (требуется, чтобы страница зацикливалась и загружалась, на серверах Linux страница загружается через 1 секунду).
Кто-нибудь еще испытал это или имеет какое-либо представление о том, как я могу исправить эту проблему, я пробовал играть с настройками памяти PHP и Apache без везения.
Ответы
Ответ 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)
вызывает эту ошибку, когда я чищу записи в журнале, моя проблема решена. Регистрация может временно приостанавливаться, отключая и восстанавливая ведение журнала после функции сортировки.