Linuxサーバーで正常に動作するWebアプリケーションがありますが、Zend Community Editionサーバーを搭載したMac OSでPHP 5.3を使用して実行すると、エラーが発生します。
usort():ユーザー比較関数によって配列が変更されました
ページが初めて読み込まれるたび(ページがティックオーバーして読み込まれるまで約2分かかります。Linuxサーバーでは、ページは1秒で読み込まれます)。
他の誰かがこれを経験したり、問題を解決する方法を知っている場合、PHPとApacheのメモリ設定を試してみたが、運が悪かった。
PHPバグがあり、配列を変更しなくても、この警告が発生する可能性があります。
短いバージョン、PHP=デバッグ関数がソート配列を検査する場合、それらは参照カウントを変更し、usort()
をトリックして、データを変更したと考えます。
したがって、ソート関数(またはそこから呼び出されるコード)で次のいずれかを実行すると、警告が表示されます。
var_dump
_または_print_r
_を呼び出すdebug_backtrace()
を呼び出すバグはすべてのPHP 5バージョン> = 5.2.11に影響しますが、PHP> = 7.には影響しません。 バグレポート を参照してください)詳細については。
私の知る限り、唯一の回避策は「それを行わない」(これは例外としては難しい)、またはエラー抑制演算子@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()に渡す比較関数がソートしようとしている配列を変更するであることを示しています。これにより、usortに長い時間がかかる可能性があります。
私の最初のステップは、比較関数を研究し、それがなぜ起こっているのかを理解することです。 Linuxボックスが5.3より前のバージョンを使用している場合、比較関数で使用される一部の言語関数の動作に多少の違いがある可能性があります。
PHP5.4を使用してerror_log($message, $message_type, $destination, $extra_headers)
でロギングすると、このエラーが発生することがわかりました。問題を解決したログエントリを消去すると、ソート後にロギングを無効にして復元すると、ロギングが一時的に停止する場合があります。