47 votes

usort (): le tableau a été modifié par la fonction de comparaison d'utilisateurs

J'ai une application web qui fonctionne très bien sur nos serveurs Linux, mais lors de l'exécution sur Mac OS avec Zend Server Community Edition à l'aide de PHP 5.3, nous obtenons le message d'erreur:

usort(): Array a été modifié par l'utilisateur en fonction de comparaison

chaque fois qu'une page se charge pour la première fois (il faut environ 2 minutes pour une page pour basculer et de la charge sur les serveurs linux, le chargement de la page en 1 seconde).

Quelqu'un at-il vécu cela ou a une idée de comment je peux résoudre le problème, j'ai essayé de jouer avec PHP et Apache paramètres de la mémoire avec pas de chance.

88voto

Achronos Points 500

Il y a un bogue de PHP qui peut provoquer cette mise en garde, même si vous ne modifiez pas le tableau.

Version courte, le cas échéant PHP fonctions de debug examiner le genre de tableau, ils vont changer le nombre de références et de tromper usort() dans la pensée que vous avez changé les données.

Vous aurez donc que l'avertissement en effectuant l'une des opérations suivantes dans votre fonction de tri (ou code appelé à partir d'elle):

  • appelant var_dump ou print_r sur toute sorte de données
  • appelant debug_backtrace()
  • lancer une exception -- aucune exception, ou même juste de créer une exception

Le bug est https://bugs.php.net/bug.php?id=50688
Elle affecte toutes les versions de PHP >= 5.2.11 (y compris 5.3.* et j'ai probablement 5.4.*).
En juin 2012, il est encore ouverte.

Aussi loin que je peux voir, la seule solution est soit "ne fais pas ça" (ce qui est un peu dur pour les exceptions), ou de l'utilisation de la suppression d'erreur de l'opérateur @usort() d'ignorer toutes les erreurs.

8voto

user3389263 Points 1

Pour résoudre ce problème, nous pouvons gérer comme ci-dessous

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

2) utiliser <?php @usort($a); ?>

3voto

chriswoodford Points 594

J'ai rencontré ce problème lorsque PHP renvoyait une erreur dans ma fonction de rappel. Plutôt que de cracher l'erreur réelle, PHP lançait l'erreur "usort (): Le tableau a été modifié par la fonction de comparaison d'utilisateurs".

1voto

timdev Points 25910

Quelle version de PHP est sous linux?

Sont le niveau de niveaux de la même manière sur les deux cases? Essayez de régler les deux à E_ALL.

L'avertissement est presque certainement pas mentir. C'est dire que la fonction de comparaison vous êtes de passage à usort() est la modification de la matrice que vous êtes en train de trier , qui pourrait certainement faire usort prendre un certain temps, peut-être pour toujours!

Ma première étape serait d'étudier la fonction de comparaison, et de comprendre pourquoi cela arrive. Il est possible que si les machines linux sont à l'aide d'une pré-version 5.3, il y a une certaine différence dans le comportement de certains de la fonction du langage utilisé dans la fonction de comparaison.

1voto

user3740692 Points 1

J'ai constaté qu'en utilisant PHP 5.4, la journalisation avec error_log($message, $message_type, $destination, $extra_headers) cause de cette erreur, lorsque je nettoie les entrées de journal, mon problème est résolu. La journalisation peut être temporairement suspendue en désactivant et en restaurant la journalisation après le tri.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X