php怎么使用swoole(php怎么使用json做配置文件)

今天给各位分享php怎么使用swoole的知识,其中也会对php怎么使用json做配置文件进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

swoole扩展怎么用?是php扩展还是框架

swoole扩展是PHP扩展。php swoole扩展,PHP语言的高性能网络通信框架,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,数据库连接池,AsyncTask,消息队列,毫秒定时器,异步文件读写,异步DNS查询。

1、下载swoole源码包 

[root@nginx ~]# wget

2、解压进入swoole文件夹  

[root@nginx ~]# tar -zxvf swoole-1.7.17-stable

[root@nginx ~]# cd swoole-src-swoole-1.7.17-stable/

3、编译安装swoole   

[root@nginx swoole-src-swoole-1.7.17-stable]# phpize

[root@nginx swoole-src-swoole-1.7.17-stable]# ./configure

[root@nginx swoole-src-swoole-1.7.17-stable]# make make install

4、php.ini配置文件加载swoole.so模块  

[root@nginx swoole-src-swoole-1.7.17-stable]# vi /usr/local/php/lib/php.ini

注意 php命令行运行和浏览器运行的配置文件不一样。

php 命令行的配置:

[root@nginx swoole-src-swoole-1.7.17-stable]# php --ini

Configuration File (php.ini) Path: /usr/local/lib

Loaded Configuration File: /usr/local/lib/php.ini//配置文件

Scan for additional .ini files in: (none)

Additional .ini files parsed: (none)

5、查看swoole模块是否已经安装成功

[root@nginx swoole-src-swoole-1.7.17-stable]# php -m

   

6、编写服务端httpServer.php文件并运行

$serv = new swoole_server("127.0.0.1", 9501);

$serv-on('connect', function ($serv, $fd){

echo "Client:Connect.\n";

});

$serv-on('receive', function ($serv, $fd, $from_id, $data) {

$serv-send($fd, 'Swoole: '.$data);

});

$serv-on('close', function ($serv, $fd) {

echo "Client: Close.\n";

});

$serv-start();

运行httpServer.php

[root@nginx swoole-src-swoole-1.7.17-stable]# php httpServer.php

7、用telnet测试

[root@nginx ~]# telnet 127.0.0.1 9501

Trying 127.0.0.1...

Connected to 127.0.0.1.

Escape character is '^]'.

hello 客户端

Swoole: hello 服务端

来源:PHP swoole扩展安装和使用-

PHP如何利用SWOOLE扩展实现定时同步例子

public function onReceive($serv, $fd, $from_id, $data)

{

//使用json_decode 解析任务数据

$areas = json_decode($data,true);

foreach ($areas as $area){

//投递异步任务

$serv-task($area);

}

}

php如何实现websocket

php有可用的websocket库,不需要php-fpm。

目前比较成熟的有swoole(swoole.com),和workman(workman.net)

swoole是c写的php扩展, 效率比nodejs还要高,workman是纯php实现,两者都号称可以实现并发百万TCP连接。

给你个例子:

这个要通过cmd运行的 具体带的参数有点忘记了

