我刚从.co.uk转了一个.com,一切都很顺利,直到今天。我运行SQL来替换所有相关表中的域,并且在使用cp将文件移动到.com文件夹之后,我使用sed
在服务器上的所有相关php文件中执行相同操作。
一切都很好,除了一个小方面。我使用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 :(得分:4)
序列化数据看起来像字符串,因为我们可以读取它。但它根本不是字符串。 serialize()
存储字符串类型数据的字符串长度。
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);
答案 1 :(得分:-1)
将序列化文件还原为备份版本,对其进行反序列化,手动更改域并重新序列化。
或者,自己修改序列化变量。要做到这一点,你所要做的就是找到提到.com的地方,然后将s: SOME_NUMBER :“在该字符串之前减2(所以如果它是16,它应该是14,因为.co.uk比.com
长2个字符