php swoole 安装与使用

swoole 安装
用的是centOS
php安装目录:/usr/local/php
php.ini配置文件路径:/usr/local/php/etc/php.ini
1、安装swoole
cd /usr/local/src
wget https://github.com/swoole/swoole-src/archive/v1.9.1-stable.tar.gz
tar zxvf v1.9.1-stable.tar.gz
cd swoole-src-1.9.1-stable
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make
make install
2、配置php支持swoole
vi /usr/local/php/etc/php.ini
添加
extension=swoole.so
3、重启php-fpm
service php-fpm restart
在phpinfo页面可以看到关于swoole的选项,说明安装成功。
搭建tcp 服务器

<?php //创建服务器 $host = '0.0.0.0'; $port = 9501; $serv = new swoole_server($host,$port) ; /* $host:127.0.0.1 本地ip 可以监听多个ip 使用0.0.0.0 $port:端口号 1024端口以下需要root权限 $mode : SWOOLE_PROCESS 多进程的方式 $socke_type:SWOOLE_SPCL_TCP / //使用 // bool $swoole_server->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

<?php $serv = new swoole_server("0.0.0.0",9502,SWOOLE_PROCESS,SWOOLE_SOCK_UDP) //监听数据接收事件 /* $serv:服务器信息 $data:数据,接收到的数据 $fd:客户端信息 */ $serv->on('packet',function($serv,$data,$fd){ //发送数据到相应的客户端,反馈信息 $serv->sendto($fd['address'],$fd['port'],"Server: $data"); var_dump($fd); } ); $serv->start() ?>

web 服务器

<?php //创建web服务器 $serv = new swoole_http_server("0.0.0.0",9501); // 获取请求 /* $request:请求信息 $response:返回信息 */ $serv->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

<?php //创建webscork 服务器 $ws =new swoole_websocket_server //on //open 建立连接 $ws 服务器, $request:客户端信息 $ws ->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

<?php //循环执行定时器 swoole_time_tick(2000,function($timer_id){ echo "执行 $timer_id \n"; }); //单次执行 swoole_time_after(3000,function(){ echo "3 秒后执行" }) ?> <?php //task() 函数 投递异步任务 //on('事件',function(){}) 处理函数 执行异步函数 //finish()函数, 任务处理完成后结果 //异步TCP服务器 //创建TCP服务器 $serv = new swoole_server("0.0.0.0",9501); //设置异步 进程工作数 $serv ->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(); ?> <?php //进程创建 /*

new swoole_process()
参数1: mixed $function 子进程创建成功后执行的函数
参数2: $redirect_stdin_stdout 重定向子进程的标准输入和输出。启用此选项后,在进程内echo将不是打印屏幕。而是写入到管道
读取键盘输入将变成从管道中读取。默认为阻塞读取
$create_pipe 是否创建管道。启用
$redirect_stdin_stdout后,此选项将忽略用户参数,强制为true,如果子进程内没有进程间通信,可以设置为false

*/
//创建进程
//进程对应的执行函数
function doProcess(swoole_process KaTeX parse error: Expected '}', got 'EOF' at end of input: …r){ echo "PID",worker->pid,"\n";
sleep(10);
}
//创建进程
//创建多个进程
$process = new swoole_process(“doProcess”);
$pid = $process->start();

$process = new swoole_process(“doProcess”);
$pid = $process->start();
//等待结束
swoole_process::wait();
?>

<?php //进程事件 //swoole_event_add() /*参数1:int_$sock int 文件描述 mixed $read callback 就是 stream_socket_client/fsockopen创建资源 sockets 就是sockets扩展中socket_create创建的资源,需要在编译时候加入 ./configure --enable-sockets */ $workers = [];//进程数组 $worker_num =3;//创建进程的数量 //创建启动进程 for ($i = 0;$i<$worker_num;$i++){ $process =new swoole_process('doProcess');//创建单独的新进程 $pid = $process->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"; }); } ?> <?php //进程队列通信 $workers = [];//进程仓库 $worker_num = 2;//最大进程数 //批量创建进程 for($i = 0;$i<$worker_num;$i++){ $process = new swoole_process('doProcess',false,false)//创建子进程完成 $process->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"; } ?> <?php //触发函数 异步执行 达到10次停止 swoole_process::signal(SIGALRM,function(){ static $i = 0; echo "$i \n"; $i++; if($i>10){ swoole_process::alarm(-1); //清除定时器 } }); //定时器 swoole_process::alarm(100 *1000); ?> <?php //创建锁对象 $lock = new swoole_lock(SWOOLE_MUTEX);//互斥锁 echo "创建互斥锁\n"; $lock->lock();//开始锁定 主进程 if(pcntl_fork()>0){ sleep(1); $lock->unlock();//解锁 }else{ echo "子进程 等待锁\n"; $lock->lock();//上锁 echo "子进程 获取所"; $lock->unlock();//释放锁 exit("子进程退出"); } echo "主进程 释放锁"; unset($lock); sleep(1); echo "子进程退出"; ?> <?php //dns查询 swoole_async_dns_lookup('www.baidu.com',function($host,$ip){ echo "$host,$ip"; }) ?>

swoole 实现及时通信 服务器端

<?php //服务器代码 //创建websocker 服务器 $ws =new swoole_websocket_server("0.0.0.0",9502); //on 函数 open message close //open情况 $ws->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() ?>

你是不是多少有了解一点,但是你却对这个不精啊!可以加xv:phpyasi520 交流学习,分享tp,laravel,swoole,swoft微服务、SQL性能优化,分布式、高并发等教程,各种大牛都是1-78年PHP开发者,每天还有11年的架构师做课程讲解,助你进阶中高级PHP程序员,增值涨薪!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值