1.回顾阻塞模型
11)手写网络模型,实现的目录结构
12)当前目录网络结构
根据以上,建立对应文件
13)六个用到的函数
实质,服务端与客户端,是通过 stream_socket_accept连接的,即stream_socket_client---->stream_socket_accept--->stream_socket_server
14)回顾阻塞模型
客户请求服务获取信息的本质过程,对于服务来说:
(1). 连接 ( 2). 响应请求(就是执行相应的代码)
2构建基础 worker结构(工程结构)
<?php
//建立协议服务
$socket = stream_socket_server("tcp://0.0.0.0:8000", $errno, $errstr);
//创建服务和客户和客户连接的socket stream_socket_accept
if (!$socket) {
echo "$errstr ($errno)<br />\n";
} else {
//while 循环,可多次连接
/*while ($conn = stream_socket_accept($socket)) {
fwrite($conn, 'The local time is ' . date('n/j/Y g:i a') . "\n");
fclose($conn);
}
fclose($socket);*/
//while改成以下,无法做到多次连接
$conn = stream_socket_accept($socket);
fwrite($conn, 'The local time is ' . date('n/j/Y g:i a') . "\n");
fclose($conn);
//网络上的通常做法,while(ture)
/* while(true){ //始终监测 是否有信息发过来
$conn = stream_socket_accept($socket);
var_dump(fread($conn,65535));
fwrite($conn, 'The local time is ' . date('n/j/Y g:i a') . "\n");
fclose($conn);
}*/
}
<?php
//连接服务端
$client = new Swoole\Client(SWOOLE_SOCK_TCP );
if (!$client->connect('127.0.0.1', 8000, -1)) {
exit("connect failed. Error: {$client->errCode}\n");
}
$client->send("hello world\n");
/*$client->send("hello world\n");
$client->send("hello world\n");
$client->send("hello world\n");*/
echo $client->recv();
$client->close();
22)思路分析
221)基于客户请求服务获取信息的本质过程,服务具备的功能及方法
<?php
namespace IoStarJhy;
abstract class WorkerBase
{
protected $server;
protected $events=[];
protected $config;
protected $typc="tcp";
public function __construct($host,$port){
$this->server = stream_socket_server("tcp://".$host.":".$port);
echo "tcp://".$host.":".$port."\n";
}
/**
* 不同的模型实现不一样
* @var [type]
*/
protected abstract function accept();
/**
* 添加事件
* @method on
* @param [type] $event [description]
* @param [type] $call [description]
* @return [type] [description]
*/
public function on($event,$call){
$this->events[strtolower($event)] = $call;
}
public function set(){}
/**
* 发送信息
* @method send
* @param [type] $client [description]
* @param [type] $data [description]
* @return [type] [description]
*/
public function send($client,$data)
{
}
public function start()
{
var_dump($this->events);
$this->accept();
}
public function close()
{
}
}
<?php
namespace IoStarJhy\Blocking;
use IoStarJhy\WorkerBase;
class Worker extends WorkerBase {
public function accept()
{
}
}
<?php
require_once __DIR__."/../../vendor/autoload.php";
use IoStarJhy\Blocking\Worker;
$server = new Worker('0.0.0.0',9500);
$server->on('connect',function($server,$client){
});
$server->on('receive',function($server,$client,$data){
});
$server->on('close',function($server,$client){
});
$server->start();
<?php
function dd($message, $description = null)
{
echo "======>>> ".$description." start\n";
if (\is_array($message)) {
echo \var_export($message, true);
} else if (\is_string($message)) {
echo $message."\n";
} else {
var_dump($message);
}
echo "======>>> ".$description." end\n";
}
{
"name": "jhy/iostarjhy",
"type": "library",
"authors": [
{
"name": "jhy",
"email": "1195863294@qq.com"
}
],
"autoload": {
"psr-4": {
"IoStarJhy\\": "src"
},
"files":[
"src/Support/Helper.php"
]
},
"require": {}
}
243)命令更新,但最好用 composer dumpautoload
D:\phpstudy_pro\WWW\swoole_2006\iostarjhy>composer update
244)上传代码到服务器
245)使用测试
iostarjhy\src\WorkerBase.php的 __construct()及start()方法,改造如下:
public function __construct($host,$port){
$this->server = stream_socket_server("tcp://".$host.":".$port);
//echo "tcp://".$host.":".$port."\n";
dd("tcp://".swoole_get_local_ip()['ens33'].":".$port,"创建手写的worker服务");
}
public function start()
{
//var_dump($this->events);
dd($this->events,"启动后,输出服务的注册事件");
$this->accept();
}
运行
未完,见swoole 第6次课-2 含毫命简:阻塞与非阻塞2
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!