博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
swoole 安装和简单实用
阅读量:6566 次
发布时间:2019-06-24

本文共 4384 字,大约阅读时间需要 14 分钟。

Swoole是:PHP语言的高性能网络通信框架,提供了PHP语言的异步多线程服务器,处理异步任务,异步TCP/UDP网络客户端,异步MySQL,数据库连接池,AsyncTask,消息队列,毫秒定时器,异步文件读写,异步DNS查询。 Swoole虽然是标准的PHP扩展,实际上与普通的扩展不同。普通的扩展只是提供一个库函数。而swoole扩展在运行后会接管PHP的控制权,进入事件循环。当IO事件发生后,swoole会自动回调指定的PHP函数。

一:两种安装方式:
1》编译安装:
1>wget http://pecl.php.net/get/swoole-1.9.6.tgz 或者
    wget http://www.taikongliu.com/swoole/swoole-1.7.6-stable.tar.gz        //下载swoole    
2>tar -zxvf swoole-1.7.6-stable.tar.gz        //解压swoole
3>cd swoole-src-swoole-1.7.6-stable/        //进入swoole
4>/phpstudy/server/php/bin/phpize        //生成configure
5>./configure --with-php-config=/phpstudy/server/php/bin/php-config        //编译
6>make && make install            //安装
7>cd /phpstudy/server/php/lib/php/extensions/no-debug-non-zts-20121212    //查看是否安转上了swoole.so    (注意:此文件下边都是你安装的拓展)
8>vim /phpstudy/server/php/etc/php.ini     //在php.ini添加extension=swoole.so加入到文件最后一行
9>/phpstudy/server/nginx/sbin/nginx  -s reload    //重启nginx    
10>查看phpinfo,这时候swoole拓展已经装上了
2》PECL安装:
1>pecl install swoole    //如果以上步骤一切正常的话,即表示swoole已经成功的安装了。
2>extension=swoole.so            //成功之后,我们打开php.ini(不知道配置文件在哪的回去再把CLI看一遍),把swoole.so加入到文件最后
3>$ php -m | grep swoole    //查看swoole是否被正确的安装
如如果想要升级swoole:pecl upgrade swoole
二:服务器端运行程序
1>创建server.php
<?php
$serv = new swoole_server('127.0.0.1', 9501);    
//server的创建,只需要绑定要监听的ip和端口,如果ip指定为127.0.0.1,则表示客户端只能位于本机才能连接,其他计算机无法连接。
//端口这里指定为9501,可以通过netstat查看下该端口是否被占用。如果该端口被占用,可更改为其他端口,如9502,9503等。
$serv->set([    //我开2个worker进程处理我们的业务
    'worker_num' => 2,
]);
// 有新的客户端连接时,worker进程内会触发该回调
$serv->on('Connect', function ($serv, $fd) {
    echo "new client connected." . PHP_EOL;
});
//参数$serv是我们一开始创建的swoole_server对象,
//参数$fd是唯一标识,用于区分不同的客户端,同时该参数是1-1600万之间可以复用的整数。
// server接收到客户端的数据后,worker进程内触发该回调
$serv->on('Receive', function ($serv, $fd, $fromId, $data) {
    // 收到数据后发送给客户端
    $serv->send($fd, 'Server '. $data);
});
// 客户端断开连接或者server主动关闭连接时 worker进程内调用
$serv->on('Close', function ($serv, $fd) {
    echo "Client close." . PHP_EOL;
});
// 启动server
$serv->start();
?>
2>由于swoole_server只能运行在CLI模式下,所以不要试图通过浏览器进行访问,这样是无效的,我们在命令行下面执行,注意一定要找到php的绝对路径
     /phpstudy/server/php/bin/php  server.php  (这行代码的意思是,把程序在服务器跑起来)
    注意:我们平时执行完一个指令,执行完就结束了,但是现在的情况正好相反,当前程序一直处于执行中的状态,并没有退出终端。退出状态一般为当前终端的执行权交给了终端,
    即可用在终端下进行其他操作,此时服务器的进程已经开启了。
3>在开另一个终端,执行  telnet 127.0.0.1 9501  (模拟客户端请求)   如果没有安装telnet,可以 yum install -y telnet 安装
4>创建客户端文件,也要在CLI下执行:client.php
<?php
// 创建一个同步阻塞的tcp socket
// 第一个参数是表示socket的类型,有下面四种类型选择,这里选则tcp socket就好
/**
 *     SWOOLE_SOCK_TCP 创建tcp socket
SWOOLE_SOCK_TCP6 创建tcp ipv6 socket
SWOOLE_SOCK_UDP 创建udp socket
SWOOLE_SOCK_UDP6 创建udp ipv6 socket
 */
