在docker中给php添加swoole扩展
获取swoole扩展
这里可以选择swoole版本https://pecl.php.net/package/swoole
- 使用
wget https://pecl.php.net/get/swoole-4.8.9.tgz
下载扩展文件,这里我下载的是4.8.9的版本 - 解压文件
tar zxvf swoole-4.8.9.tgz
安装扩展
-
将文件复制到容器的扩展目录
- 容器内默认没有
/usr/src/php
这个目录,需要docker exec -it myphp /bin/bash
进入容器使用docker-php-source extract
创建目录 exit
退出容器- 将扩展文件复制到容器中
docker cp swoole-4.8.9 myphp:/usr/src/php/ext/swoole
- 容器内默认没有
-
使用
docker exec -it myphp /bin/bash
命令进入我之前创建的php容器 -
docker-php-ext-install swoole
安装swoole扩展,耐心等几分钟 -
php -m|grep swoole
查看是否安装swoole扩展
测试swoole扩展
这里主要参考了http://www.manks.top/swoole-socket-server.html,感谢大佬
-
进入容器myphp映射目录
cd /docker/nginx/www/myphp/
-
创建server.php用于创建一个swoole服务
vim server.php
-
<?php $serv = new swoole_server('127.0.0.1',9501);//创建一个server对象,9501代表端口 //设置worker进程数 $serv->set([ 'worker_num' => 2 ]); //当有新的客户端连接时,会触发此回调,参数$serv是最开始创建的server对象,$fd是唯一标识,用于区分不同的客户端 $serv->on("Connect",function($serv,$fd){ echo "有新的连接".PHP_EOL; }); //server接收到客户端的数据后,worker进程触发该回调方法,$fromId指的是reactor线程,$data是客户端传递过来的数据,可以是字符串或二进制内容,目前使用字符串 $serv->on('Receive',function($serv,$fd,$fromId,$data){ //收到数据后发送给客户端 $serv->send($fd,'Server'.$data); }); //客户端断开后或者server主动关闭连接时worker进程内调用 $serv->on('Close',function($serv,$fd){ echo "连接关闭".PHP_EOL; }); //启动serv $serv->start(); ?>
-
创建一个index.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', 9501) || exit("connect failed. Error: {$client->errCode}\n"); // 向服务端发送数据 $client->send("你好啊"); // 从服务端接收数据 $response = $client->recv(); // 输出接受到的数据 echo $response . PHP_EOL; // 关闭连接 $client->close(); ?>
-
docker exec -it myphp /bin/bash
进入php容器 -
cd /www/myphp/
进入存放代码目录 -
运行
php server.php
,此时服务打开了 -
访问浏览器地址