?php

    error_reporting(E_ALL);

    set_time_limit(0);

    ob_implicit_flush();

    //创建一个socket连接 设置参数 绑定 监听 并且返回

    $master  = WebSocket("localhost",12345);

    //标示是否已经进行过握手了

    $is_shaked = false;

    //是否已经关闭

    $is_closed = true;

    //将socket变为一个可用的socket

    while(true){

        //如果是关闭状态并且是没有握手的话 则创建一个可用的socket(貌似第二个条件可以去除)

        if($is_closed  !$is_shaked){

            if(($sock = socket_accept($master))  0){

                echo "socket_accept() failed: reason: " . socket_strerror($sock) . "\n";

            }

            //将关闭状态修改为false

            $is_closed = false;

        }

        //开始进行数据处理

        process($sock);

    }

    //处理请求的函数

    function process($socket){

        //先从获取到全局变量

        global $is_closed, $is_shaked;

        //从socket中获取数据

        $buffer = socket_read($socket,2048);

        //如果buffer返回值为false并且已经握手的话 则断开连接

        if(!$buffer  $is_shaked){

            disconnect($socket);

        }else{

            //如果没有握手的话则握手 并且修改握手状态

            if($is_shaked == false){

                $return_str = dohandshake($buffer);

                $is_shaked = true;

            }else{

                //如果已经握手的话则送入deal函数中进行相应处理

                $data_str = decode($buffer);    //解析出来的从前端送来的内容

                console($data_str);

                $return_str = encode(deal($socket, $data_str));

                //$return_str = encode($data_str);

            }

            //将应该返回的字符串写入socket返回

            socket_write($socket,$return_str,strlen($return_str));

        }

    }

    function deal($socket, $msgObj){

        $obj = json_decode($msgObj);

        foreach($obj as $key=$value){

            if($key == 'close'){

                disconnect($socket);

                console('close success');

                return 'close success';

            }else if($key == 'msg'){

                console($value."\n");

                return $value;

            }

        }

    }

    //获取头部信息 

    function getheaders($req){

        $r=$h=$o=null;

        if(preg_match("/GET (.*) HTTP/"   ,$req,$match)){ $r=$match[1]; }

        if(preg_match("/Host: (.*)\r\n/"  ,$req,$match)){ $h=$match[1]; }

        if(preg_match("/Origin: (.*)\r\n/",$req,$match)){ $o=$match[1]; }

        if(preg_match("/Sec-WebSocket-Key: (.*)\r\n/",$req,$match)){ $key=$match[1]; }

        if(preg_match("/\r\n(.*?)\$/",$req,$match)){ $data=$match[1]; }

        return array($r,$h,$o,$key,$data);

    }

    function WebSocket($address,$port){

        $master=socket_create(AF_INET, SOCK_STREAM, SOL_TCP)     or die("socket_create() failed");

        socket_set_option($master, SOL_SOCKET, SO_REUSEADDR, 1)  or die("socket_option() failed");

        socket_bind($master, $address, $port)                    or die("socket_bind() failed");

        socket_listen($master,20)                                or die("socket_listen() failed");

        echo "Server Started : ".date('Y-m-d H:i:s')."\n";

        echo "Master socket  : ".$master."\n";

        echo "Listening on   : ".$address." port ".$port."\n\n";

        return $master;

    }

    function dohandshake($buffer){

        list($resource,$host,$origin,$key,$data) = getheaders($buffer);

        echo "resource is $resource\n";

        echo "origin is $origin\n";

        echo "host is $host\n";

        echo "key is $key\n\n";

        $response_key = base64_encode(sha1($key.'258EAFA5-E914-47DA-95CA-C5AB0DC85B11', true));

        $return_str = "HTTP/1.1 101 Switching Protocols\r\n".

                    "Upgrade: websocket\r\n".

                    "Connection: Upgrade\r\n".

                    "Sec-WebSocket-Accept: $response_key\r\n\r\n";

        return $return_str;

    }

    function console($msg){

        $msg = transToGBK($msg);

        echo "$msg\n";

        return $msg;

    }

    function decode($msg="") {

        $mask = array();

        $data = "";

        $msg = unpack("H*",$msg);

        $head = substr($msg[1],0,2);

        if (hexdec($head{1}) === 8){

            $data = false;

        } else if (hexdec($head{1}) === 1){

            $mask[] = hexdec(substr($msg[1],4,2));

            $mask[] = hexdec(substr($msg[1],6,2));

            $mask[] = hexdec(substr($msg[1],8,2));

            $mask[] = hexdec(substr($msg[1],10,2));

            $s = 12;

            $e = strlen($msg[1])-2;

            $n = 0;

            for ($i= $s; $i= $e; $i+= 2){

                $data .= chr($mask[$n%4]^hexdec(substr($msg[1],$i,2)));

                $n++;

            }  

        }  

        return $data;

    }

    function encode($msg=""){

        $frame = array();

        $frame[0] = "81";

        $msg .= ' is ok';

        $len = strlen($msg);

        $frame[1] = $len16?"0".dechex($len):dechex($len);

        $frame[2] = ord_hex($msg);

        $data = implode("",$frame);

        return pack("H*", $data);

    }

    function transToGBK($s){//UTF8-GBK

        //echo $s;

        return iconv("UTF-8", "GBK", $s);

        return $s;

    }

    function ord_hex($data){

        $msg = "";

        $l = strlen($data);

        for ($i=0; $i$l; $i++){

            //ord是返回字符串第一个字符的ascii值

            //dechex把十进制转换为十六进制

            $msg .= dechex(ord($data{$i}));

        }

        return $msg;

    }

    function disconnect($socket){

        global $is_shaked, $is_closed;

        $is_shaked = false;

        $is_closed = true;

        socket_close($socket);

    }

?

php进阶到架构之swoole系列教程(三)mysql连接池-

这是关于php进阶到架构之 swoole 系列学习课程:第三节:mysql连接池

学习目标 :

了解什么是mysql连接池,以及mysql使用场景。能在实际工作使用连接池(数据库连接池,redis连接池等等)解决高并发带来的问题。

场景 :

每秒同时1000个并发,但mysql数据库同时只支持400个连接,这样mysql就会宕机

解决方案 :

使用连接池,这个连接池建立了300个与mysql的连接对象,这1000个并发有序地共享连接池里的300个连接。

连接池的使用不但解决了mysql在高并发情况下宕机问题,还额外提高了性能。因为和mysql建立连接,消耗较大。使用连接池只需要连接一次mysql。

永不断开,需要程序常驻内存,这就需要借助swoole实现。

数据库连接池是程序启动时,建立足够的数据库连接,并将这些连接组成一个连接。由程序动态的对连接池中的连接进行申请,使用,释放和回补。

使用Swoole+PHP开发的IM

(一)扩展安装

    本demo需要的扩展有Swoole、MongoDB、Redis

(二)详细步骤

1、Client在进行长连接操作时会在链接后面跟上用户id,Server在接受到用户id后会将此id与线程id进行绑定,并存入Redis中。

2、Client触发send事件后,会将此消息追加到本地的消息列表中(此时为消息的发送方)。Server在触发onMessage事件后首先会将消息内容存入DB,然后再根据此消息接收者的用户id找到对应的线程id并进行push操作。

3、Client触发onmessage事件后会拿到消息内容并将此内容追加到本地消息列表中。(此时为消息的接收方)

至此,IM的流程就大致梳理完了。

效果图如下:

   

项目源码:

体验地址:

关于php怎么使用swoole和php怎么使用json做配置文件的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

1、本网站名称:源码村资源网
2、本站永久网址:https://www.yuanmacun.com
3、本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
4、本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
5、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
6、本站资源大多存储在云盘,如发现链接失效,请联系我们我们会第一时间更新。
源码村资源网 » php怎么使用swoole(php怎么使用json做配置文件)
您需要 登录账户 后才能发表评论

发表评论

欢迎 访客 发表评论