【官方手册】https://linkeddestiny.gitbooks.io/easy-swoole/content/book/chapter01/install.html
【官网地址】https://wiki.swoole.com/wiki/index/prid-1#entry_h2_2
开发工具
- Swoole 4.X 速查表 https://toxmc.github.io/swoole-cs.github.io/
- IDE自动提示工具(自动生成版) :https://github.com/swoole/ide-helper
- 国内Git镜像:https://gitee.com/swoole/swoole
- 全量markdown文档: https://github.com/swoole/swoole-wiki
- 新手入门教程:https://www.gitbook.com/book/linkeddestiny/easy-swoole/details
- IDE自动提示工具(手动版) swoole-ide-helper:https://github.com/eaglewu/swoole-ide-helper
- Swoole-Docset: https://github.com/halfstring/swoole-chinese-docset
Swoole官方QQ群: 705119448
安装环境
* centos 7.2
* php-7.0 或更高版本
* gcc-4.8 或更高版本
安装依赖,安装前要检查是否已经安装这些依赖
gcc
pcre (centos系统可以执行命令:yum install pcre-devel)
autoconf
make #安装前要确保已经安装了,gcc -v 查看版本信息 不存在就是没安装
新手编译示例
cd swoole
phpize //如果命令不存在 请在前面加上php的实际路径
phpize //(ubuntu 没有安装phpize可执行命令:sudo apt-get install php-dev来安装phpize)
./configure
make
sudo make install
swoole官方安装地址
php安装目录一般在:/usr/local/php
php.ini配置文件路径:/usr/local/php/etc/php.ini
swoole 安装目录放在/usr/local/src
1、下载安装包
- 下载地址1https://github.com/swoole/swoole-src
下载地址2:https://github.com/swoole/swoole-src/releases
$ sudo wget https://github.com/swoole/swoole-src/archive/v4.3.3.tar.gz
$ sudo tar zxvf swoole-src-2.0.6.tar.gz
tar 四个参数
x : 从 tar 包中把文件提取出来
z : 表示 tar 包是被 gzip 压缩过的,所以解压时需要用 gunzip 解压
v : 显示详细信息
f xxx.tar.gz指定被处理的文件是 xxx.tar.gz
$ cd swoole-src-2.0.6
安装方法【1】使用PECL 一键安装
注意: PECL发布时间晚于Github发布时间
Swoole项目已收录到PHP官方扩展库,除了手工下载编译外,还可以通过PHP官方提供的pecl命令,一键下载安装
pecl install swoole
配置php.ini
编译安装成功后,修改php.ini加入
extension=swoole.so
通过php -m或phpinfo()来查看是否成功加载了swoole.so,如果没有可能是php.ini的路径不对,可以使用php --ini来定位到php.ini的绝对路径。
安装方法【2】编译安装
使用安装 php 时生成的 phpize 来生成 configure 配置文件(可以用 whereis phpize
查看路径,其中 php-config 和 phpize 所在的目录是相同的)
yum install -y openssl #如需wss/https需要安装openssl,而ws/http不需要
$ sudo /usr/bin/phpize
$ sudo ./configure --enable-openssl --with-php-config=/usr/bin/php-config #这个注意php-config的目录是你php真实安装路径
#如果不需要wss 可以删除 --enable-openssl
#宝塔面板可以点击php查看安装路径 ,我的是在/www/server/php/72/bin/php-config
#如果是集成环境,需要使用名 find / -name "php-config" 查询路径。
$ sudo make && sudo make install
- 开启
swoole
扩展
$ cd /etc/php.d/
$ sudo vim php.ini
; Enable xsl extension module
extension=swoole.so
- 重启
Apache
或Nginx
服务(php-fpm
服务也要重启)。 - 查看拓展安装情况 php-m
$ php -m |grep swoole
swoole
3、重启php-fpm
service php-fpm restart
在phpinfo页面可以看到关于swoole的选项,说明安装成功。
官网搭建简单demoweb服务器
参考官方手册:https://linkeddestiny.gitbooks.io/easy-swoole/content/book/chapter01/echo_server.html
服务端 Server
创建一个Server.php文件并输入如下内容:
// Server
class Server
{
private $serv;
public function __construct() {
$this->serv = new swoole_server("0.0.0.0", 9501);
$this->serv->set(array(
'worker_num' => 8,
'daemonize' => false,
));
$this->serv->on('Start', array($this, 'onStart'));
$this->serv->on('Connect', array($this, 'onConnect'));
$this->serv->on('Receive', array($this, 'onReceive'));
$this->serv->on('Close', array($this, 'onClose'));
$this->serv->start();
}
public function onStart( $serv ) {
echo "Start\n";
}
public function onConnect( $serv, $fd, $from_id ) {
$serv->send( $fd, "Hello {$fd}!" );
}
public function onReceive( swoole_server $serv, $fd, $from_id, $data ) {
echo "Get Message From Client {$fd}:{$data}\n";
$serv->send($fd, $data);
}
public function onClose( $serv, $fd, $from_id ) {
echo "Client {$fd} close connection\n";
}
}
// 启动服务器 Start the server
$server = new Server();
客户端 Client
创建一个Client.php文件并输入如下内容: Create a file named 'Client.php' and type in following codes:
client = new swoole_client(SWOOLE_SOCK_TCP);
}
public function connect() {
if( !$this->client->connect("127.0.0.1", 9501 , 1) ) {
echo "Error: {$this->client->errMsg}[{$this->client->errCode}]\n";
}
fwrite(STDOUT, "请输入消息 Please input msg:");
$msg = trim(fgets(STDIN));
$this->client->send( $msg );
$message = $this->client->recv();
echo "Get Message From Server:{$message}\n";
}
}
$client = new Client();
$client->connect();
启动服务器
在Terminal下执行命令
php Server.php #即可启动服务器,
在另一个Terminal下执行
php Client.php
输入要发送的内容,即可发送消息到服务器,并收到来自服务器的消息。
下面是一个demo实例
搭建tcp 服务器
on(string $event,mixed $callback)
/*
* $event:
* connect: 当建立连接的时候 $serv 服务器信息 $fd:客户端信息
* receive: 当接受到的数据$serv 服务器信息,$fd 客户端,$from_id ID,$data 数据
* close:关闭连接
*/
$serv->on('connect',function($serv,$fd){
echo "连接成功"
});
$serv->on('receive',function($serv,$fd,$from_id,$data){
echo "接收到的数据";
var_dump($data); //打印接收到的数据
});
$serv->on('close',function($serv,$fd){
echo"连接关闭";
})
$serv->start();//启动服务
?>
上传到 服务器后
php index.php 启动
ps -ajft 查看进程来查看启动成功没
使用网络调试助手来进行调试查看tcp服务是否好用
UDP服务器创建
udp.php
on('packet',function($serv,$data,$fd){
//发送数据到相应的客户端,反馈信息
$serv->sendto($fd['address'],$fd['port'],"Server: $data");
var_dump($fd);
}
);
$serv->start()
?>
web 服务器
on('request',function($request,$response){
var_dump($request);
$response->header("Content-Type","text/html;charset=utf-8");//设置返回头信息
$response->end("hello word".rand(100,999));
});
$serv->start();
?>
实现websocket
on('open',function($ws,$request){
var_dump($request);
$ws->push($request->fd,"welcome \n");
})
//message 接收信息
$ws ->on('message',function($ws,$request){
echo "Message: $request->data";
$ws->push($request->fd,"get it message");
});
//close 关闭连接
$ws->on('close',function($ws,$request){
echo "close\n";
})
$ws->start();
?>
webscork.html
set(array('task_worker_num' =>4 ));
// 投递异步任务
$serv->on("receive",function($serv,$fd,$from_id,$data){
$task_id = $serv->tack($data);//获取异步ID
echo "异步ID: $task_id\n";
});
//处理异步任务
$serv -> on('task',functino($serv,$task_id,$from_id,$data){
echo "执行 异步ID:$task_id";
$serv-finish("$data->ok");
});
//处理结果
$serv ->on('finish',function($serv,$task_id,$data){
echo "执行完成";
})
$serv->start();
?>
pid,"\n";
sleep(10);
}
//创建进程
//创建多个进程
$process = new swoole_process("doProcess");
$pid = $process->start();
$process = new swoole_process("doProcess");
$pid = $process->start();
//等待结束
swoole_process::wait();
?>
start();//启动进程,获取进程ID
$workers[$pid] = $process;// 存入进程数组
}
//创建进程执行函数
function doProcess(swoole_process $process){
$process->write("PID:$process->pid");//子进程写入信息
echo "写入信息: $process->pid $process->callback";
}
//添加进程事件 向每一个子进程添加需要执行的动作
foreach($workers as $process){
//添加
swoole_event_add($process->pipe,function($pipe) use($process){
$data = $process->read();//能否读取数据
echo "接受到:$data \n";
});
}
?>
useQuneue();//开启队列,类似于全局函数
$pid = $process->start();
$workers[$pid] = $process
}
//进程执行函数
function doProcess(swoole_process $process){
$recv = $process->pop();//8192
echo "从主进程获取到的数据:$recv \n";
sleep(5);
$process->exit(0);
}
//主进程 向子进程添加数据
foreach($workers as $pid =>$process){
$process->push("Hello 子进程 $pid \n")
}
//等待子进程结束回收资源
for($i=0;$i<$worker_num;$i++){
$ret = swoole_process::wait();//等待执行完成
$pid = $ret['pid'];
unset($workers[$pid]);
echo "子进程退出 $pid \n";
}
?>
10){
swoole_process::alarm(-1); //清除定时器
}
});
//定时器
swoole_process::alarm(100 *1000);
?>
lock();//开始锁定 主进程
if(pcntl_fork()>0){
sleep(1);
$lock->unlock();//解锁
}else{
echo "子进程 等待锁\n";
$lock->lock();//上锁
echo "子进程 获取所";
$lock->unlock();//释放锁
exit("子进程退出");
}
echo "主进程 释放锁";
unset($lock);
sleep(1);
echo "子进程退出";
?>
swoole 实现及时通信 服务器端
on('open',function($ws,$request){
echo "新用户 $request->fd 加入。\n";
$GLOBALS['fd'][$request->fd]['id'] =$request->fd;//设置用户ID
$GLOBALS['fd'][$request->fd]['name'] ='匿名用户';//设置用户名
});
//message 收发消息
$ws->on('message',function($ws,$request){
$msg =$GLOBALS['fd'][$request->fd]['name'].":".$request->data."\n";
if(strstr($request->data,"#name#")){
//用户设置昵称
$GLOBALS['fd'][$request->fd]['name']=str_replace("#name#",'',$request->data);
}else{ //进行用户信息发送
//发送到每一个客户端
foreach ($GLOBALS['fd'] as $i){
$ws->push($i['id'],$msg);
}
}
});
//close
$ws->on('close',function($ws,$request){
echo "客户端-{$request} 断开连接\n";
unset($GLOBALS['fd'][$request]);//清除连接仓库
});
$ws->start()
?>