bash sed在序列化数组中导致错误

时间:2013-01-02 13:52:07

标签: php bash ssh sed

我刚从.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脚本来完成同样的工作。

2 个答案:

答案 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个字符