2013-01-02 40 views
0

我剛剛從.co.uk切換.com,一切都很順利,直到今天。我運行SQL來替換所有相關表中的域,並且在使用cp將文件移動到.com文件夾後,我使用sed在服務器上的所有相關php文件中執行相同操作。bash sed在序列化數組中導致錯誤

一切都很好,除了一個小方面。我在sed上使用的其中一個文件是一個序列化的php數組,現在當我嘗試反序列化時,php會拋出Notice: unserialize(): Error at offset 326 of 1551099 bytes in reallylongfilename.php on line

我剛剛在sed之前從舊服務器測試過這個文件,它反序列化沒有問題,但後來我運行了sed並且失敗了。我使用sed命令是:

sudo find /var/www/vhosts/spotthedog.com/httpdocs/wp-content/feedgenerator -name 'propdetails.php' -type f -exec sed -i 's/spotthedog.co.uk/spotthedog.com/g' {} \; 

我是相當新的命令行上工作,所以任何幫助感激地接受,因爲我考慮寫一個PHP腳本做同樣的工作。

+0

沒有訪問到實際的違規代碼,這是幾乎不可能診斷。你不是逃避點,所以這是一個公平的猜測,一些實際的程序代碼語句碰巧包含「co」和「uk」與他們之間的字符。 – tripleee

+0

「reallylongfilename.php」的內容是什麼?它包含**序列化數據**還是有PHP代碼?它是一個數據文件還是PHP文件? –

回答

-1

將您的序列化文件恢復爲備份版本,反序列化它,手動更改域並重新進行串行化。

或者,自己修改序列化變量。要做到這一點,你所要做的就是找到提及.com的地方,並降低s:SOME_NUMBER:「在該字符串之前2(如果它是16,則應該是14等)。 co.uk比.COM

+0

恐怕它不止一個文件,但都是同一種數據。我相信sed可以用來做這件事,它只是需要一個更有經驗的人來調整,而不是我 –

+0

你必須匹配s之後的數字,例如:s:([0-9] +):「並從你的替換中減去2 –

4

序列化的數據看起來像字符串,因爲我們可以看到它。但它不是字符串的。serialize()店串的長度字符串類型的數據。

長2個字符
php > echo serialize("spotthedog.com"); 
s:14:"spotthedog.com"; 
php > echo serialize("spotthedog.co.uk"); 
s:16:"spotthedog.co.uk"; 
php > 

你正在替換字符串,但不是長度,因此錯誤,你不應該執行字符串操作(例如替換)不是字符串的數據。

你最好先反序列化它們。然後使用var_export/json_encode導出它們。並在其上運行sed

另一個hacky選項將使用array_map_recursive在它被反序列化的文件中。呼籲它取代所有的域名

function array_map_recursive($fn, $arr) { 
    $rarr = array(); 
    foreach ($arr as $k => $v) { 
     $rarr[$k] = is_array($v) 
      ? array_map_recursive($fn, $v) 
      : $fn($v); // or call_user_func($fn, $v) 
    } 
    return $rarr; 
} 

$arr = array_walk_recursive(function($val){ 
    return is_string($val)? 
      str_replace("spotthedog.com", "spotthedog.co.uk", $val): $val; 
}, $arr); 
+0

謝謝。我喜歡PHP的數組函數,但我希望能夠在命令行上快速完成這一操作。一個命令將文件從.co.uk複製到.com然後下一個代替。我正在寫PHP腳本來做反序列化,替換,然後序列化現在 –

+0

'我正在寫PHP腳本來做反序列化,替換然後序列化現在'。那是正確的方法來解決它。你不能對打包的數據執行字符串操作,看起來像字符串,但它們不是。下次嘗試使用json_encode。 –

相關問題