私的メモ
あるオブジェクトをserializeしてunserializeすると「Couldn’t fetch mysqli」が発生した。
そのオブジェクトはあるテーブルに対するラッパーとして作成したもので、ページ内でこのように使われている。
・ページ1:インスタンス化して、serializeした後でセッション変数に格納
・ページ2:セッション変数から取り出して、unserializeし、使用
このクラスは基底クラスのコンストラクタでDBへの接続をおこない、メソッドではそのDB接続を使って読み書きをおこなう。エラーはページ2で発生する。
ラッパーオブジェクトのコンストラクタで作成されたmysqliオブジェクトはserialize->unserializeのなかでその接続を失うようだ(mysqliオブジェクト自体がSerializableではない模様)。そのためラッパーオブジェクトの基底クラスに__wakeup()を追加してunserialize時に再度mysqliオブジェクトを作成するようにした。
よーく考えたらそりゃそうだろうという話だ。ページをまたがる過程でDB接続を保持したスレッドが死んでいるんだから。