У меня есть веб-приложение, которое отлично работает на наших 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)
записи в журнале, моя проблема решена. Регистрация может временно приостанавливаться, отключая и восстанавливая ведение журнала после функции сортировки.