实时读取数据信息

#1 278086346

speedphp中,有那些比较好的方法能实时读取数据信息?
   那些循环多少秒读取,比较占用资源,有没有针对这个框架比较好的办法?有点类似消息系统,有消息了,页面马上会显示

2015-10-11 02:10:10

#2 jake

这不叫实时读取数据,你说的大概是即时信息提示这样。

这个问题跟框架没什么关系,PHP大部分运行时间是瞬时的。当然,如果你觉得是SP框架就是PHP,那么下面你可以把PHP看作SP框架自带的功能。

一般的做法有几类:

1. ajax的keep-alive方式,这个在PHP里面需要调整apache连接时间和php运行时间,再set_time_limit,每次发送1k字节来填满缓冲区,这样就可以一直keepalive输出内容。类似java也是使用这个方式。

2. websocket,比较流行,不过需要学一下nodejs

3. bigpipe方式,和keepalive差不多,不过不是ajax,而是直接在页面输出。

以上知识请百度了解。

2015-10-12 08:51:24

#3 278086346

jake 发表于 2015-10-12 08:51
这不叫实时读取数据,你说的大概是即时信息提示这样。

这个问题跟框架没什么关系,PHP大部分运行时间是瞬 ...
OK。好的,多谢了。{:soso_e100:}  

2015-10-13 23:29:38

#4 278086346

jake 发表于 2015-10-12 08:51
这不叫实时读取数据,你说的大概是即时信息提示这样。

这个问题跟框架没什么关系,PHP大部分运行时间是瞬 ...
您好,我百度了几天,关于 websocket,node.js 以及有关的swoole和workerman 都是需要命令的方式和linux下命令操作
     ajax 方式占用资源比较厉害,也难以实时数据互动。
bigpipe 方式不知道是不是比较新,在百度的资料比较少。请问JAKE   就算单向的也行,类似即时推送一样,不需要双向互通数据。。有什么比较好的方式吗?

2015-10-15 23:30:25

#5 water6000

我觉得你可以试试消息队列!比如:activeMQ啥的

2015-10-16 09:30:27

#6 jake

278086346 发表于 2015-10-15 23:30
您好,我百度了几天,关于 websocket,node.js 以及有关的swoole和workerman 都是需要命令的方式和linux ...
如果说类似nodejs这种不好处理的话,对于php通常的模式来说,只能是ajax轮循了

2015-10-16 22:37:24

#7 冈刀飞絮

1、按你说的 应该是数据库数据量大要 部分部分显示,那可以ajax 展现,然后保留最大的id 然后 在用前次最大id 去最为起点去查。

2、如果你要实时推送模式的 那 基本上是 轮询  websocke 长连接 此类方案有 workerman ,swoole (php)
node.js , SingleR 等等 都可以做(客户端浏览器支持的条件下)

2015-10-17 00:09:02

#8 278086346

jake 发表于 2015-10-16 22:37
如果说类似nodejs这种不好处理的话,对于php通常的模式来说,只能是ajax轮循了
...
谢谢,已经解决了,用AJAX的长轮询,但是有个问题就是,假设10秒查询一次,一打开页面就会卡,iframe那部分就不显示,就需要10秒后才显示,特别卡,在进行操作的时候都要等十多二十秒。不知道是不是因为while的原因,希望以后查询此问题的客户有能解决的回复下。多谢了。

2015-10-19 23:32:54

#9 278086346

冈刀飞絮 发表于 2015-10-17 00:09
1、按你说的 应该是数据库数据量大要 部分部分显示,那可以ajax 展现,然后保留最大的id 然后 在用前次最大 ...
多谢了,还是用的ajax解决的

2015-10-19 23:33:24

#10 jake

278086346 发表于 2015-10-19 23:32
谢谢,已经解决了,用AJAX的长轮询,但是有个问题就是,假设10秒查询一次,一打开页面就会卡,iframe那部 ...
10秒,这个应该是session并发造成的。简单粗暴的解决方法是你的iframe或者ajax请求的程序里面,不开session_start(),SP也有个配置可以关这个的。

更高级的方法是用session类,不过代码就要改一下了:

用到session的时候要用spClass("MySession")->get来取session,用set来读session

以下是session类
class MySession{
        static protected $session = array();
        
