Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.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 某些用户的会话变量消失(drupal)_Php_Drupal_Session - Fatal编程技术网

Php 某些用户的会话变量消失(drupal)

Php 某些用户的会话变量消失(drupal),php,drupal,session,Php,Drupal,Session,我的网站上有一个困扰我好几个月的问题。我一直在回避这个问题,但现在我似乎找不到这样的方法,所以我想为什么不解决这个根本问题呢 我的根本问题是,对于我的一些用户来说,有时并不总是会话数据消失。我知道他们中的大多数肯定启用了cookies。我想这可能是一个会议到期的事情,但我不认为是这样。我设置了很长的过期时间,加上他们的会话被删除的用户数量太高了 我正在使用Drupal6 有什么建议吗?添加ob\u start和session\u start;在脚本的顶部添加ob\u start和session\

我的网站上有一个困扰我好几个月的问题。我一直在回避这个问题,但现在我似乎找不到这样的方法,所以我想为什么不解决这个根本问题呢

我的根本问题是,对于我的一些用户来说,有时并不总是会话数据消失。我知道他们中的大多数肯定启用了cookies。我想这可能是一个会议到期的事情,但我不认为是这样。我设置了很长的过期时间,加上他们的会话被删除的用户数量太高了

我正在使用Drupal6


有什么建议吗?

添加ob\u start和session\u start;在脚本的顶部添加ob\u start和session\u start;在脚本的顶部。

您可能需要检查的内容很少

会话垃圾收集器是如何配置的?请验证PHP设置:session.gc\u maxlifetime、session.gc\u除数、session.session.gc\u概率。这只是猜测,但可能GC正在删除您的数据。 会话表中的数据是否消失?若您使用Drupal的默认会话处理程序,$\u会话表的数据以序列化形式存储在会话表的会话列中。 若数据库中的数据丢失,并且若您能够在开发服务器上重复这个问题,您还可以在mysql服务器配置中为数据库启用查询日志记录,请参阅以获取更多详细信息。启用develmodule后,您可以使用注释(包括有关函数执行查询的信息)来修饰查询中的develmodule设置。这可能会帮助您发现问题。不要尝试生产环境 有时,问题可能是由某个启用的模块引起的,它会破坏$\u会话表。尝试在已启用的模块代码中查找所有$\u会话,尤其是在写入上下文中。一些正则表达式将有助于完成此任务。
你可能想检查的东西很少

会话垃圾收集器是如何配置的?请验证PHP设置:session.gc\u maxlifetime、session.gc\u除数、session.session.gc\u概率。这只是猜测,但可能GC正在删除您的数据。 会话表中的数据是否消失?若您使用Drupal的默认会话处理程序,$\u会话表的数据以序列化形式存储在会话表的会话列中。 若数据库中的数据丢失,并且若您能够在开发服务器上重复这个问题,您还可以在mysql服务器配置中为数据库启用查询日志记录,请参阅以获取更多详细信息。启用develmodule后,您可以使用注释(包括有关函数执行查询的信息)来修饰查询中的develmodule设置。这可能会帮助您发现问题。不要尝试生产环境 有时,问题可能是由某个启用的模块引起的,它会破坏$\u会话表。尝试在已启用的模块代码中查找所有$\u会话,尤其是在写入上下文中。一些正则表达式将有助于完成此任务。
我想这可能是你的问题/解决方案:

简短回答:尝试将sites/default/settings.php中的session.cookie\u life设置为0

详细回答:会话取决于服务器上的会话数据和客户端上的PHP会话cookie。如果将会话cookie生存期设置得太低,Drupal的默认值为23天,因此通常不会出现问题,那么浏览器删除cookie可能会在客户端有效地“销毁”会话,因为它已过期

我曾经遇到过这个问题,因为我将Drupal会话cookie生存期从23天改为更“合适”的时间,试图出于安全原因限制登录持续时间。但降低会话cookie生存期并不是解决方案。最好的方法是限制服务器端的会话持续时间。您可以通过在Drupal设置中将session.gc_maxlifetime设置为类似7200的值,持续2小时来实现这一点。然后,您只需要确保会话垃圾回收足够频繁地运行,以便会话在2小时后可靠地结束

然后,为了避免在客户端销毁cookie时出现问题,您可以将session.cookie\u life设置为0。这将确保,只要用户在网站上,只有在其处于非活动状态的时间超过session.gc_maxlifetime时,才会注销。除此之外,它还会在用户关闭浏览器时注销用户。默认情况下,Drupal不会执行此操作

基本更新:为什么将cookie生存期设置为0是个好主意?否则,服务器将设置客户端需要使cookie过期的日期/时间。 那么,你会说什么?那么,考虑一下这种情况:如果客户端的时钟设置错误,是的,它确实发生了,即使大多数计算机通过NTP更新它们的时间,一些也不!它可能比你想象的要快得多,甚至在到达后。 这正是我曾经调试过的问题

