2011-04-11 53 views
2

我有Drupal 6.20的問題。PHP unserialize():錯誤在偏移量

可能在PHP更新後,網站停止工作。我得到:

Notice: unserialize() [function.unserialize]: Error at offset 0 of 22765 bytes in /PATH/includes/cache.inc on line 33 

這是該行:

$cache->data = unserialize($cache->data); 

我希望得到任何幫助。

+0

這是從數據庫中走出來嗎?在升級過程中,序列化字符串中可能會出現一些額外的字符。正如@Udo G所說,最好在這裏發佈'var_dump($ cache-> data)'的結果。 – Treffynnon 2011-04-11 15:46:15

+0

見:http://stackoverflow.com/a/10152996/1226894 – Baba 2012-10-03 15:18:46

回答

0

試試var_dump($cache->data)。這可能是PHP由於魔術引號或類似引用而添加了轉義序列和/或引號。

+0

我得到的字母/數字與說明的隨機序列(它的一個很長的字符串): 串(22765) 「x613 並與結束: 3b7d「 – user21897190 2011-04-11 15:44:34

+0

據我所知,任何序列化的數據都以」'X:n'「的形式開始(以';'或'}'結尾),其中'X'是類型,'n'是長度。例如'a:1','i:123'。顯然'$ cache-> data'的值是完全錯誤的。你應該檢查數據來自哪裏。 – 2011-04-11 15:49:07

4

聽起來像你的Drupal緩存已損壞。

直接的解決方案是清除緩存。清除Drupal緩存的三種方法:

  1. 使用管理員密碼登錄網站,並從菜單中選擇flush caches選項。這顯然只有在您首先能夠進入該網站時纔有可能。

  2. 如果您不能這樣做,您可以使用Drush命令行實用程序清除兌現而無需轉到該網站。

  3. 如果你甚至不能讓Drush工作(或者你只是不想安裝它),你可以通過訪問你最喜歡的MySQL工具中的數據庫並清空所有表其名稱以「cache_」開頭。

真正的問題是爲什麼這會發生在第一位。可悲的是,我不能回答,沒有lot有關您的設置的更多信息(並可能花費一些時間調查)。

危險之處在於,即使您清除了緩存之後,也可能會再次出現相同的錯誤,因此即使您再次使用該緩存,也應該仔細研究一下,看看您是否可以找出根本原因。

我的猜測會是一個有錯誤的rouge模塊,它會將錯誤的數據寫入緩存。你可能想要檢查drupal站點和Google來檢查你正在使用的模塊,看看是否有任何報告過類似的行爲。另外,你提到了一個PHP更新:請讓我們知道你從哪個版本的PHP去和去。在PHP 5.3中有一些Drupal 6模塊存在已知的問題,儘管核心支持它。有關更多信息,請參閱http://drupal.org/requirements

+0

你所說的一切,但沒有工作。每次點擊鏈接之前,我都必須刪除緩存,但是在禁用緩存的情況下。 此外,還有很多psql相關的錯誤... – user21897190 2011-04-11 16:41:03

11

當你運行PostgreSQL 9.0的Drupal 6.x時會發生這個問題,因爲bytea類型已被修改。
這裏有一些建議的解決方案:http://postgresql.1045698.n5.nabble.com/Bytea-error-in-PostgreSQL-9-0-td3304087.html - (喜歡到Wayback機器)

運行該數據庫上應該修復它:

ALTER DATABASE databasename SET bytea_output='escape'; 
+1

經過這麼多的搜索,這是唯一的解決方案,幫助。這應該被標記爲**答案**。 – RNickMcCandless 2014-03-05 01:57:21

0

這是因爲你的陣列內不良數據的可能,你可以這樣修復它:

$data= preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'",   $cache->data); 
    $s_data= unserialize($data);