天天看点

php无法立即完成一个非阻止性套接字操作,PHP超时会阻止人们在同一网络上加载页面吗?...

您在这里遇到的问题实际上与您正在使用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().

例如,考虑以下脚本:

session_start();

if (!isset($_SESSION['someval'])) {

$_SESSION['someval'] = 1;

} else {

$_SESSION['someval']++;

}

echo "someval is {$_SESSION['someval']}";

sleep(10);

使用上述脚本,您将需要等待10秒钟才能发出第二个请求.但是,如果在回显行之后添加对session_write_close()的调用,则可以在前一个请求完成之前发出另一个请求.