因此,如果遇到奇怪的会话问题,请至少尝试一次cookie生存期0

我想这可能是你的问题/解决方案:

简短回答:尝试将sites/default/settings.php中的session.cookie\u life设置为0

详细回答:会话取决于服务器上的会话数据和客户端上的PHP会话cookie。如果将会话cookie生存期设置得太低,Drupal的默认值为23天,因此通常不会出现问题,那么浏览器删除cookie可能会在客户端有效地“销毁”会话,因为它已过期

我曾经遇到过这个问题,因为我将Drupal会话cookie生存期从23天改为更“合适”的时间,试图出于安全原因限制登录持续时间。但降低会话cookie生存期并不是解决方案。最好的方法是限制服务器端的会话持续时间。您可以通过在Drupal设置中将session.gc_maxlifetime设置为类似7200的值,持续2小时来实现这一点。然后,您只需要确保会话垃圾回收足够频繁地运行,以便会话在2小时后可靠地结束

然后,为了避免在客户端销毁cookie时出现问题,您可以将session.cookie\u life设置为0。这将确保,只要用户在网站上,只有在其处于非活动状态的时间超过session.gc_maxlifetime时,才会注销。除此之外,它还会在用户关闭浏览器时注销用户。默认情况下,Drupal不会执行此操作

基本更新:为什么将cookie生存期设置为0是个好主意?否则,服务器将设置客户端需要使cookie过期的日期/时间。 那么,你会说什么?那么,考虑一下这种情况:如果客户端的时钟设置错误,是的,它确实发生了,即使大多数计算机通过NTP更新它们的时间,一些也不!它可能比你想象的要快得多,甚至在到达后。 这正是我曾经调试过的问题


因此,如果遇到奇怪的会话问题,请至少尝试一次cookie生存期0:

我认为您的问题在于会话保存路径

请在根目录中创建一个名为chmod 777 MUST的文件夹,即.php所在的位置,并放置此代码

if(!is_writable(session_save_path())){
    session_save_path(dirname(__FILE__)."/<xyz>");
}
在开始会话之前


当您的会话设置为使用文件而不是内存时,还会发生另一种情况。

我认为您的问题在于会话保存路径

请在根目录中创建一个名为chmod 777 MUST的文件夹,即.php所在的位置,并放置此代码

if(!is_writable(session_save_path())){
    session_save_path(dirname(__FILE__)."/<xyz>");
}
在开始会话之前


当会话设置为使用文件而不是内存时,还会发生另一种情况。

我曾经遇到过类似的问题,原因是著名的www

该网站可以通过www.example.com和example.com访问,在用户点击一个用oposit域名硬编码的链接之前,这两个网站运行良好。然后他切换了域/子域,apache/php为新域上的用户创建了一个新会话。当人们从付款处回来时,这尤其令人恼火


在我们的案例中,解决方案是始终强制用户仅使用example.com,并禁用或将所有到www.example.com的请求直接重定向到example.com。这样你就永远不会同时在这两个网站上进行会话。

我曾经遇到过类似的问题,原因是著名的www

该网站可以通过www.example.com和example.com访问,在用户点击一个用oposit域名硬编码的链接之前,这两个网站运行良好。然后他切换了域/子域,apache/php为新域上的用户创建了一个新会话。当人们从付款处回来时,这尤其令人恼火


在我们的案例中,解决方案是始终强制用户仅使用example.com,并禁用或将所有到www.example.com的请求直接重定向到example.com。这样你就不会同时在两个平台上获得会话。

我听说Drupal在某些特定PHP版本上存在会话重新生成id问题。你能试着禁用这个功能并测试它吗

我听说过Drupal在某个特定PHP版本中的会话重新生成id问题。你能试着禁用这个功能并测试它吗

我正在跟进这篇文章,因为似乎没有一个答案解决了这个问题。我在D7和mod_fcgi中遇到了类似的问题,因此发现了这个线程,其效果并不局限于Drupal 6,Drupal 8中的临时存储服务可能会缓解这个问题

简而言之,我会把比赛条件视为根本原因。使用Drupal和其他涉及Ajax的框架构建的网站可能会变得复杂,并发访问会话变量。首先,我会使用firefox developer edition、流量分析器等查找长时间运行的请求。例如,可以在站点上的块或其他结构中引入这些请求,其中任何一个都可以访问$\u会话。随后,轮到 f尽可能多的块和菜单,直到问题消失

此外,您可以在函数drupal\u session\u start和drupal\u session\u commit中向includes/session.inc添加一些调试输出。输出应该包含服务器进程的进程ID。查找在显示主要内容很久之后发生的提交

