web-dev-qa-db-ja.com

サイトを新しいサーバーに移行した後に通知が届くのはなぜですか?

サイトを新しいサーバーに移行した後、このエラーが発生します。

通知:unserialize()[function.unserialize]:行478のinclude/bootstrap.incの23バイトのオフセット2でのエラー

どこかで設定が壊れていると思います。ただし、サイトは正しく機能しているようです。匿名ユーザーの場合、このエラーは一貫性のない状態で返されるので、注意する必要があります。
古いサーバーではエラーは発生しません。

私はサーバーを完全に制御しています。新旧両方がAmazon EC2 VMです。インフラストラクチャの主な違いは、古いサーバーが同じVMでMySQL DBを使用していたのに対し、新しいサーバーはRBSでMySQLサーバーを使用していることです。

この問題は、SQLのエクスポート/インポートプロセスと、UTF8に関する何かが原因で発生する可能性があることをどこかで読んだことがあります。従うべき指示に組み込むことができるものは何も得ることができませんでしたが、私が取らなければならない道であると感じています。どこから始めればいいのか本当にわからない。

2
DanH

問題は、新しいサーバーでエラー処理設定が変更された可能性があります。おそらく、変数テーブルに壊れていない変数があり、これを未滅菌にすることはできません。 変数チェックモジュール を使用してみてください。

5
Adam S

これはデバッグがやや難しいですが、シリアル化解除が発生する場所で_includes/bootstrap.inc_を編集する可能性があります。これは、エラーが発生すると想定するvariable_init()関数からのものです。

元のコードは次のようになります。

_while ($variable = db_fetch_object($result)) {
  $variables[$variable->name] = unserialize($variable->value);
}
_

次のように変更してみてください。

_while ($variable = db_fetch_object($result)) {
  $variables[$variable->name] = unserialize($variable->value);

  if (!$variables[$variable->name]) {
    drupal_set_message('Possible error while decoding ' . $variable->name);
  }
}
_

一部の値が実際にはFALSEまたは0であることを考えると、ここではいくつかの誤検知がありますが、フィールドが狭くなり、壊れた変数を特定するのに役立ちます。次に、データベースの変数テーブルを調べて、それを見つけて修正します。

3
mikl

データベースをステージングからライブに移行し、パスやドメイン名などのデータベースを手動で編集しなければならないときに、これが発生しました。

この場合に発生するのは、search-replaceが変数テーブルの文字列と一致し、行を変更することです。問題は、その長さです(s:の後の数値は変更されないため、 nserialize は失敗します)。

管理メニューから変数エディターにアクセスすると、実際の変数があった場所に空白のエントリが表示される可能性があります。ここで更新して保存するか、MySQLツールを使用してその行の長さを修正してください。

2
mpdonadio