用户IP更改时的内部服务器错误(可能与PHP会话文件锁定有关)

时间:2013-01-29 02:13:25

标签: php session timeout internal-server-error

我有一个用PHP编写的网站。其中一个用户在一个建筑物中,他们有两个互联网连接,有两个ISP,但有一个网络。因此,网络上的任何计算机都可以通过任一网络连接进行连接,并且看起来交换机有时会在请求中发生。有时这会导致我的脚本出现内部服务器错误。可悲的是,我共享主机上的日志似乎没有太多细节。

所以,这是我的猜测。我的脚本使用会话。用户发送带有Internet连接1的请求,这会锁定会话文件。当该请求正在处理时,互联网连接1被关闭并且互联网连接2被打开。 Apache / PHP一直试图将响应发送回互联网连接1(不再存在)。用户尝试通过互联网连接重新加载页面2. PHP等待初始脚本退出并解锁会话文件,但它永远不会,因此最终因内部服务器错误而死亡。

那么,我怎么能绕过这个呢?如果会话文件自上次锁定以来已经过了太长时间,是否有办法强制取消锁定会话文件? (没有脚本执行超过3秒,所以如果锁定超过15秒,这意味着旧脚本正在等待将文件提供给错误的IP地址并可能被杀死。 )谢谢!

1 个答案:

答案 0 :(得分:0)

我想我解决了这个问题。因此,据我所知,问题是如果请求已启动但服务器未解锁会话文件,但由于时髦的互联网连接而失败。因此,用户发送请求,调用session_start()并锁定会话文件,服务器开始向客户端发送响应,但客户端半消失。客户端通过新IP地址发送新请求,调用session_start(),但必须等待会话文件解锁,以便等待并等待并最终超时。但是,我为我的网站解决了这个问题。所以,这是我的网站的工作方式:  1.服务器获取请求。  2.服务器处理请求并在各种变量中存储用户信息,而不是使用echo-as-you-go方法。  3.然后我包含template.php,我的各种保存变量显示在正确的位置。 因此,我的代码流首先处理所有处理,然后在处理完成后进行所有用户回显。所以,在template.php文件的开头,我现在包含了一个“session_write_close();”。这会在将响应发送给用户之前手动释放会话文件,而不是等到脚本结束。因此,如果用户在传输过程中消失,会话文件将被解锁,用户可以发送新请求,并且不会碰到锁定的会话文件。

自从我提出修正案后,我没有再听到任何投诉。 (作为旁注,用户确实与其他网站有问题,但我希望我的网站以最佳方式对低于标准的互联网连接做出反应。)