关于可能发生的事情的假设 长时间运行的请求用旧状态覆盖会话变量。这部分是由于Drupal中如何管理会话变量。默认情况下,会话数据作为数据的单个序列化字符串表示形式存储在会话表的会话列中。原则上,读取和写入会话变量应该是一个原子操作,但这并不容易实现。下面的代码来自session.inc,用于处理会话数据的写入。它使用一个时间戳和一个is_change标志来有效地延迟写入。也可以说,会话不是线程安全的。此外,它使用SQL合并语句,但这无法合并序列化的变量;实际上,最新的书面状态就是获胜状态

//出于性能原因,请勿更新会话表,除非 //$\自上次更新以来,会话已更改或已通过180多次。 如果美元被兑换| | |!isset$user->timestamp | | REQUEST_TIME-$user->timestamp>variable_get'session_write_interval',180{ //ssid或sid或两者都将从下面的$key添加。 $fields=数组 'uid'=>$user->uid, 'cache'=>isset$user->cache?$user->cache:0, “主机名”=>ip\U地址, “会话”=>$value, “时间戳”=>请求时间, ; ... db_合并“会话” ->钥匙$key ->字段$fields ->执行; 想象一下以下场景:

主站点内容是一个显示按钮和计数器的模块。计数器存储在$\u会话['counter']中,并通过单击按钮进行递增。该按钮具有一个Ajax回调,可有效执行以下操作

