PHP:丢失的会话数​​据(有时)

时间:2014-07-28 05:58:12

标签: php codeigniter session

我正在使用CodeIgniter开发一个项目。因为CI Session类使用Cookie来存储数据,而Cookie只能容纳4KB的数据,所以我决定使用Native PHP Session来存储数据。

我的问题是:有时存储在Session中的数据会丢失,但我对导致它的原因没有任何想法。

让我解释一下我所做的更详细:

  1. 在产品详情页面中:客户决定购买此产品 - >他/她点击“添加到购物车”按钮 - >产品信息将存储在会话中。现在让我们点击“下一步”按钮

  2. 转到“查看购物车”页面:我使用存储在会话中的数据(例如product_id)并从数据库中获取一些额外数据以供客户显示。现在让我们点击“下一步”按钮

  3. 在此步骤中,客户必须保留他/她的信息(姓名,电话,电子邮件,地址)以便传送,并将其保存在会话变量名称$ _SESSION ['customer_info']中。现在让我们点击“下一步”按钮

  4. 在此步骤中,客户将选择付款方式,查看他/她的订单明细和递送信息(这意味着SESSION正在运行)。让我们点击“Checkout”按钮并转到最后一步

  5. 当客户点击“Checkout”时,我打电话给AJAX,将payment_method发布到例如“frontend / cart / checkout”功能。

  6. 在此功能中,我提取存储在SESSION中的信息(购物车项目,客户信息)并将其保存到数据库,然后将有关订单详细信息的电子邮件发送给客户。 电子邮件内容包含以下信息:产品(数量,金额,名称,...)和客户的交付信息(姓名,地址,电子邮件,电话)。我还将电子邮件内容保存到数据库中(只是为了确保我不会丢失任何信息)。

    问题是:有时(仅在有时),交付信息是空的(我的意思是电子邮件中的交付信息,甚至在数据库中,它都是空的)但是购物车项目仍然存在。 :(这对我来说真的很奇怪。

    有任何想法或建议吗?

    提前致谢!

2 个答案:

答案 0 :(得分:1)

您的案例中的解决方案是 store session database ,同时制作一些 config settings config.php


步骤:

1)要在 session data 中保存 database ,您必须在数据库ci_sessions中创建一个表。以下是用于创建它的查询(MySQL),

CREATE TABLE IF NOT EXISTS  `ci_sessions` (
   session_id varchar(40) DEFAULT '0' NOT NULL,
   ip_address varchar(45) DEFAULT '0' NOT NULL,
   user_agent varchar(120) NOT NULL,
   last_activity int(10) unsigned DEFAULT 0 NOT NULL,
   user_data text NOT NULL,
   PRIMARY KEY (session_id),
   KEY `last_activity_idx` (`last_activity`)
);


2)创建数据库表后,您可以在 config.php 中启用数据库选项。

$config['sess_use_database'] = TRUE;

现在会话数据将存储到数据库中。


3)同时确保您已按照配置设置进行操作:

$config['sess_cookie_name']     = 'ci_session';   // cookie name
$config['sess_expiration']      = 0;              // 0 means non-expiring session
$config['sess_expire_on_close'] = FALSE;
$config['sess_encrypt_cookie']  = FALSE;
$config['sess_use_database']    = TRUE;           // set TRUE to use database
$config['sess_table_name']      = 'ci_sessions';  // DB table name
$config['sess_match_ip']        = FALSE;
$config['sess_match_useragent'] = TRUE;
$config['sess_time_to_update']  =  86400 * 30;    // 30 days


会话类的用法:

此外,我发现您仍在使用 $_SESSION[''] 来存储或检索会话数据。请关注Codeigniter的 session class

1)添加会话数据。

$this->session->set_userdata('some_name', 'some_value');


2)检索会话数据。

$this->session->userdata('item');


3)检索所有会话数据(返回会话数据数组)。

$this->session->all_userdata();


4)删除会话数据。

$this->session->unset_userdata('some_name');


5)销毁会话。

$this->session->sess_destroy();


关注文档:

http://ellislab.com/codeigniter/user-guide/libraries/sessions.html

答案 1 :(得分:1)

PHP有可能通过内置会话功能的垃圾收集来清理会话数据。如果您每天有数千甚至更多的访问者,您将更容易观察到会话数据丢失。

只需提示一下,http://php.net/manual/en/session.configuration.php#ini.session.gc-divisor可能会有所帮助。