浏览器访问阻塞问题
最后更新于:2022-04-02 04:28:19
## 浏览器访问阻塞问题
test.php
```php
0) {
echo $i . ' - ' . date('Y-m-d H:i:s') . '
'; ob_flush(); flush(); $i--; sleep(1); } echo "我出来了
"; ob_flush(); flush(); } test2(); ``` 浏览器开两个标签访问: 标签1 http://127.0.0.1/test2.php ~~~ 3 - 2017-06-19 05:33:22 2 - 2017-06-19 05:33:23 1 - 2017-06-19 05:33:24 我出来了 ~~~ 标签2 http://127.0.0.1/test2.php ~~~ 3 - 2017-06-19 05:33:25 2 - 2017-06-19 05:33:26 1 - 2017-06-19 05:33:27 我出来了 ~~~ 可以看到竟然出现阻塞了,竟然有“并发锁”的效果了,可是我们代码并没有考虑并发的代码啊,按道理说应该是错乱的啊,这是怎么回事呢,是了360安全浏览器、火狐浏览器、谷歌浏览器,都是这样的,但是在不同浏览器上面就是正常的,错乱的有并发问题,于是要怀疑浏览器了,果不其然,把标签2的地址变为 http://127.0.0.1/test2.php?2 就错乱了: 标签1: ~~~ 3 - 2017-06-19 05:36:25 2 - 2017-06-19 05:36:26 1 - 2017-06-19 05:36:27 我出来了 ~~~ 标签2 ~~~ 3 - 2017-06-19 05:36:23 2 - 2017-06-19 05:36:24 1 - 2017-06-19 05:36:25 我出来了 ~~~ 几个浏览器上也都是这样的,原来是浏览器搞的鬼。 于是我们得出结论: **浏览器在开多个标签页访问同一个url地址时,标签之间是阻塞的。** 于是我们想看看在这种情况下,浏览器的网络请求是什么情况: 果然和我们想的一样,第一个标签访问时,还没有结束时,第二个标签的 Status的状态为:`pending` * * * * * 这个问题干扰了我们的测试,知道了原因后就好办了,第二个标签加个不一样的参数就好了。 在研究PHP并发锁的时候遇到这个问题,百思不得姐,通过一番实验发现了这个问题, 于是把这个浏览器的小细节记录下来。 ### 扩展 如果在登录环境中是无法顺利做上面的实验的哦,因为在同一浏览器上面登录时,session多页面文件阻塞问题。参考:[PHP中Session引起的脚本阻塞问题解决办法](http://www.jb51.net/article/48805.htm) thinkphp中想要提升性能在使用完session后需要及时的执行: ```php // 及时暂停session,释放session文件,可以避免发生多页面session阻塞问题 // 不这样做的话,对于用户来说,统一发起的多个请求,如果其中一个请求相应慢也会影响其他请求 // 最好不使用文件储存session,使用其他无锁的缓存,不过没有锁的话,还有面对两次会话可能出现的数据不一致和并发修改数据的问题 Session::pause(); ``` 这样多页面访问时就会感觉到显著的速度提升。 last update:2017-6-19 14:24:52
';
'; ob_flush(); flush(); $i--; sleep(1); } echo "我出来了
"; ob_flush(); flush(); } test2(); ``` 浏览器开两个标签访问: 标签1 http://127.0.0.1/test2.php ~~~ 3 - 2017-06-19 05:33:22 2 - 2017-06-19 05:33:23 1 - 2017-06-19 05:33:24 我出来了 ~~~ 标签2 http://127.0.0.1/test2.php ~~~ 3 - 2017-06-19 05:33:25 2 - 2017-06-19 05:33:26 1 - 2017-06-19 05:33:27 我出来了 ~~~ 可以看到竟然出现阻塞了,竟然有“并发锁”的效果了,可是我们代码并没有考虑并发的代码啊,按道理说应该是错乱的啊,这是怎么回事呢,是了360安全浏览器、火狐浏览器、谷歌浏览器,都是这样的,但是在不同浏览器上面就是正常的,错乱的有并发问题,于是要怀疑浏览器了,果不其然,把标签2的地址变为 http://127.0.0.1/test2.php?2 就错乱了: 标签1: ~~~ 3 - 2017-06-19 05:36:25 2 - 2017-06-19 05:36:26 1 - 2017-06-19 05:36:27 我出来了 ~~~ 标签2 ~~~ 3 - 2017-06-19 05:36:23 2 - 2017-06-19 05:36:24 1 - 2017-06-19 05:36:25 我出来了 ~~~ 几个浏览器上也都是这样的,原来是浏览器搞的鬼。 于是我们得出结论: **浏览器在开多个标签页访问同一个url地址时,标签之间是阻塞的。** 于是我们想看看在这种情况下,浏览器的网络请求是什么情况: 果然和我们想的一样,第一个标签访问时,还没有结束时,第二个标签的 Status的状态为:`pending` * * * * * 这个问题干扰了我们的测试,知道了原因后就好办了,第二个标签加个不一样的参数就好了。 在研究PHP并发锁的时候遇到这个问题,百思不得姐,通过一番实验发现了这个问题, 于是把这个浏览器的小细节记录下来。 ### 扩展 如果在登录环境中是无法顺利做上面的实验的哦,因为在同一浏览器上面登录时,session多页面文件阻塞问题。参考:[PHP中Session引起的脚本阻塞问题解决办法](http://www.jb51.net/article/48805.htm) thinkphp中想要提升性能在使用完session后需要及时的执行: ```php // 及时暂停session,释放session文件,可以避免发生多页面session阻塞问题 // 不这样做的话,对于用户来说,统一发起的多个请求,如果其中一个请求相应慢也会影响其他请求 // 最好不使用文件储存session,使用其他无锁的缓存,不过没有锁的话,还有面对两次会话可能出现的数据不一致和并发修改数据的问题 Session::pause(); ``` 这样多页面访问时就会感觉到显著的速度提升。 last update:2017-6-19 14:24:52