0

.com を .co.uk から切り替えたばかりで、今日まですべてがうまくいきました。SQL を実行して、関連するすべてのテーブルのドメインを置き換えましたsed。cp を使用してファイルを .com フォルダーに移動した後、サーバー上の関連するすべての php ファイルで同じことを行っていました。

1つの小さな側面を除いて、すべてが順調です。私が使用したファイルの 1 つは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します。

別のハッキーなオプションは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 にする必要があります)。 uk は .com より 2 文字長い

于 2013-01-02T13:54:46.137 に答える