2010-07-13 54 views
45

我有一個Web應用程序,在我們的Linux服務器上運行良好,但是在使用PHP 5.3的Zend Community Edition Server上運行Mac OS時,我們得到以下錯誤:usort():Array被用戶比較函數修改

usort(): Array was modified by the user comparison function

每次頁面首次加載時(大約2分鐘內頁面打勾並加載,在Linux服務器上頁面在1秒內加載)。

有沒有其他人經歷過這個或有任何想法如何我可以解決這個問題,我試圖玩弄PHP和Apache的內存設置沒有運氣。

回答

1

什麼版本的PHP在Linux上?

兩個盒子上的error_reporting級別是否相同?嘗試將它們都設置爲E_ALL。

該警告幾乎肯定不是說謊。這是說,你傳遞給usort()的比較函數是,正在改變你試圖排序的數組 - 這肯定會讓usort花費很長時間,可能永遠!

我的第一步是研究比較函數,並找出原因。如果linux系統使用的是5.3之前的版本,那麼在比較函數中使用的某些語言函數的行爲可能會有所不同。

+0

這兩個服務器上的PHP版本是PHP 5.3.2。我將檢查比較功能。 – Michael 2010-07-13 08:43:02

+0

如果版本相同,我會非常希望確保代碼實際上是相同的,並且任何輸入都是相同的。但看看警告指出你是一個好地方開始。如果您自己沒有發現問題,則可能需要將比較函數和一些示例數據粘貼到問題中。 – timdev 2010-07-13 08:44:27

+1

這幾乎肯定是我的經驗錯誤報告 – calumbrodie 2011-08-03 10:31:39

3

當PHP在我的回調函數中拋出一個錯誤時,我遇到了這個問題。因此,而不是隨地吐痰這是發生實際的錯誤,PHP會拋出:

usort(): Array was modified by the user comparison function

+1

這不是askinig一個新的問題。它正在描述一種導致與OP提出的問題相同的警告的情況。 – fracz 2017-02-04 18:26:48

85

有一個PHP錯誤,可能導致此警告,即使你不改變陣列。

簡短版本,如果有任何PHP調試功能檢查排序數組,他們將更改引用計數,並詭計usort(),認爲您已更改數據。

  • 對任何類型的數據
  • 調用debug_backtrace()的通話var_dumpprint_r

    所以,你會做任何在你的排序功能下面(或者從它調用的任何代碼)得到的警告

  • 拋出一個異常 - 任何異常 - 甚至只是一種例外

bug是https://bugs.php.net/bug.php?id=50688 它影響所有PHP版本> = 5.2.11(包括5.3。*和可能5. *和6)。

截至2015年1月,它仍然開放。

就我所見,唯一的解決方法是「不要這樣做」(這對於例外來說很難),或者使用錯誤抑制運算符@usort()忽略所有錯誤。

+12

讓我們爲那個bug投票成爲固定的人。 https://bugs.php.net/bug.php?id=50688 – 2012-08-16 18:47:19

+2

我只是想補充一點,你不需要拋出異常。使用新的簡單創建,也會觸發警告。 – qbolec 2013-07-09 07:15:52

+0

sprintf也會觸發這個嗎?此錯誤出現在Wordpress 4.0管理儀表板上...引用的文件是在線** 1208 **上的wp-includes \ class-wp-theme.php,並且使用uasort的函數由'wp-admin \包括\ theme.php和其他兩個文件每個都有一個...所有這些文件都有sprintfs,但沒有print_r/var_dump/debug的東西或引發。現在我使用'@ uasort'來忽略你的建議,它不會再把儀表板搞砸了。 – Armfoot 2014-09-09 20:35:20

8

要解決這個問題,我們可以如下處理

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); 
1

我發現,使用PHP5.4,與error_log($message, $message_type, $destination, $extra_headers)記錄導致此錯誤,當我清理日誌條目我的問題解決。通過在排序功能之後禁用和恢復日誌記錄,日誌記錄可能暫時中止。