Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php会话不断超时_Php_Session - Fatal编程技术网

php会话不断超时

php会话不断超时,php,session,Php,Session,我有一个问题,我的php会话一直超时。我为一家当地企业制作了一个订购系统,用于查看新的在线订单。当餐厅登录到后端系统时,会话会在一段时间后继续过期。我需要这个过程至少持续15个小时,但如果可能的话是永远 我使用codeignitor 3.1构建系统,我使用的是php会话,而不是codeignitor会话。我在index.php文件中添加了以下内容 ini_set("session.gc_maxlifetime", 2000000); ini_set("session.gc_divisor", "

我有一个问题,我的php会话一直超时。我为一家当地企业制作了一个订购系统,用于查看新的在线订单。当餐厅登录到后端系统时,会话会在一段时间后继续过期。我需要这个过程至少持续15个小时,但如果可能的话是永远

我使用codeignitor 3.1构建系统,我使用的是php会话,而不是codeignitor会话。我在index.php文件中添加了以下内容

ini_set("session.gc_maxlifetime", 2000000);
ini_set("session.gc_divisor", "1");
ini_set("session.gc_probability", "1");
ini_set("session.cookie_lifetime", "0");
ini_set("session.save_path", '/cookie.txt');

phpinfo();
session_start();

Using phpinfo i can see the values change as below
session.cookie_lifetime 0   0
session.cookie_path /   /
session.cookie_secure   Off Off
session.entropy_file    no value    no value
session.entropy_length  0   0
session.gc_divisor  1   1000
session.gc_maxlifetime  2000000 1440
session.gc_probability  1   1
我读了很多文章,但没能保持我的会议。 我正在windows 10 pc上使用xampp进行测试。
谢谢你的帮助。我是一名业余开发人员,这是我的爱好。

保持会话的最好方法是将会话持久化到数据库中。 为此,您需要编写自己的会话处理程序 我编写了一个库,可以帮助您持久化会话 阅读源代码并熟悉其工作原理

在这里,我将解释它是如何工作的。 用于访问数据库的模型类,如下所示

//modelstract.php /* *版权所有c 2012 Ali Ghalambaz * *特此向任何获得副本的人免费授予许可 *本软件及其相关文档文件的处理 *在软件中不受限制,包括但不限于权利 *使用、复制、修改、合并、发布、分发、再许可和/或销售 *软件的副本,并允许向其提供软件的人员 *为此,须符合以下条件: * *上述版权声明和本许可声明应包含在所有 *软件的副本或大部分。 * *本软件按原样提供,无任何形式的明示或明示担保 *默示,包括但不限于适销性保证, *适用于特定目的和非侵权。在任何情况下 *作者或版权持有人应承担任何索赔、损害或其他责任 *无论是在合同诉讼、侵权诉讼或其他诉讼中,由以下原因引起的责任:, *与本软件有关或与本软件的使用或其他交易有关 *软件。 * */ 抽象类模型抽象 { 私有静态$active=数组; 受保护的$connection=null; 公共函数uu构造$auth,$connect_uit=true,$name='noname',$user=null,$engine=null { 如果$connect_ $this->connection=self::connect$auth,$name='noname',$user,$engine; } 受保护的静态函数connect$auth,$name='noname',$user=null,$engine=null { $dsn=self::mysql$auth['name'],$auth['host']; 试一试{ $options=array \PDO::ATTR_EMULATE_PREPARES=>false, \PDO::MYSQL_ATTR_INIT_命令=>'SET NAMES utf8', \PDO::ATTR\u CASE,\PDO::CASE\u NATURAL, \PDO::ATTR_DEFAULT_FETCH_MODE=>\PDO::FETCH_ASSOC, \PDO::ATTR_ERRMODE=>\PDO::ERRMODE_异常 ; $con=new\PDO$dsn、$auth['user']、$auth['pass']、$options; self::$active['connection']=$con; self::$active['name']=$name; self::$active['user']=$user; self::$active['engine']=$engine; 返回$con; }catch\pdo异常$e{ 回显“没有到数据库的链接-稍后再试-”。$e->getMessage; } 返回null; } 私有静态函数mysql$db_name,$host='local',$port=3306 { 返回mysql:host=$host;port=$port;dbname=$db\u name;charset=UTF8; } 受保护的静态函数getActiveConnections { 返回自我::$active; } } 您可以使用更简单的数据库连接。 之后,我们需要一个像这样的会话处理程序类

//MysqlSessionHandler.php /* *学分 * *这个类是由David Powers为管理PHP持久化而创建的 *lynda.com上的课程。它基于 *Symfony HttpFoundation组件https://github.com/symfony/ *HttpFoundation/blob/master/Session/Storage/Handler/PdoSessionHandler.php。 *David Power非常感谢原作者的作品,并且 *在同一MIT许可证下发布此版本。 * *版权c 2004-2015 Fabien Potentier *版权所有c 2015 David Powers *版权c 2017 Ali Ghalambaz * *特此向任何获得副本的人免费授予许可 *本软件及其相关文档文件的处理 *在软件中不受限制,包括但不限于权利 *使用、复制、修改、合并、发布、分发、再许可和/或销售 *软件的副本,并允许向其提供软件的人员 *为此,须符合以下条件: * *上述版权声明和本许可声明应包含在所有 *软件的副本或大部分。 * *本软件按原样提供,无任何形式的明示或明示担保 *小鬼 返回true; }catch\pdo异常$e{ 如果$this->db->inTransaction{ $this->db->rollback; } 扔$e; } } /** *关闭会话并将会话数据写入数据库 * *@returnbool */ 公共功能关闭 { 如果$this->db->inTransaction{ $this->db->commit; }elseif$this->unlockStatements{ 而$unlocksmt=array\u shift$this->unlockStatements{ $unlocksmt->execute; } } 如果$this->properties->isCollectGarbage{ $sql=DELETE FROM.$this->properties->getTableSess.WHERE.$this->properties->getColExpiry.<:time; $stmt=$this->db->prepare$sql; $stmt->bindValue:time',time,\PDO::PARAM\u INT; $stmt->execute; $this->properties->setCollectGarbagefalse; } 返回true; } /** *破坏会话 * *@param int$session\u id *@returnbool */ 公共函数销毁$session\u id { $sql=DELETE FROM.$this->properties->getTableSess.WHERE.$this->properties->getColSid.=:sid; 试一试{ $stmt=$this->db->prepare$sql; $stmt->bindParam':sid',$session\u id; $stmt->execute; }catch\pdo异常$e{ 如果$this->db->inTransaction{ $this->db->rollBack; } 扔$e; } 返回true; } /** *垃圾收集 * *@param int$maxlifetime *@returnbool */ 公共函数gc$maxlifetime { $this->properties->setCollectGarbagetrue; 返回true; } /** *在数据库上执行应用程序级锁定 * *@param$session\u id *@return\PDOStatement准备释放锁的语句 */ 受保护的函数getLock$session\u id { $stmt=$this->db->prepare'SELECT GET_LOCK:key,50'; $stmt->bindValue':键',$session\u id; $stmt->execute; $releaseStmt=$this->db->prepare'DO RELEASE\u LOCK:key'; $releaseStmt->bindValue':键',$session\u id; 返回$releaseStmt; } /** *使用事务时在数据库中注册新会话ID * *对不存在的行的独占读取不会阻塞,因此我们需要 *在提交事务之前插入行。 * *@param\PDOStatement$selectStmt *@返回字符串 */ 受保护的函数初始化记录\PDO语句$selectStmt { 试一试{ $sql=插入到.$this->properties->getTableSess..$this->properties->getColSid.,.$this->properties->getColExpiry.,.$this->properties->getColData。 值:sid,:到期,:数据; $insertStmt=$this->db->prepare$sql; $insertStmt->bindParam':sid',$session\u id; $insertStmt->bindParam':expiry',$this->expiry,\PDO::PARAM_INT; $insertStmt->bindValue':数据'; $insertStmt->execute; 回来 }catch\pdo异常$e{ //如果会话已创建,则捕获重复密钥错误。 如果0==strps$e->getCode,“23”{ //检索当前连接写入的现有会话数据。 $selectStmt->execute; $results=$selectStmt->fetch\PDO::fetch\u ASSOC; 如果$results{ 返回$results[$this->properties->getColData]; } 回来 } //如果错误是由其他原因引起的,则回滚事务。 如果$this->db->inTransaction{ $this->db->rollback; } 扔$e; } } } 和属性类,如果需要的话

//Properties.php /* *版权c 2017 Ali Ghalambaz * *特此向任何获得副本的人免费授予许可 *本软件及其相关文档文件的处理 *在软件中不受限制,包括但不限于权利 *使用、复制、修改、合并、发布、分发、再许可和/或销售 *软件的副本,并允许向其提供软件的人员 *为此,须符合以下条件: * *上述版权声明和本许可声明应包含在所有 *软件的副本或大部分。 * *本软件按原样提供,无任何形式的明示或明示担保 *默示,包括但不限于适销性保证, *适用于特定目的和非侵权。在任何情况下 *作者或版权持有人应承担任何索赔、损害或其他责任 *无论是在合同诉讼、侵权诉讼或其他诉讼中,由以下原因引起的责任:, *与本软件有关或与本软件的使用或其他交易有关 * 软件。 * */ 类属性 { /** *@返回字符串 */ 公共函数getCookie { 返回$this->cookie; } /** *@param string$cookie *@return属性 */ 公共函数setCookie$cookie { $this->cookie=$cookie; 退还$this; } /** *@返回字符串 */ 公共功能可获取性 { 返回$this->table_sess; } /** *@param string$table_sess *@return属性 */ 公共函数setTableess$table_sess { $this->table_sess=$table_sess; 退还$this; } /** *@返回字符串 */ 公共函数getTableUsers { 返回$this->table\u用户; } /** *@param string$table_用户 *@return属性 */ 公共函数setTableUsers$table_users { $this->table_users=$table_users; 退还$this; } /** *@返回字符串 */ 公共函数gettablegin { 返回$this->table\u; } /** *@param string$table\u *@return属性 */ 公共函数setTableAutologin$table_autologin { $this->table_autologin=$table_autologin; 退还$this; } /** *@返回字符串 */ 公共函数getColSid { 返回$this->col_sid; } /** *@param string$col_sid *@return属性 */ 公共函数setColSid$colu sid { $this->col\u sid=$col\u sid; 退还$this; } /** *@返回字符串 */ 公共函数getColExpiry { 返回$this->col_expiration; } /** *@param字符串$col_过期 *@return属性 */ 公共函数setColExpiry$colu过期 { $this->col\u expiration=$col\u expiration; 退还$this; } /** *@返回字符串 */ 公共函数getColUkey { 返回$this->col_ukey; } /** *@param string$col_ukey *@return属性 */ 公共函数setColUkey$colu_key { $this->col_ukey=$col_ukey; 退还$this; } /** *@返回字符串 */ 公共函数getSessUkey { 返回$this->sess_ukey; } /** *@param string$sess_ukey *@return属性 */ 公共功能设置sessukey$sess_key { $this->sess_ukey=$sess_ukey; 退还$this; } /** *@返回字符串 */ 公共函数getColUsername { 返回$this->col\u name; } /** *@param string$col_name *@return属性 */ 公共函数setColUsername$colu name { $this->col\u name=$col\u name; 退还$this; } /** *@返回字符串 */ 公共函数getColData { 返回$this->col_数据; } /** *@param string$col_数据 *@return属性 */ 公共函数setColData$colu data { $this->col\u data=$col\u data; 退还$this; } /** *@返回字符串 */ 公共函数getColToken { 返回$this->col_令牌; } /** *@param string$col_令牌 *@return属性 */ 公共函数setColToken$col_token { $this->col\u token=$col\u token; 退还$this; } /** *@返回字符串 */ 公共函数getColCreated { 返回$this->col_created; } /** *@param string$col_已创建 *@return属性 */ 公共函数setColCreated$col_created { $this->col\u created=$col\u created; 退还$this; } /** *@返回字符串 */ 公共函数getColUsed { 返回$this->col_used; } /** *@param string$col_已使用 *@return属性 */ 公共函数setColUsed$colu used { $this->col\u used=$col\u used; 退还$this; } /** *@返回字符串 */ 公共函数getSessPersist { 返回$this->sess\u persist; } /** *@param string$sess\u *@return属性 */ 公共函数setSessPersist$sess_persist { $this->sess\u persist=$sess\u persist; 退还$this; } /** *@返回字符串 */ 公共函数getSessUname { 返回$this->sess\u uname; } /** *@param string$sess_uname *@return属性 */ 公共函数设置sessuname$sess_uname { $this->sess\u uname=$sess\u uname; 退还$this; } /** *@返回字符串 */ 公共函数getSessAuth { 返回$this->sess\u auth; } /** *@param string$sess\u auth *@return属性 */ 公共函数setssesauth$sess_auth { $this->sess\u auth=$sess\u auth; 退还$this; } /** *@返回字符串 * / 公共函数GetSessReseValid { 返回$this->sess\u revalid; } /** *@param string$sess\u revalid *@return属性 */ 公共函数setssesrevalid$sess_revalid { $this->sess\u revalid=$sess\u revalid; 退还$this; } /** *@返回混合 */ 公共函数getDb { 返回$this->db; } /** *@param$db_用户 *@param$db_pass *@param$db_name *@param string$db_主机 *@return属性 */ 公共函数setDb$db\u user、$db\u pass、$db\u name、$db\u host='localhost' { $this->db=array'user'=>$db\u user,'pass'=>$db\u pass,'name'=>$db\u name,'host'=>$db\u host; 退还$this; } /** *@returnbool */ 公共功能用于事务处理 { 返回$this->useTransactions; } /** *@param bool$useTransactions *@return属性 */ 公共函数setUseTransactions$useTransactions { $this->useTransactions=$useTransactions; 退还$this; } /** *@returnbool */ 公共功能是收集垃圾 { 返回$this->collectGarbage; } /** *@param bool$collectGarbage *@return属性 */ 公共函数setCollectGarbage$collectGarbage { $this->collectGarbage=$collectGarbage; 退还$this; } /** *@var自动登录cookie的字符串名称 */ 受保护的$cookie='记住我的身份'; /** *@var字符串存储会话数据的默认表 */ 受保护的$table_sess='tbl_acl_sessions'; /** *@var存储用户凭据的数据库表的字符串名称 */ 受保护的$table_users='tbl_acl_users'; /** *@var存储自动登录详细信息的数据库表的字符串名称 */ 受保护的$table_autologin='tbl_acl_autologin'; /** *@var字符串会话ID的默认列 */ 受保护的$col_sid='sid'; /** *@var字符串到期时间戳的默认列 */ 受保护的$col_到期='到期'; /** *@var字符串存储用户ID的表列的名称-一个唯一的8字符字母数字字符串 */ 受保护的$col_ukey='id'; 受保护的$sess_ukey='userkey'; /** *@var存储用户用户名的表列的字符串名称 */ 受保护的$col_name='username'; /** *@var字符串会话数据的默认列 */ 受保护的$col_data='data'; /** *@var存储32个字符的一次性令牌的表列的字符串名称 */ 受保护的$col_令牌='token'; /** *@var字符串记录创建为MySQL时间戳时存储的表列的名称 */ 受保护的$col_created='created'; /** *@var字符串表列的名称,该表列存储一个布尔值,记录是否使用了令牌 */ 受保护的$col_used='used'; /** *@var字符串会话变量,用于保存数据 */ 受保护的$sess_persist='记住我'; /** *@var字符串会话变量,用于存储用户名 */ 受保护的$sess_uname='username'; /** *@var字符串会话名称,指示用户已通过身份验证 */ 受保护的$sess_auth='authenticated'; /** *@var字符串会话名称,指示用户已重新验证 */ 受保护的$sess_revalid='revalidated'; 受保护$db; /** *@var bool确定是否使用事务 */ 受保护的交易; /** *当PHP启动垃圾收集时@var bool True */ 受保护的$collectGarbage=false; /** *@var int自动登录cookie保持有效的天数 */ 受保护的$lifetimeDays=1000; /** *@return int */ 公共函数getLifetimeDays { 返回$this->lifetimeDays; } /** *@param int$lifetimeDays *@return属性 */ 公共函数setLifetimeDays$lifetimeDays { $this->lifetimeDays=$lifetimeDays; 退还$this; } } 您还需要创建一个数据库表来保存会话数据

- -------------- -tbl_acl_会话的表结构 - -------------- 创建表“tbl\U acl\U会话” `sid`varchar40字符集utf8比较utf8\u常规\u ci不为空, `expiry`int10无符号非空, `数据`文本字符集utf8比较utf8\u常规\u ci不为空, 使用BTREE的主键'sid' ENGINE=MyISAM字符集=utf8 COLLATE=utf8\u常规\u ci行\u格式=动态;
未按您的需要完全自定义。但希望它能有所帮助

可能重复Hi,感谢快速反馈。我理解其中一些,但不清楚的是如何阻止php关闭会话。假设我使用的不是任何数据库,而是一个简单的php文件,那么如何使会话不过期呢。当我说会话未过期时,我的意思是
n仍然可以访问$\u会话变量。再次抱歉,我是个业余爱好者。请检查关闭功能和过期时间嗨,谢谢你的帮助。我的应用程序已经在使用ajax调用,所以我在ajax php函数中添加了session start。我想我不需要这样做,因为session_start已经是index.php的一部分了。