第一章:swoole编程须知

1、睡眠函数的影响

处理方式:

//开启协程定时器调度
Swoole\Runtime::enableCoroutine(true);$server = new Swoole\server('0.0.0.0',9521);$server->set(['worker_num'=>3                 //设置多个进程
]);$server->on('receive',function($server,$fd,$reactorId,$data){$server->send($fd,'aaaa');sleep(5);$server->send($fd,"Swoole : {$data}");
});$server->start();

2、中止函数的影响(查看工作进程:ps -ajft)

处理方式:

Swoole\Runtime::enableCoroutine(true);$server = new Swoole\server('0.0.0.0',9521);$server->set(['worker_num'=>1
]);$server->on('receive',function($server,$fd,$reactorId,$data){try{$server->send($fd,'aaaa');sleep(5);exit;$server->send($fd,"Swoole : {$data}");}catch(\Throwable $e){echo $e->getMessage() . '+++' . PHP_EOL; //PHP_EOL 换行符}});$server->start();

3、死循环的影响

处理方式:

Swoole\Runtime::enableCoroutine(true);$server = new Swoole\server('0.0.0.0',9521);$server->set(['worker_num'=>2      //增加工作进程
]);$server->on('receive',function($server,$fd,$reactorId,$data){$server->send($fd,'aaaa');//去掉死循环$i = 0;while(true){$i++;}$server->send($fd,"Swoole : {$data}");
});$server->start();

4、随机函数的影响

处理方式:

$worker_num = 3;    //工作进程数//使用随机数种子
srand();
// rand(1,5);
// $arr = [1,2,3,4];
// shuffle($arr);
// array_rand($arr);for ($i=0; $i < $worker_num; $i++) { $process = new Swoole\Process('func');$process->start();
}function func(Swoole\Process $process){//重新播种srand();echo PHP_EOL .rand(0,10) . PHP_EOL;$process->exit();
}sleep(1);

5、进程隔离
1)基本概念

2)进程隔离意味着什么

3)进程间如何通信

$i = 0;$server = new Swoole\Server('0.0.0.0',9521);$server->set(['worker_num'=>2,
]);$server->on('Receive',function($server,$fd,$reactorId,$data) use(&$i){// global $i;$i++;//验证有没有接收到客户端请求$server->send($fd,"{$i}\n");
});$server->start();

第二章:swoole服务器

1、TCP服务器



$server = new Swoole\Server('0.0.0.0',9521,SWOOLE_PROCESS,SWOOLE_SOCK_TCP);$server->set(['worker_num'=>2,
]);$server->on('Connect',function($server,$fd){echo "Client $fd connect \n";
});$server->on('Receive',function($server,$fd,$reactorId,$data){//验证有没有接收到客户端请求$server->send($fd,"aaaa\n");
});$server->on('Close',function($server,$fd){echo "Client $fd close \n";
});$server->start();

2、UDP服务器



$server = new Swoole\Server('0.0.0.0',9521,SWOOLE_PROCESS,SWOOLE_SOCK_UDP);$server->set(['worker_num'=>2,
]);$server->on('Packet',function($server,$data,$clientInfo){print_r($clientInfo);$server->sendto($clientInfo['address'],$clientInfo['port'],$data);
});$server->start();

测试UDP方法一,需要安装netcat:

yum install -y netcat或者 yum install -y nc        //我这里第二个行

配置环境变量:

vi /etc/profile
export NETCAT_HOME=/opt/module/netcat
export PATH=$PATH:$NETCAT_HOME/bin

重新载入配置文件:

source /etc/profile

测试是否安装成功

nc –help 或 netcat –help      //第一个成功

开始测试:

nc -u 127.0.0.1 9521

测试UDP方法二,网络调试助手:

3、Server的四层生命周期

//1、程序全局期
$a = 'A';$server = new Swoole\Server('0.0.0.0',9521,SWOOLE_PROCESS,SWOOLE_SOCK_UDP);$server->set(['worker_num'=>2,
]);$server->on('WorkerStart',function($server,$workerId){//2、进程全局期echo "Worker $workerId started\n";
});$server->on('Connect',function($server,$fd){//3、会话期echo "Client $fd connect\n";
});$server->on('Receive',function($server,$fd,$reactorId,$data){//4、请求期$server->send($fd,"aaa\n");
});$server->on('Close',function($server,$fd){//会话期结束echo "Client $fd closd\n";
});$server->start();

4、全局配置选项详解



5、事件回调函数详解



6、HTTP服务器





7、HTTP Server参数接收响应


8、HTTP Server常见问题


9、WebSocket服务器


回调函数

方法列表

预定义常量

配置选项

案例:即时聊天