// 第二个参数是同步还是异步
/**
 *     SWOOLE_SOCK_SYNC 同步客户端
SWOOLE_SOCK_ASYNC 异步客户端
 */
$client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_SYNC);
// 随后建立连接,连接失败直接退出并打印错误码
$client->connect('127.0.0.1', 9503) || exit("connect failed. Error: {$client->errCode}\n");
// 向服务端发送数据
$client->send("hello server.");
// 从服务端接收数据
$response = $client->recv();
// 输出接受到的数据
echo $response . PHP_EOL;
// 关闭连接
$client->close();
5>/phpstudy/server/php/bin/php client.php        //执行客户端,输出Server hello server.
6>使用task异步处理数据
  在建服务器程序 server_asy.php
 <?php
/**
 * swoorl异步处理
 */
$serv = new swoole_server("127.0.0.1", 9503);
//配置task进程的数量,即配置task_worker_num这个配置项。比如我们开启一个task进程
$serv->set([
    'task_worker_num' => 1,
]);
$serv->on('Connect', function ($serv, $fd) {
    echo "new client connected." . PHP_EOL;
});
$serv->on('Receive', function ($serv, $fd, $fromId, $data) {
    echo "worker received data: {$data}" . PHP_EOL;
    // 投递一个任务到task进程中
    $serv->task($data);
    // 通知客户端server收到数据了
    $serv->send($fd, 'This is a message from server.');
    // 为了校验task是否是异步的,这里和task进程内都输出内容,看看谁先输出
    echo "worker continue run."  . PHP_EOL;
});
/**
 * $serv swoole_server
 * $taskId 投递的任务id,因为task进程是由worker进程发起,所以多worker多task下,该值可能会相同
 * $fromId 来自那个worker进程的id
 * $data 要投递的任务数据
 */
$serv->on('Task', function ($serv, $taskId, $fromId, $data) {
    echo "task start. --- from worker id: {$fromId}." . PHP_EOL;
    for ($i=0; $i < 5; $i++) {
        sleep(1);
        echo "task runing. --- {$i}" . PHP_EOL;
    }
    echo "task end." . PHP_EOL;
});
$serv->on('Finish', function ($serv, $taskId, $data) {
    echo "finish received data '{$data}'" . PHP_EOL;
});
$serv->start();
7>/phpstudy/server/php/bin/php server_asy.php        //执行服务器
8>/phpstudy/server/php/bin/php client.php        //在执行客户端
9>再把server_asy.php中的echo"task end." . PHP_EOL;  改成return "task end." . PHP_EOL;,执行
   /phpstudy/server/php/bin/php server_asy.php    和/phpstudy/server/php/bin/php client.php,
  这时就可以看到swoole的异步请求成功了

转载于:https://www.cnblogs.com/taikongliu/p/6801950.html

你可能感兴趣的文章
Web自动化之Headless Chrome概览
查看>>
【133天】尚学堂高淇Java300集视频精华笔记(71-72)
查看>>
剖析 Laravel 计划任务--事件属性
查看>>
百度成立国内首个深度学习教育联盟,将制定行业标准
查看>>
Micronaut教程:如何使用基于JVM的框架构建微服务
查看>>
检查IP是否可用的方法
查看>>
互联网架构师必备技术 Docker仓库与Java应用服务动态发布那些事
查看>>
Intellij IDEA 2018.2 搭建Spring Boot 应用
查看>>
作为数据科学家,我都有哪些弱点
查看>>
(转)线程安全的CopyOnWriteArrayList介绍
查看>>
中交兴路完成7亿元A轮融资,携手蚂蚁金服共建小微物流科技服务生态
查看>>
对LinqtoExcel的扩展 【数据有限性,逻辑有效性】
查看>>
WPF TreeView HierarchicalDataTemplate
查看>>
32岁老程序员的现状和尴尬,无奈中透露些许悲凉,有选择却更痛苦
查看>>
WPF MeshGeometry3D
查看>>
puppet cron 模块
查看>>
mysql 协议的ResultsetRow包及解析
查看>>
Ymal格式转Properties格式
查看>>
一个生成全局唯一Sequence ID的高并发工厂类 (Java)
查看>>
调优之系统篇--cpu,内存
查看>>