web-dev-qa-db-fra.com

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

J'ai une application Web qui fonctionne correctement sur nos serveurs Linux mais lors de l'exécution sur Mac OS avec le serveur Zend Community Edition en utilisant PHP 5.3 nous obtenons l'erreur:

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

à chaque fois qu'une page se charge pour la première fois (il faut environ 2 minutes pour qu'une page soit cochée et chargée, sur les serveurs Linux la page se charge en 1 seconde).

Quelqu'un d'autre a-t-il vécu cela ou a-t-il une idée de la façon dont je peux résoudre le problème, j'ai essayé de jouer avec PHP et les paramètres de mémoire Apache sans succès.

46
Michael

Il existe un bug PHP qui peut provoquer cet avertissement, même si vous ne modifiez pas le tableau.

Version courte, le cas échéant PHP examinent le tableau de tri, elles changeront le nombre de références et tromperont usort() en pensant que vous avez modifié les données.

Vous obtiendrez donc cet avertissement en effectuant l'une des opérations suivantes dans votre fonction de tri (ou tout code appelé depuis celle-ci):

  • appelant var_dump ou print_r sur l'une des données de tri
  • appel de debug_backtrace()
  • lever une exception - n'importe quelle exception - ou même simplement créer une exception

Le bogue affecte tous PHP 5 versions> = 5.2.11 mais n'affecte pas PHP> = 7. Voir le rapport de bogue pour plus de détails.

Pour autant que je puisse voir, la seule solution de contournement est soit "ne pas faire ça" (ce qui est un peu difficile pour les exceptions), soit utiliser l'opérateur de suppression d'erreur @usort() pour ignorer toutes les erreurs.

85
Achronos

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

1) utilisez error_reporting

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

2) utilisez @usort($a);

$a = array('id' => 2,'val' => 3, 'ind' => 3);
@usort($a);
8
panditharshad

J'ai rencontré ce problème lorsque PHP lançait une erreur dans ma fonction de rappel. Donc, plutôt que de cracher l'erreur réelle qui se produisait, PHP lancerait:

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

3
chriswoodford

Quelle version de PHP est sur la boîte Linux?

Les niveaux error_reporting sont-ils les mêmes sur les deux cases? Essayez de les définir tous les deux sur E_ALL.

L'avertissement ne ment certainement pas. Cela signifie que la fonction de comparaison que vous passez à usort () est en changeant le tableau que vous essayez de trier - cela pourrait définitivement faire que l'usort prenne beaucoup de temps, peut-être pour toujours!

Ma première étape serait d'étudier la fonction de comparaison et de comprendre pourquoi cela se produit. Il est possible que si les boîtiers Linux utilisent une version antérieure à 5.3, il existe une certaine différence dans le comportement de certaines fonctions de langage utilisées dans la fonction de comparaison.

1
timdev

J'ai trouvé que l'utilisation de PHP5.4, la journalisation avec error_log($message, $message_type, $destination, $extra_headers) provoque 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 la fonction de tri.

1
user3740692