したがって、PHPセッションがデータベース(MongoDB)に複数回保存され、すべて同じIDで保存されるという奇妙な問題があります。最初のレコードには正しいセッション データがありますが、2 番目のレコードには間違ったセッション データがあります。これにより、最新のレコードを取得しているため、次のページ (または次の AJAX 呼び出し) でセッションがすぐに失敗します。
これが私のセッションini設定です:
array(
'session.auto_start' => '0',
'session.bug_compat_42' => '',
'session.bug_compat_warn' => '',
'session.cache_expire' => '180',
'session.cache_limiter' => 'must-revalidate',
'session.cookie_domain' => '',
'session.cookie_httponly' => '1',
'session.cookie_lifetime' => '0',
'session.cookie_path' => '/',
'session.cookie_secure' => '1',
'session.entropy_file' => '',
'session.entropy_length' => '0',
'session.gc_divisor' => '1000',
'session.gc_maxlifetime' => '14400',
'session.gc_probability' => '1',
'session.hash_bits_per_character' => '5',
'session.hash_function' => '0',
'session.name' => 'Game',
'session.referer_check' => '',
'session.save_handler' => 'user',
'session.save_path' => '/var/lib/php/session',
'session.serialize_handler' => 'php',
'session.use_cookies' => '1',
'session.use_only_cookies' => '1',
'session.use_trans_sid' => '0'
)
そして私のCakePHP設定:
Configure::write('Session', array(
'cookie' => PROJECT,
'checkAgent' => false,
'autoRegenerate' => false, // We don't want it to regenerate
'defaults' => 'database',
'handler' => array(
'engine' => 'DatabaseSession',
'model' => 'Session'
),
'ini' => array(
'session.cookie_lifetime' => 0, // Until the browser is closed
'session.cookie_httponly' => true,
'session.referer_check' => '',
'session.cache_limiter' => 'nocache'
),
));
データベース内の複数のレコードの例を次に示します (ID は同じですが、内容が異なることに注意してください)。
{ "_id" : ObjectId("5011b8c9564d444d04000083"), "id" : "mnor9aspiacp3g41qq8g0fotk2", "data" : "Config|a:3:{s:9:\"userAgent\";s:0:\"\";s:4:\"time\";i:1343353096;s:9:\"countdown\";i:10;}fb_466806330012492_code|s:74:\"2.AQC3yKQXi2e-6_VjI.3600.1343343600.1-672639577|pkfXkSypomU_3RY2-xM3A93rGrVo\";fb_4668063X30012492_access_token|s:110:\"AAAGojtF6Xs0wBAIoUwOoMU3WIt4ZBAih0NUvwtGePBxYv6oOT1QvbEZAb77j2h8ZBXKnpHrXktxHmz1WXCyr5VR9RwdaiGzrxfNRgEPr06gAZDZD\";fb_466806330012492_user_id|s:9:\"xxxx\";Game|a:6:{s:7:\"user_id\";s:24:\"4ff60631ec0f92c5690002a6\";s:9:\"player_id\";s:24:\"4ff60631ec0f92c5690002a7\";s:7:\"game_id\";s:24:\"5009ce57d09b3efe03000000\";s:11:\"facebook_id\";s:9:\"xxx\";s:11:\"accessToken\";s:110:\"AAAGoXjtF6s0wBAIoUwOoMXU3WIt4ZBAih0NUvwXtGePBxYv6oOT1QvbEZAb77j2h8ZBKnpHrXktxHmz1WCyr5VR9RwdaiGzrxfNRgEXPr06gAZDZD\";s:5:\"round\";i:1;}", "expires" : NumberLong(1343338697), "modified" : ISODate("2012-07-26T21:38:17.083Z"), "created" : ISODate("2012-07-26T21:38:17.083Z") }
{ "_id" : ObjectId("5011b8ca564d445c0400008f"), "id" : "mnor9aspiacp3g41qq8g0fotk2", "data" : "Config|a:3:{s:9:\"userAgent\";s:0:\"\";s:4:\"time\";i:1343353098;s:9:\"countdown\";i:10;}", "expires" : NumberLong(1343338698), "modified" : ISODate("2012-07-26T21:38:18.689Z"), "created" : ISODate("2012-07-26T21:38:18.689Z") }
私はこの問題を理解できないようです。memcache ストレージに切り替えてみましたが、同じことが起こります。さらに注意すべき点がいくつかあります。
- サイトは HTTPS を使用しています
- セッションに追加するFacebook APIを使用していますが、最初にアプリセッションを作成しています
- セッション ID を持つ Cookie は存在し、すべてのリクエストのすべてのヘッダーに渡されます
- Amazon EC2 で実行しています
私のini設定が正しいように見えるので、ここでアイデアが不足しています。操作の順序が正しいことを確認するために、アプリ全体にデバッグステートメントを配置しました。これまでのところ、すべてが良さそうです。