并发访问执行列队

#1 学海无涯

在开发中,需要做一个进度条功能,前台提交数据,后台返回进度数据。涉及同时(并发)访问两个action(这里说的并发不知道正不正确),一个action负责业务执行,其实就是一个for循环,每次执行,写入执行次数到制定文件。 另外一个action负责读取,我同时执行两个action结果发现,必须先执行完负责业务的action才能执行第二个负责读取的action.

我不知道是PHP的特性,还是其他问题,所以过来提问,如果发现问题太小白,请指点。谢谢

我做了一个测试如下:

文件:  CeshiController.php
代码:

class CeshiController extends BaseController{

    function actionA(){
        sleep(10);
        echo "A";
    }

    function actionB(){
        sleep(10);
        echo "B";
    }

}


然后我用浏览器访问A以及B。我发现先访问的页面执行完成之后,才执行第二个页面。
也就是说我快速访问两个页面,顺序是A,B 这样的话。A 页面执行完成之后,B 页面才执行。 A页面用了10秒,B 页面用了20秒的时间。也就是说同时访问两个页面,但是两个页面并没有同时执行。而是排队执行了。

我以为是apache配置的问题。我就单独在根目录下独立建立了两个文件,则没有发生这个问题。a.php 、b.php 两个文件的时候,快速访问a 以及b 中间相差1~2秒的时间。所以感觉没有出现这种问题。

返回到我要实现的功能上,我利用框架内的action继续处理我的正常业务。单独在根目录下建立的一个php文件负责读取,业务写入的进度。这时候进度条功能实现了。

请问这个情况是怎么回事儿。全部在框架内完成有无好的建议。谢谢啦:)


2018-09-11 18:53:53

#2 jake

“在根目录下独立建立了两个文件,则没有发生这个问题。”

在这两个文件的顶部,都加入session_start(); 就会一样了。
或者是另外开个其他的浏览器,那么同时跑了两个页面。

session_start(); 在config.php里面。
这是因为本地session存储是串行的,所以导致同一个session的页面会排队执行。



2018-09-11 21:43:17

#3 学海无涯

感谢Jake,确实是Session引起的问题。关闭则无上述问题。

谢谢。:)

2018-09-12 08:52:29