1

CakePHP 2.1 を使用して、destroy() および gc() で追加のクリーンアップを実行するカスタム セッション ハンドラーを作成し、セッションをデータベースに保持したいと考えています。http://book.cakephp.org/2.0/en/development/sessions.htmlの例に従っているので、次のように定義しました。

class CustomSession extends DatabaseSession implements CakeSessionHandlerInterface { ...

必要な追加のクリーンアップは、データベースの Cake_sessions テーブルのデータ フィールドから取得したいセッション変数によって異なります。CakePHP - データベースの管理 CakeSessionsから、このデータは PHP の serial() 関数の結果であり、unserial() を使用して以前にシリアル化されたデータのオブジェクトを取得できることを理解しています。ただし、cake_sessions からのデータに対して unserial() を使用すると、常に次の結果になります。

Notice: unserialize() [function.unserialize]: Error at offset 0 of 159 byte

CakePHP の外では、次のように記述しました。

$query = "SELECT * FROM testdb.cake_sessions WHERE id = 'b5d4vc0143ruh420hmkvl7s722'";
$result = mysqli_query($conn, $query);
$row = mysqli_fetch_assoc($result);
echo '<pre>' . print_r($row['data']) . '</pre>';
$session_vars = unserialize($row['data']);
echo '<pre>' . $session_vars . '</pre>';

上記は、cake_sessions テーブルからシリアル化されたデータ フィールドを出力しますが、前述のエラーのため、シリアル化されていないオブジェクトは出力しません。一部のフォーラムの投稿では、これは MySQL の問題であり、データ フィールドの型としてテキストではなく blob を使用すると述べていますが、違いはありませんでした。

Cake_sessions から取得したデータ フィールドのテスト例は次のとおりです。

    Config|a:3{s:9:"userAgent";s:32:"d7e7d243e8bfaf713b70bde2a6ef1c18";s:4:"time";i:1341540422;s:9:"countdown";i:10;}Customer|a:2:{s:4:"cart";i:1;s:4:"test";i:2;}

シリアライゼーションの意味は明らかなので、手で解析することもできますが、そうはしません。

unserial() が機能しないのはなぜですか?また、機能するデータを非シリアル化するための既存の PHP 関数があるのですか?

4

0 に答える 0