0

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

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

那么,我该如何解决呢?如果自上次锁定以来已经过去了太多时间,有没有办法强制解锁会话文件?(没有脚本的执行时间超过 3 秒,因此如果锁定时间超过 15 秒,这意味着旧脚本正在等待将文件提供给错误的 IP 地址并且可能会被终止。 ) 谢谢!

4

1 回答 1

0

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

自从我进行了那个修复,我没有再听到任何抱怨。(附带说明,用户确实对其他网站有问题,但我希望我的网站以最佳方式对低于标准的互联网连接做出反应。)

于 2013-02-12T15:53:04.000 回答