我正在使用CodeIgniter开发一个项目。因为CI Session类使用Cookie来存储数据,而Cookie只能容纳4KB的数据,所以我决定使用Native PHP Session来存储数据。
我的问题是:有时存储在Session中的数据会丢失,但我对导致它的原因没有任何想法。
让我解释一下我所做的更详细:
在产品详情页面中:客户决定购买此产品 - >他/她点击“添加到购物车”按钮 - >产品信息将存储在会话中。现在让我们点击“下一步”按钮
转到“查看购物车”页面:我使用存储在会话中的数据(例如product_id)并从数据库中获取一些额外数据以供客户显示。现在让我们点击“下一步”按钮
在此步骤中,客户必须保留他/她的信息(姓名,电话,电子邮件,地址)以便传送,并将其保存在会话变量名称$ _SESSION ['customer_info']中。现在让我们点击“下一步”按钮
在此步骤中,客户将选择付款方式,查看他/她的订单明细和递送信息(这意味着SESSION正在运行)。让我们点击“Checkout”按钮并转到最后一步
当客户点击“Checkout”时,我打电话给AJAX,将payment_method发布到例如“frontend / cart / checkout”功能。
在此功能中,我提取存储在SESSION中的信息(购物车项目,客户信息)并将其保存到数据库,然后将有关订单详细信息的电子邮件发送给客户。 电子邮件内容包含以下信息:产品(数量,金额,名称,...)和客户的交付信息(姓名,地址,电子邮件,电话)。我还将电子邮件内容保存到数据库中(只是为了确保我不会丢失任何信息)。
问题是:有时(仅在有时),交付信息是空的(我的意思是电子邮件中的交付信息,甚至在数据库中,它都是空的)但是购物车项目仍然存在。 :(这对我来说真的很奇怪。
有任何想法或建议吗?
提前致谢!
答案 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可能会有所帮助。