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