百度网盘源码下载链接:https://pan.baidu.com/s/1YUUqQv9qdQj7is5nq_BnjQ
提取码:cp1u

10、Redis服务器
1)基本概念

2)可用客户端

3)提供方法

4)提供常量

use Swoole\Redis\Server;$server = new Server('0.0.0.0',9521);$server->strings = [];$server->setHandler('set',function($fd,$data) use($server){$key = $data[0];$val = $data[1];$server->strings[$key] = $val;$server->send($fd,Server::format(Server::STRING,'OK'));
});$server->setHandler('get',function($fd,$data) use($server){$key = $data[0];$val = $server->strings[$key];$server->send($fd,Server::format(Server::STRING,$val));
});$server->start();

11、零秒定时器
1)基本概念

2)可用方法

use Swoole\Timer;Timer::after(2000,function(){echo "this is a after timer\n";
});$i = 0;Timer::tick(2000,function($timerId,$param1,$param2) use(&$i){$i++;echo $i . PHP_EOL;echo $param1 . '---' . $param2 . PHP_EOL;if($i == 5){Timer::clear($timerId);}
},'A','B');

12、执行异步任务


$server = new Swoole\Server('0.0.0.0',9521,SWOOLE_PROCESS,SWOOLE_SOCK_TCP);$server->set(['worker_num'=>2,'task_worker_num'=>2,
]);$server->on('WorkerStart',function($server,$workerId){if($workerId == 0){$data = [1,2,3,4,5];foreach($data as $v){echo "Send task data $v \n";$server->task($v);}}
});$server->on('Receive',function($server,$fd,$reactorId,$data){});$server->on('Task',function($server,$taskId,$srcWorkerId,$data){sleep(1);echo "Task#$taskId execute task, data is $data \n";return "aaa$data";
});$server->on('Finish',function($server,$taskId,$data){echo "Task $taskId execute finish,data is $data \n";
});$server->start();

13、网络通信协议设计

EOF结束符协议

固定包头加包体协议

第三章:Swoole协程
1、CSP编程方式


