2

したがって、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設定が正しいように見えるので、ここでアイデアが不足しています。操作の順序が正しいことを確認するために、アプリ全体にデバッグステートメントを配置しました。これまでのところ、すべてが良さそうです。

4

1 に答える 1

0

mongodb 側では、ensureIndex({id: 1}, {unique: true}) を使用して、挿入が行われないようにすることができます。

于 2013-12-14T06:01:51.357 に答える