PHP按队列执行

#1 kao10324

index.php入口文件加入sleep(10)并执行
然后再执行user.php入口文件操作

同一浏览器中,user.php需要等待index.php执行完成才会执行
这是需要开始linux的多线程pthread扩展吗?还有其它哪些解决方案


2016-08-17 09:22:52

#2 jake

你是想要“同一浏览器中,user.php需要等待index.php执行完成才会执行”,还是想他们一起执行?

这里说的不清楚。

2016-08-17 09:40:21

#3 kao10324

jake 发表于 2016-8-17 09:40
你是想要“同一浏览器中,user.php需要等待index.php执行完成才会执行”,还是想他们一起执行?

这里说的不 ...
现在是按顺序执行的,index.php执行完了.才执行user.php.现在需要他们可以同时执行,不相互影响,
不加异步或多线程的话.都是会按顺序执行的吗?

2016-08-17 11:29:37

#4 jake

kao10324 发表于 2016-8-17 11:29
现在是按顺序执行的,index.php执行完了.才执行user.php.现在需要他们可以同时执行,不相互影响,
不加异步 ...
同时打开页面,就会同时执行。

2016-08-17 12:05:46

#5 kao10324

index.php入口文件加入sleep(10)并执行
然后再执行user.php入口文件操作

按这样的,没有同时执行.user.php这个要等到sleep(10),10秒之后,才执行出来.正常情况可能就一两秒

2016-08-17 13:07:25

#6 kao10324

jake 发表于 2016-8-17 12:05
同时打开页面,就会同时执行。
index.php入口文件加入sleep(10)并执行
然后再执行user.php入口文件操作

按这样的,没有同时执行.user.php这个要等到index.php的sleep(10)等待10秒之后,才执行出来.这是按顺序执行的吧.

2016-08-17 13:10:49

#7 jake

在sleep前加入session_write_close();

2016-08-17 13:31:48

#8 kao10324

jake 发表于 2016-8-17 13:31
在sleep前加入session_write_close();
用session_write_close()的话.如果该页面需要用到session的话.只能重新再开启session_start();不够简洁,还有其它方案吗

2016-08-17 14:54:33

#9 kao10324

jake 发表于 2016-8-17 13:31
在sleep前加入session_write_close();
主要是希望获取到数据储存到session里,获取的时间比较长.而不影响其它页面执行,用session_write_close()的话.无法储存数据到session了

2016-08-17 14:57:16

#10 jake

这是所谓的session的frameset问题,因为php来说同个session是会堵塞的,也就是同个session访问两个页面,其中一个要等另外一个页面完成,或者是调用了session_write_close来关闭session,那么页面才能显示。

没有太理想的解决方案,毕竟这问题比较小众。一般的解决方法是

在每次用到session的时候,都加上这样的写法:

session_start();
$_SESSION[nnn] = mmm;
session_write_close();

session_start();
$abc = $_SESSION[nnn];
session_write_close();

也就是前后用session_start()和session_write_close来包一下。

更正规点的做法,是独立个session类,或者写session的set/get函数(看着下面的类写也行):
class MySession{
        static protected $session = array();
        
        public function get($key=NULL){
                if( empty(self::$session) ){
                        session_start();
                        self::$session = $_SESSION['app_id'];
                        session_write_close();
                }
               
                if( empty($key) ) return self::$session;
                $arr = explode('.', $key);
                switch( count($arr) ){
                        case 1 :
                                if( isset(self::$session[ $arr[0] ])) {
                                        return self::$session[ $arr[0] ];
                                }
                                break;
                        case 2 :
                                if( isset(self::$session[ $arr[0] ][ $arr[1] ])) {
                                        return self::$session[ $arr[0] ][ $arr[1] ];
                                }
                                break;
                        case 3 :
                                if( isset(self::$session[ $arr[0] ][ $arr[1] ][ $arr[2] ])) {
                                        return self::$session[ $arr[0] ][ $arr[1] ][ $arr[2] ];
                                }
                                break;                                                
                        default: break;
                }
                return NULL;
        }
        
        public function set($key, $value){
                $arr = explode('.', $key);
                switch( count($arr) ){
                        case 1 :
                                self::$session[ $arr[0] ] = $value;
                                break;
                        case 2 :
                                self::$session[ $arr[0] ][ $arr[1] ] = $value;
                                break;
                        case 3 :
                                self::$session[ $arr[0] ][ $arr[1] ][ $arr[2] ] = $value;
                                break;                                       
                        default: return false;
                }
               
                session_start();
                $_SESSION['app_id'] = self::$session;
                session_write_close();
               
                return true;
        }
}
以上代码由canphp作者提供

2016-08-17 15:21:23

#11 kao10324

jake 发表于 2016-8-17 15:21
这是所谓的session的frameset问题,因为php来说同个session是会堵塞的,也就是同个session访问两个页面,其 ...
应该还是不少的吧,比如一些图片网站,打开或加载的时间稍长,应该不会等一个页面打开再打开另一个页面吧.
或者他们大多页面没有使用session做登陆验证,就不存在session阻塞了

2016-08-17 21:54:12

#12 jake

kao10324 发表于 2016-8-17 21:54
应该还是不少的吧,比如一些图片网站,打开或加载的时间稍长,应该不会等一个页面打开再打开另一个页面吧.
...
图片网站也不会有两个页面一起加载的情况,主要针对frameset网站了。
所以需求很小众,没见php官方也没给什么改进的意见或者建议,毕竟目前的HTML写法来说,也不建议用frameset了。

一般我们做网站主要的页面都要保证加载速度,不会存在sleep10这样的延时,高延时的请求会分离到ajax上面去加载,以便用户可以马上看到东西不会感觉慢。

2016-08-18 08:27:52

#13 kao10324

jake 发表于 2016-8-18 08:27
图片网站也不会有两个页面一起加载的情况,主要针对frameset网站了。
所以需求很小众,没见php官方也没给 ...
非常感谢您的耐心解答

2016-08-18 09:10:31