前言

由于PHP从底层开始就不支持多线程,因此也更无从谈起代码的异步运行了,但这项技术对于需要实现大量复杂运算或者一些耗时操作又显得尤其的重要。比如:APP推送群发、大数据处理、爬虫程序等等应用场景,我们总不能让用户一直在loading状态干等吧?虽说有模拟异步队列的办法但终究治标不治本,效果不理想且局限性又太大,直到了解到swoole,这才让我肯定了php从底层对异步多线程的支持可能。

本文章也是在学习此框架时产生的一些想法加以实现后撰写,本次涉及到的内容只是此框架的冰山一角,真正用到多线程编程以及websocket实现聊天室技术的文章我改日还会发布,还希望留意博客哦~

原材料

  1. deepin
  2. apache
  3. swoole
  4. php7

官网对此swoole的安装说明写的非常详细文档也很齐全 推荐源码编译方式安装swoole扩展 需要注意的是在github上选择分支的时候不要选择高于1.8.1的版本 不然编译会报错 编译前请确定安装autoconf 不然无法生成configure配置项 实在嫌麻烦可以直接使用pecl命令一键安装

CODE

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
 
    //创建TCP服务器
    $serv new swoole_server('127.0.0.1','5555');
 
    //设置心跳包的检测频率和存活时间
    $serv->set(array(
        'heartbeat_check_interval' => 30,
        'heartbeat_idle_time' => 120
    ));
     
    //注册成功连接事件
    $serv->on('connect',function($serv,$fd){
        //$fd此时以被赋值为客户端的唯一身份标识
        echo "客户{$fd} 已连接至服务器\n";
    });
 
    //注册客户端发信事件
    $serv->on('receive',function($serv,$fd,$from_id,$data){
        if(mb_strlen($data)-2) {
            //接收客户端发来的$data数据后调用simsimi接口,得到回复内容
            $result = json_decode(file_get_contents('http://sandbox.api.simsimi.com/request.p?key=fe9e2dee-be3b-4906-a51d-0aa6bc40f82d&lc=ch&ft=1.0&text='.urlencode($data)),true);          
            $msg = @$result['response'] ?: '服务器开小差了~重试一次?'
 
            //向客户端发送回复内容
            $serv->send($fd,'simsimi: '.$msg."\n我: ");
        }else{
            $serv->send($fd,"不说点什么吗?\n");
 
        }
    });
     
    $serv->start();
?>

效果图


風前の灯になってもいいさ、残したの歳月痕跡を持ち続けて生きてゆく。