        public function get($key=NULL){
                if( empty(self::$session) ){
                        session_start();
                        self::$session = $_SESSION["mysession"];
                        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["mysession"] = self::$session;
                session_write_close();
               
                return true;
        }
}
以上代码由单骑老大提供!

2015-10-20 08:20:22

#11 278086346

jake 发表于 2015-10-20 08:20
10秒,这个应该是session并发造成的。简单粗暴的解决方法是你的iframe或者ajax请求的程序里面,不开sessio ...
好的,我试试。谢谢

2015-10-20 11:12:01

#12 278086346

jake 发表于 2015-10-20 08:20
10秒,这个应该是session并发造成的。简单粗暴的解决方法是你的iframe或者ajax请求的程序里面,不开sessio ...
果然是session并发造成的,我关闭spconfig.php中的'auto_session' => FALSE, 在去运行,就不卡了。   但是不能全部关闭,会导致验证码或者其他出错。
想问下JAKE,我这部分代码中没有直接获取session
前端是:name=$smarty.session.userinfo.us_name
代码是:$a=$this->spArgs("");
去掉这两者,程序还是会卡。。。
是否需要整个PHP文件中都要spClass("MySession")->get  还是需要整个源码都需要spClass("MySession")->get?
     有没有什么办法单独关闭这个iframe页面的session?或者是那个function的

2015-10-20 12:42:52

#13 jake

278086346 发表于 2015-10-20 12:42
果然是session并发造成的,我关闭spconfig.php中的'auto_session' => FALSE, 在去运行,就不卡了。   但 ...
有个简单的方法,可以通过index.php的框架配置设置来实现。

比如说假设你的iframe页面是a=foo&c=bar这样,然后在index.php一开始就判断$_GET["a"]和$_GET["c"]是不是等于这两者,如果是的话,在配置里面把'auto_session' => FALSE设置一下。


也就是单独那个iframe才有这个配置,不就可以了吗

2015-10-20 13:21:58

#14 278086346

jake 发表于 2015-10-20 13:21
有个简单的方法,可以通过index.php的框架配置设置来实现。

比如说假设你的iframe页面是a=foo&c=bar这样 ...
通过判断$_GET["a"]和$_GET["c"],改变auto_session,会把整个网站的session取消。。只是当GET A C时候才取消。
然后试试单骑大哥的类。
                function adminelight(){
                    $spClass("MySession")->get;
                    $spClass("MySession")->set;
                    $this->display("user/adminelight.html");
                }

这个GET和SET如何使用呢?{:soso_e117:}{:soso_e183:}

2015-10-20 22:52:22

#15 278086346

jake 发表于 2015-10-20 13:21
有个简单的方法,可以通过index.php的框架配置设置来实现。

比如说假设你的iframe页面是a=foo&c=bar这样 ...
spClass("MySession")->get($_SESSION);
                    spClass('MySession')->set($_SESSION,$value);
                    print_r($value);

研究后,可以得到session  然后在试试把整站的调整过来,是否还会出现session并发问题

2015-10-20 23:15:24

#16 278086346

jake 发表于 2015-10-20 08:20
10秒,这个应该是session并发造成的。简单粗暴的解决方法是你的iframe或者ajax请求的程序里面,不开sessio ...
还是没有获取到正确的值。。。还是得请教下JAKE老大了。。。
如何用spClass("MySession")->get来取session,用set来读session

2015-10-21 07:41:36

#17 jake

1. 通过判断$_GET["a"]和$_GET["c"],改变auto_session,这是要做的,就是某个页面“不启用默认session”,不是什么取消全站session。

这里只是关闭自动的session_start,你可以看到MySession类里面是有这个函数的,就是改变自动为手动。

2. MySession类两个方法,源码都在,稍微花点时间看看这十来行的代码。就是

get(键) 代替 $_SESSION[键]  
set(键, 值)就是 $_SESSION[键] = 值

3. 当某c/a页面中,取消了session_start后,才需要用MySession来存取session,能明白吗?

在特定的页面($_GET[a] $_GET[c]),用 if 判断 取消自动 session_start,

然后在这个页面里面,用MySession来代替$_SESSION的使用。

2015-10-21 08:26:56

#18 278086346

jake 发表于 2015-10-21 08:26
1. 通过判断$_GET["a"]和$_GET["c"],改变auto_session,这是要做的,就是某个页面“不启用默认session”, ...
JAKE、、研究一天了,实在不行这个问题。因为我是从SPEEDPHP学起的,PHP基础差....看不太懂,网上也查看了PHP的GET和SET,方法和SPEEDPHP的不太一样。。
spClass('MySession')->set($_SESSION,$value);    // 我设置了$_SESSION键 和 值是$value
spClass("MySession")->get($_SESSION);   //然后用GET去获取$_SESSION


我最初的时候是赋予了$_SESSION['userinfo']  这个, 然后类里面又是 $_SESSION["mysession"],我把类的换成了 $_SESSION["userinfo"]

现在想输出 登陆时候赋予的$_SESSION['userinfo']   里面的内容。一直调去不到{:soso_e183:}  JAKE老大指点下,哪里不对呢

2015-10-21 20:50:48

#19 jake

278086346 发表于 2015-10-21 20:50
JAKE、、研究一天了,实在不行这个问题。因为我是从SPEEDPHP学起的,PHP基础差....看不太懂,网上也查看 ...
麻烦仔细看看我的回复贴子好吗?

哪有写说get跟set是要用到$_SESSION这个变量?

我写的是

get(键) 代替 $_SESSION[键]  
set(键, 值)就是 $_SESSION[键] = 值

假如你原来是$_SESSION['userinfo'],这里'userinfo'是一个“键”,一个session的键,搞清楚这不是$_SESSION本身,OK?

所以:

原来是:$_SESSION["userinfo"] = $value
就变成
spClass('MySession')->set('userinfo',$value);

原来是:$value = $_SESSION["userinfo"]
就变成
$value = spClass("MySession")->get('userinfo');

就是说把session换个方式使用。

2015-10-22 08:27:45

#20 278086346

jake 发表于 2015-10-22 08:27
麻烦仔细看看我的回复贴子好吗?

哪有写说get跟set是要用到$_SESSION这个变量?
学习了。之前不懂所以误解了。谢谢JAKE老大{:soso_e183:}

2015-10-22 12:56:54