如果我有一个 PHP 页面正在执行一项需要很长时间的任务,并且我尝试同时从同一站点加载另一个页面,那么该页面将不会加载,直到第一页超时。例如,如果我的超时设置为 60 秒,那么我将无法加载任何其他页面,直到加载/超时时间很长的页面后 60 秒。据我所知,这是预期的行为。
我想弄清楚的是,造成上述情况的错误/长时间加载 PHP 脚本是否也会影响同一网络上的其他人。我个人认为这是浏览器问题(即如果我在 chrome 中加载 http://somesite.com/myscript.php 并且它开始在后台运行它的魔法,我无法加载 http://somesite.com/myscript2.php 直到超时,但我可以 在 Firefox 中加载该页面)。但是,我听到了相互矛盾的说法,说超时会发生在同一网络(IP 地址?)上的每个人身上。
我的脚本处理从 sage 导入的一些数据并需要很长时间才能运行 - 有时它可能会在完成之前超时(即如果 sage 导入在一周内崩溃),所以我再次运行它并从哪里开始它停止了。我担心办公室的其他员工在此运行时将无法访问该站点。
最佳答案
您在这里遇到的问题实际上与(我猜)您使用的事实有关 sessions .这可能有点牵强,但它可以准确解释您所描述的内容。
这实际上不是“预期行为”,除非您的 Web 服务器设置为使用单个线程运行单个进程,对此我深表怀疑。这会造成 Web 服务器在任何时候只能处理一个请求的情况,这会影响网络上的每个人。这正是您的 Web 服务器可能不会像这样设置的原因 - 事实上,我怀疑您会发现不可能像这样配置您的服务器,因为它会使服务器有点无用。在一些聪明的 alec 插话“Node.js 怎么样?”之前- 这是一个特例,我相信您已经很清楚了。
当一个 PHP 脚本打开一个 session 时,它对存储 session 数据的文件有一个独占锁。这意味着任何后续请求都将在调用 session_start()
时阻塞,而 PHP 会尝试获取 session 数据文件上的独占锁 - 它不能这样做,因为您之前的请求仍然有一个。一旦您之前的请求完成,它就会释放它对文件的锁定,并且下一个请求能够完成。由于 session 是按机器进行的(实际上是按浏览 session ,顾名思义,这就是它在不同浏览器中工作的原因)这不会影响您网络的其他用户,但会离开您的站点设置这样即使只是对你来说这也是一个问题是不好的做法并且很容易避免。
解决方法是调用session_write_close()
一旦您完成了给定脚本中的 session 数据。这会导致脚本关闭 session 文件并释放它的锁。您应该尝试在开始长时间运行的进程之前完成 session 数据,或者在它完成之前不调用 session_start()
。
理论上您可以调用 session_write_close()
然后稍后在脚本中再次调用 session_start()
,但我发现 PHP 有时会在这方面表现出错误行为(我认为这与 cookie 相关,但不要引用我的话)。显然,请注意设置 cookie 会修改 header ,因此您必须在输出任何数据或启用输出缓冲之前调用 session_start()
。
例如,考虑这个脚本:
<?php
session_start();
if (!isset($_SESSION['someval'])) {
$_SESSION['someval'] = 1;
} else {
$_SESSION['someval']++;
}
echo "someval is {$_SESSION['someval']}";
sleep(10);
使用上述脚本,您必须等待 10 秒才能发出第二个请求。但是,如果您在 echo
行之后添加对 session_write_close()
的调用,您将能够在上一个请求完成之前发出另一个请求。
关于php - PHP 超时会阻止同一网络上的人们加载页面吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10911429/