swoole学习,新手入门,简单易懂

第一章: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					//什么程序占用
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值