PHP超时会阻止人们在同一网络上加载页面吗?

如果我有一个执行较长时间的任务的PHP页面,并且尝试同时从同一站点加载另一个页面,则在第一个页面超时之前将不会加载该页面.例如,如果我的超时设置为60秒,那么我将无法加载任何其他页面,直到页面花费很长时间加载/超时之后60秒.据我所知,这是预期的行为.

我要弄清楚的是,导致上述情况的错误/长时间加载的PHP脚本是否还会影响同一网络上的其他人.我个人认为这是浏览器出现的问题(即如果我在Chrome中加载了http://somesite.com/myscript.php并开始在后台运行,那很神奇,直到超时之前我无法加载http://somesite.com/myscript2.php,但是我可以在Firefox中加载该页面).但是,我听到矛盾的说法,即超时将发生在同一网络(IP地址?)上的每个人.

我的脚本可以处理从鼠尾草导入的某些数据,并且需要花费很长的时间-有时它可能会在完成之前超时(例如,如果鼠尾草导入在一周内崩溃了),因此我再次运行它,并从中断处恢复.我担心办公室其他人员在运行时将无法访问该站点.

解决方法:

在这里遇到的问题实际上与您正在使用sessions(我猜是这样)有关.这可能有点麻烦,但这将完全解释您的描述.

除非您将Web服务器设置为运行具有单个线程的单个进程,否则这实际上不是“预期的行为”,我对此表示高度怀疑.这将导致Web服务器在任何时候只能处理一个请求的情况,并且会影响网络上的每个人.这就是为什么您的Web服务器可能不会这样设置的原因-实际上,我怀疑您会发现无法像这样配置您的服务器,因为这会使服务器有些用处.在一些聪明的alec提出“ Node.js到底是什么?”之前, -这是特例,因为我相信您已经很清楚了.

PHP脚本打开会话时,它将在存储会话数据的文件上具有排他锁.这意味着,任何后续请求都将在对session_start()的调用时阻塞,而PHP尝试获取会话数据文件上的排他锁-不能,因为您先前的请求仍然有一个.您上一个请求完成后,它将释放对文件的锁定,并且下一个请求可以完成.由于会话是按计算机进行的(顾名思义,实际上是按浏览的会话,这就是为什么它在不同的浏览器中工作的原因),因此这不会影响您网络的其他用户,但是会设置您的站点,因此这是一个即使是仅针对您的问题也是不好的做法,很容易避免.

解决方案是在给定脚本中使用完会话数据后立即调用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()的调用,则可以在前一个请求完成之前发出另一个请求.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...