函数计数器{ 如果!drupal\u会话\u已启动{ //必须初始化匿名用户的会话。 drupal_会话_启动; } $\u会话['counter']=isset$\u会话['counter']?$\u会话['counter']+:0; drupal_会话_提交; ... } 在站点页脚中的块中,有一个加载会话数据的块由于任何原因而暂停

功能什么都不做{ 如果!drupal\u会话\u已启动{ //必须初始化匿名用户的会话。 drupal_会话_启动; } $otherdata=$\会话['otherdata']; //做一些需要很长时间,最终完成或失败的事情,比如开始网站搜索: wait200;//可能有效,请求现在比写入延迟默认值180早 $\u SESSION['otherdata']=$otherdata;//SESSION现在也已更新,可能没有必要 返回TRUE; }
因此,一旦加载内容,页脚块将调用do_nothing(不执行任何操作),该操作将挂起超过180秒。同时,用户使用回调增加计数器,但一旦do_nothing完成,整个会话内容将替换为do_nothing请求的会话内容,从而丢失$_会话['counter']

我正在跟进这篇文章,因为似乎没有任何答案解决了问题。我在D7和mod_fcgi中遇到了类似的问题,因此发现了这个线程,其效果并不局限于Drupal 6,Drupal 8中的临时存储服务可能会缓解这一问题

P>简单地说,我认为一个竞赛条件是根本原因。使用Drupal和其他涉及Ajax的框架构建的网站可以成为复杂的兽类,同时访问会话变量。我将首先使用Firefox开发者版、流量分析器等来寻找长时间运行的请求。在站点上的块或其他结构中,其中任何一个都可能访问$\u会话。随后,关闭尽可能多的块和菜单,直到问题消失

此外,您可以在函数drupal\u session\u start和drupal\u session\u commit中向includes/session.inc添加一些调试输出。输出应包含服务器进程的进程ID。查找在显示主要内容很久之后发生的提交

关于可能发生的事情的假设 长时间运行的请求会用旧状态覆盖会话变量。这部分是由于Drupal中如何管理会话变量造成的。默认情况下,会话数据作为数据的单个序列化字符串表示形式存储在会话表的会话列中。原则上,读写会话变量应该是原子的操作,但这并不容易实施。下面的代码来自session.inc,用于处理会话数据的写入。它使用时间戳to和is_change标志来有效延迟写入。也可以说,会话不是线程安全的。此外,它使用SQL MERGE语句, 但这无法合并序列化变量;实际上,最新的书面状态就是获胜状态

//出于性能原因,请勿更新会话表,除非 //$\自上次更新以来,会话已更改或已通过180多次。 如果美元被兑换| | |!isset$user->timestamp | | REQUEST_TIME-$user->timestamp>variable_get'session_write_interval',180{ //ssid或sid或两者都将从下面的$key添加。 $fields=数组 'uid'=>$user->uid, 'cache'=>isset$user->cache?$user->cache:0, “主机名”=>ip\U地址, “会话”=>$value, “时间戳”=>请求时间, ; ... db_合并“会话” ->钥匙$key ->字段$fields ->执行; 想象一下以下场景:

主站点内容是一个显示按钮和计数器的模块。计数器存储在$\u会话['counter']中,并通过单击按钮进行递增。该按钮具有一个Ajax回调,可有效执行以下操作

函数计数器{ 如果!drupal\u会话\u已启动{ //必须初始化匿名用户的会话。 drupal_会话_启动; } $\u会话['counter']=isset$\u会话['counter']?$\u会话['counter']+:0; drupal_会话_提交; ... } 在站点页脚中的块中,有一个加载会话数据的块由于任何原因而暂停

功能什么都不做{ 如果!drupal\u会话\u已启动{ //必须初始化匿名用户的会话。 drupal_会话_启动; } $otherdata=$\会话['otherdata']; //做一些需要很长时间,最终完成或失败的事情,比如开始网站搜索: wait200;//可能有效,请求现在比写入延迟默认值180早 $\u SESSION['otherdata']=$otherdata;//SESSION现在也已更新,可能没有必要 返回TRUE; }

因此,一旦加载内容,页脚块将调用do_nothing(不执行任何操作),该操作将挂起超过180秒。同时,用户使用回调增加计数器,但一旦do_nothing完成,整个会话内容将替换为do_nothing请求的会话内容,从而丢失$_会话['counter']

有代码吗?如果我们有什么可以使用的话会很有帮助。代码?什么都不显示您是否在使用会话的页面顶部有会话开始?@MosheShaham会话daya disepear是什么意思?用户注销了?您怎么知道?您设置了会话过期多长时间?您是如何设置会话过期的要长吗?请回答这些问题,这样我可以尝试帮助您使用drupal。@roychr不,用户不会注销。当用户进入另一个页面时,我存储在某个页面中的数据会被删除。我知道,因为我检查了,我有日志。我在settings.phpAny代码中将过期时间设置为55小时左右。如果我们d要处理的内容。代码?不显示任何内容您是否在使用会话的页面顶部有会话\u开始?@MosheShaham会话daya disapear是什么意思?用户注销了?您怎么知道?您设置了会话到期时间多长?您如何设置会话到期时间长?请回答这些问题ion,以便我可以尝试帮助您使用drupal。@roychr不,用户不会注销。当用户进入另一个页面时,我在某个页面中存储的数据会被删除。我知道,因为我检查了,我有日志。我在“设置”中设置了55小时左右的过期时间。phpit是drupal站点。会话变量一般都会存储。但有些imes他们消失了这是一个drupal站点。会话变量通常存储。但有时它们消失了+1-我的钱在GC上。人们很少意识到,如果你增加会话生存期,你还需要修改GC会话的最大生存时间。尝试将session.GC_maxlife设置为200万,并不能解决问题。第2点呢?你知道吗验证了sessions表对报告有问题的用户的行为?+1-我的钱在GC上。人们很少意识到,如果增加会话生存期,还需要修改GC会话的最大生存时间。尝试将session.GC_maxlifetime设置为200万,但没有解决问题。第2点如何?您验证了sessions表对用户的行为吗有报告问题的用户?我真的不明白。我应该如何命名目录?为什么要这样做?听着,巴德,我刚才遇到了这个错误,这帮助我删除了这个错误。现在如果你把这段代码放在index.php中,那么你已经在index.php所指向的文件夹中创建了一个文件夹必须通过脚本使其可写才能工作。我真的不明白。我应该如何命名该目录?为什么该工作?听着,巴德,我刚才遇到了这个错误,这帮助我删除了这个错误。现在,如果您将此代码放在index.php中,那么您已经在index.php为p的文件夹中创建了一个文件夹
它所指向的绑定,必须使其可由脚本写入才能工作。我不明白。你是说不要将cookie生存期设置得太低,而是要将其设置为0?我不明白。现在设定为200万。当用户关闭浏览器时,我不想让他们退出。我的意思是时间太短,也就是说,不要将时间跨度设置得太低。0==无穷大或浏览器关闭时。但是我刚刚注意到我忘了提到一些重要的东西,我将更新我的帖子。请阅读关于客户端时钟设置的更新。这可能是您的问题或服务器时钟设置问题。我不明白。你是说不要将cookie生存期设置得太低,而是要将其设置为0?我不明白。现在设定为200万。当用户关闭浏览器时,我不想让他们退出。我的意思是时间太短,也就是说,不要将时间跨度设置得太低。0==无穷大或浏览器关闭时。但是我刚刚注意到我忘了提到一些重要的东西,我将更新我的帖子。请阅读关于客户端时钟设置的更新。这可能是您的问题或服务器时钟设置问题。您可以注释掉行会话\u REGENATE\u id;在user.module中。如果PHP版本为4.1或4.4,则会报告此问题。你有哪个PHP版本?你可以注释掉session\u regenate\u id行;在user.module中。如果PHP版本为4.1或4.4,则会报告此问题。你有哪个PHP版本?