Swoole\Coroutine::set(['max_coroutine'=>2000,
]);for($i = 0;$i < 1000; $i++){go(function(){echo 'A';co::sleep(5);     //co是coroutine的缩写echo 'B';});
}

2、网络客户端一键协程



Swoole\Coroutine::set(['max_coroutine'=>2000,
]);Swoole\Runtime::enableCoroutine(true);for($i = 0;$i < 1000; $i++){go(function(){echo 'A';sleep(5);       //co是coroutine的缩写echo 'B';});
}

3、协程编程须知




4、协程执行流程

Swoole\Runtime::enableCoroutine(true);Swoole\Coroutine::set(['max_coroutine'=>2000,
]);go(function(){echo "main co start" . co::getcid() . PHP_EOL;go(function(){echo "child co start" . co::getcid() . PHP_EOL;sleep(2);echo "child co end" . co::getcid() . PHP_EOL;});go(function(){echo "child co start" . co::getcid() . PHP_EOL;sleep(1);echo "child co end" . co::getcid() . PHP_EOL;});echo "main co end" . co::getcid() . PHP_EOL;
});echo "end" .PHP_EOL;

5、并发调用



6、WaitGroup功能

/*** waitgroup_co.php** github.com/farwish/swoole-wholly* github.com/swoole/swoole-src/blob/master/library/core/Coroutine/WaitGroup.php** @author ercom*/namespace Swoole\Coroutine;use BadMethodCallException;
use InvalidArgumentException;class WaitGroup
{protected $chan;protected $count = 0;protected $waiting = false;public function __construct(){$this->chan = new Channel(1);}public function add(int $delta = 1): void{if ($this->waiting) {throw new BadMethodCallException('WaitGroup misuse: add called concurrently with wait');}$count = $this->count + $delta;if ($count < 0) {throw new InvalidArgumentException('negative WaitGroup counter');}$this->count = $count;}public function done(): void{$count = $this->count - 1;if ($count < 0) {throw new BadMethodCallException('negative WaitGroup counter');}$this->count = $count;if ($count === 0 && $this->waiting) {$this->chan->push(true);}}public function wait(float $timeout = -1): bool{if ($this->count > 0) {$this->waiting = true;$done = $this->chan->pop($timeout);$this->waiting = false;return $done;}return true;}
}// 以上使用的是 swoole-4.4.4 library 的 WaitGroup.php\Swoole\Runtime::enableCoroutine(true);\Swoole\Coroutine::set(['max_coroutine' => 2000,
]);go(function () {$wg = new WaitGroup;echo "main co start " . \co::getcid() . PHP_EOL;$wg->add();go(function () use ($wg) {echo "child co start " . \co::getcid() . PHP_EOL;sleep(2);echo "child co end " . \co::getcid() . PHP_EOL;$wg->done();});$wg->add();go(function () use ($wg) {echo "child co start " . \co::getcid() . PHP_EOL;sleep(1);echo "child co end " . \co::getcid() . PHP_EOL;$wg->done();});$wg->wait();echo "main co end " . \co::getcid() . PHP_EOL;
});/* 未使用 waitgroup
main co start 1
child co start 2
child co start 3
main co end 1
child co end 3
child co end 2*//* 使用 waitgroup
main co start 1
child co start 2
child co start 3
child co end 3
child co end 2
main co end 1*/

第四章:swoole共享内存

1、共享内存Table




$table = new Swoole\Table(1024);$table->column('id',Swoole\Table::TYPE_INT,2);
$table->column('name',Swoole\Table::TYPE_STRING,2);
$table->column('age',Swoole\Table::TYPE_INT,2);$boole = $table->create();if(!$boole){echo "Create swoole table failed\n";
}else{$table->set('user1',['id'=>1,'name'=>'Jack','age'=>18,]);$table->set('user2',['id'=>2,'name'=>'Tom','age'=>19,]);$user1 = $table->get('user1');$user2 = $table->get('user2');print_r($user1);print_r($user2);
}

2、原子计算器Atomic



3、同步锁Lock


第五章:swoole多进程编程

1、创建子进程






for($i = 0; $i < 5; $i++){$process = new Swoole\Process(function(Swoole\Process $process){$process->name('process child');sleep(5);});$process->name('process master');$process->start();
}sleep(10);

2、管道数据读写





$process = new Swoole\Process(function(Swoole\Process $process){$process->name('process child');echo "\n child send start\n";$process->write('from child, hello');echo "\n child send end\n";echo "\n received from master : " . $process->read();
});$process->name('process master');
$process->start();echo "\nreceived from child : " . $process->read() . PHP_EOL;$process->write('from master, hello~');sleep(10);

3、使用消息队列通信




for($i = 0; $i < 5; $i++){$process = new Swoole\Process(function(Swoole\Process $process){$process->name('process child');while(true){$msg = $process->pop();if($msg === false){break;}echo "\n $process->pid received msg $msg \n";}});$process->useQueue();$process->name('process master');$process->start();
}sleep(1);while(true){echo "\n ========== \n";foreach (['a','b','c','d','e'] as $value) {$process->push($value);}sleep(2);
}sleep(10);

4、守护进程化

Swoole\Process::daemon();for($i = 0; $i < 5; $i++){$process = new Swoole\Process(function(Swoole\Process $process){$process->name('process child');while(true){$msg = $process->pop();if($msg === false){break;}// echo "\n $process->pid received msg $msg \n";}});$process->useQueue();$process->name('process master');$process->start();
}sleep(1);while(true){// echo "\n ========== \n";foreach (['a','b','c','d','e'] as $value) {$process->push($value);}sleep(2);
}sleep(10);

5、信号监听



for($i = 0; $i < 5; $i++){$process = new Swoole\Process(function(Swoole\Process $process){sleep(rand(2,6));});$process->start();
}Swoole\Process::signal(SIGCHLD,function($signo){echo "\n $signo \n";while($res = Swoole\Process::wait(false)){print_r($res);}
});

6、进程池






$pool = new Swoole\Process\Pool(5);$pool->on('workerStart',function(Swoole\Process\Pool $pool,$workerId){echo "\n $workerId \n";sleep(rand(2,6));
});$pool->start();

第六章:swoole客户端

1、同步阻塞与异步阻塞











先运行tcp,再执行client

$client = new Swoole\Client(SWOOLE_SOCK_TCP);if(!$client->connect('0.0.0.0',9521)){echo "Connect failed, error code " . $client->errCode . PHP_EOL;die;
}$client->send('hello');echo $client->recv() . PHP_EOL;$client->close();

2、长连接与并行

第七章:swoole高级部分

1、swoole架构与实现




2、swoole高可用与自启动


3、mysql长连接与连接池



第八章:swoole其它

1、守护进程常用结构



2、日志等级控制



3、swoole辅助函数









4、php选项与内核参数







ps:swoole学习到此结束了,学习的过程很懵,继续学习swoole的相关实战,就会豁然开朗了。swoole的学习用到两个工具,xshell和网络调试注册(cm精简版),需要资源下载的,下面提供百度网盘链接地址,里面还有我编写的相关代码以及一个聊天案例,感谢大家的观看!

链接:https://pan.baidu.com/s/1rJ02P7e1qX1Gj2v5dRm6qA
提取码:1f1n

ps:端口相关命令

fuser -un tcp 9521               //查看端口号的id
kill 29872(id)                  //结束进程
netstat -tlnp | grep 8080       //过滤端口号
netstat -tln                    //查看关于linux系统端口
netstat -tlnp                   //什么程序占用

swoole学习,新手入门,简单易懂相关推荐

  1. c语言计算机培训,C语言计算机基础学习||新手入门必看

    本次内容笔者将完全抛弃传统教学的形式,通过自己所学所闻得出来的心得,用通俗易懂的语言结合生活,来让大家更好的认识计算机编程,更好的入门计算机基础. 笔者也想用自己的论述告诉大家,专业知识有时会比较枯燥 ...

  2. html 甘特图_甘特图怎么画?甘特图基础教程,小白快速入门简单易懂

    甘特图是什么?可能你是第一次听到,甘特图是通过活动顺序和时间间隔表示某一特定项目其顺序与时间的关系.不同于时间表,或日程规划表,甘特图可以使使用者更直观的知道在某一时间的工作内容和进度. 甘特图常见用 ...

  3. Alibaba Arthas快速入门 简单易懂

    简介 Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load.内存.gc.线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参.异常,监测方法执 ...

  4. IntelliJ IDEA 使用Maven工具 (新手入门简单操作,maven的下载,安装,配置)

    一.maven的概述 1.什么是maven   maven是一个项目管理工具,包含项目管理,插件以及目标的逻辑等.maven为我们提供了一系列的执行流程: maven执行流程 2.maven的下载安装 ...

  5. Protege 使用教程(详细讲解 入门简单易懂)

    Protege 使用教程 首先看一下我们的数据库表单,主要是三个类别,五张表单. 并且像actor.movie.genre中包含具有的属性. 接下来,我们的需求就是使用Protege软件,构建实体关系 ...

  6. PHP新手入门简单了解PHP知识

    1:什么是PHP? PHP(Hypertext Preprocessor,超文本预处理器)是一种开源.服务器端.跨平台,HTML嵌入式的脚本语言,其语法吸收了C.Java和Perl的语言特点,利于学习 ...

  7. Docker超详细学习教程,简单易懂(小白必看)

    事先说明,本教程使用的是Mac版docker桌面版,命令执行都是在Mac终端实现,不管什么平台,命令.操作都是一样的 Docker概述与历史 该处去官网看一下或者自行百度,个人建议还是要了解一下,毕竟 ...

  8. 【IOS开发】IOS开发新手入门--简单计算器实现

    编程语言基础:objective-c基础语法 编程工具:Xcode4.6 第一步:打开Xcode,选择下面的Create a new Xcode projectd 第二步:选中如图,点Next进入下一 ...

  9. C#泛型学习实例(简单易懂)

    默认分类 2009-09-23 21:04:59 阅读62 评论0  字号:大中小 订阅 /* * Created by SharpDevelop. * User: Administrator * D ...

最新文章

  1. 基于java+jdbc+servlet+jsp实现图书商城
  2. C#中as与is的用法
  3. ZOJ 3781 Paint the Grid Reloaded
  4. MQTT发布消息核心流程之一
  5. Html 教程 (4) <head>
  6. 在ssh项目中的中配置数据源c3p0
  7. Java多线程--synchronized修饰普通方法和修饰静态方法的区别
  8. OpenCV在相机或图像中检测QR码的实例(附完整代码)
  9. layui导入模板数据_layui表格-template模板的三种用法
  10. Numpy实现BP神经网络(包含Dropout、BN等训练技巧)
  11. 《信息检索》第8讲 毕业论文学习指导(资源及预习材料)
  12. uni-app 调用接口封装文档
  13. 教你在 Centos 7 中使用 DenyHosts防止ssh暴力破解(亲测)
  14. [.NET领域驱动设计实战系列]专题十:DDD扩展内容:全面剖析CQRS模式实现
  15. 20200812每日一句
  16. java 文字串叠字检查_Java 正则表达式详细实例解析
  17. Unity:发布WebGL遇到的坑
  18. EXCEL慢的解决方法
  19. 80后的北漂IT人:你的未来在哪?该做好打算了!
  20. 有关ucenter同步的原理(个人总结的一点浅薄见解)

热门文章

  1. 谈一谈HTML中table、tr、td标签的width和height
  2. 罗马仕php30和plp30,华为p30和华为p30pro有什么区别_哪个值得购买测评
  3. 【中等】龙与地下城游戏问题-Java:经典动态规划解法
  4. 限制表格里面的显示字数
  5. 【人工智能】不确定性推理方法——C-F模型
  6. hbulider在内置浏览器运行的页面扫码运行到手机
  7. idea显示所有的打开文件
  8. 【ubuntu安装 hb 报错】
  9. 计算机考试 硬回车,2016年职称计算机考试WPS_Office模拟试题及答案2
  10. calendar库:Python日历的处理与生成