0

我刚刚从 .co.uk 切换了 .com,直到今天一切顺利。我运行 SQL 来替换所有相关表中的域,并且sed在使用 cp 将文件移动到 .com 文件夹后,我曾经在服务器上的所有相关 php 文件中执行相同操作。

一切都很好,除了一点点。我使用的文件之一sed是一个序列化的 php 数组,现在Notice: unserialize(): Error at offset 326 of 1551099 bytes in reallylongfilename.php on line当我尝试反序列化它时 php 会抛出。

我刚刚在 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 脚本来做同样的工作时,我很感激收到任何帮助。

4

2 回答 2

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);
于 2013-01-02T13:59:52.103 回答
-1

将您的序列化文件恢复到备份版本,取消序列化,手动更改域并重新序列化。

或者,自己修改序列化变量。要做到这一点,您所要做的就是找到提到 .com 的地方,并将该字符串前面的 s: SOME_NUMBER :" 降低 2(因此,如果它是 16,它应该是 14,等等)作为 .co。 uk 比 .com 长 2 个字符

于 2013-01-02T13:54:46.137 回答