代码
This commit is contained in:
commit
1be654dd5f
23
Client/tcp_client.php
Normal file
23
Client/tcp_client.php
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
<?php
|
||||||
|
// 建立client对象并指定服务器类型为TCP
|
||||||
|
$client = new Swoole\Client(SWOOLE_SOCK_TCP);
|
||||||
|
|
||||||
|
// 连接服务器,失败则停止
|
||||||
|
if (!$client->connect('127.0.0.1', 9501)) {
|
||||||
|
echo 'Connection fail!';
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 接收控制台输入的消息
|
||||||
|
fwrite(STDOUT, 'Please send your name: ');
|
||||||
|
$message = trim(fgets(STDIN));
|
||||||
|
|
||||||
|
// 发送消息给TCP服务器
|
||||||
|
if (!$client->send($message)) {
|
||||||
|
echo 'Send fail!';
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 接收TCP服务器返回的数据并显示
|
||||||
|
$resule = $client->recv();
|
||||||
|
echo $resule;
|
23
Client/udp_client.php
Normal file
23
Client/udp_client.php
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
<?php
|
||||||
|
// 建立client对象并指定服务器类型为UDP
|
||||||
|
$client = new Swoole\Client(SWOOLE_SOCK_UDP);
|
||||||
|
|
||||||
|
// 连接服务器,失败则停止
|
||||||
|
if (!$client->connect('127.0.0.1', 9502)) {
|
||||||
|
echo 'Connection fail!';
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 接收控制台输入的消息
|
||||||
|
fwrite(STDOUT, 'Please send your name: ');
|
||||||
|
$message = trim(fgets(STDIN));
|
||||||
|
|
||||||
|
// 发送消息给TCP服务器
|
||||||
|
if (!$client->send($message)) {
|
||||||
|
echo 'Send fail!';
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 接收TCP服务器返回的数据并显示
|
||||||
|
$resule = $client->recv();
|
||||||
|
echo $resule;
|
4
Script/Reload.sh
Normal file
4
Script/Reload.sh
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
pid=`pidof http_server`
|
||||||
|
echo "The http server pid is ${pid}"
|
||||||
|
kill -USR1 $pid
|
||||||
|
echo "Reloading success"
|
186
Server/http.php
Normal file
186
Server/http.php
Normal file
@ -0,0 +1,186 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Http服务端类
|
||||||
|
* User: fantasticbin
|
||||||
|
* Date: 2020/1/15
|
||||||
|
*/
|
||||||
|
class Http
|
||||||
|
{
|
||||||
|
const HOST = '0.0.0.0';
|
||||||
|
const PORT = 8080;
|
||||||
|
protected $read_num = null;
|
||||||
|
|
||||||
|
public $server = null;
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
// 创建Http服务器,监听本机的所有地址并监听 8080 端口
|
||||||
|
$this->server = new Swoole\Http\Server(self::HOST, self::PORT);
|
||||||
|
|
||||||
|
// 设置响应html文件模式以及定义路径
|
||||||
|
$this->server->set([
|
||||||
|
'worker_num' => 2,
|
||||||
|
'enable_static_handler' => true,
|
||||||
|
'document_root' => dirname(dirname(__FILE__)) . '/Template'
|
||||||
|
]);
|
||||||
|
|
||||||
|
// 设置异步AIO线程数量
|
||||||
|
swoole_async_set([
|
||||||
|
'thread_num' => 10,
|
||||||
|
]);
|
||||||
|
|
||||||
|
// 监听启动
|
||||||
|
$this->server->on('Start', [$this, 'onStart']);
|
||||||
|
// 监听请求并输出内容
|
||||||
|
$this->server->on('Request', [$this, 'onRequest']);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 监听启动,修改主进程名称,便于执行平滑重启
|
||||||
|
*/
|
||||||
|
public function onStart()
|
||||||
|
{
|
||||||
|
swoole_set_process_name('http_server');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 监听请求并输出内容
|
||||||
|
* @param $request object 请求对象
|
||||||
|
* @param $response object 响应对象
|
||||||
|
*/
|
||||||
|
public function onRequest($request, $response)
|
||||||
|
{
|
||||||
|
// 优化请求,防止图标再次请求浪费资源
|
||||||
|
if ($request->server['request_uri'] == '/favicon.ico') {
|
||||||
|
$response->status(404);
|
||||||
|
$response->end();
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
|
||||||
|
$get = json_encode($request->get);
|
||||||
|
$html = <<<EOT
|
||||||
|
<h1>Hello Swoole.</h1>
|
||||||
|
<h2>The get request is {$get}</h2>
|
||||||
|
EOT;
|
||||||
|
|
||||||
|
// 记录访问日志
|
||||||
|
$log = [
|
||||||
|
'time' => date('Y-m-d H:i:s'),
|
||||||
|
'get' => $request->get,
|
||||||
|
'post' => $request->post,
|
||||||
|
'header' => $request->header
|
||||||
|
];
|
||||||
|
|
||||||
|
if (!is_dir(__DIR__ . '/log')) {
|
||||||
|
mkdir(__DIR__ . '/log');
|
||||||
|
}
|
||||||
|
|
||||||
|
Swoole\Async::writeFile(__DIR__ . '/log/access.log', json_encode($log) . PHP_EOL, function($filename) {}, FILE_APPEND);
|
||||||
|
|
||||||
|
// 在MySQL数据库中增加访问量
|
||||||
|
$this->addReadNum();
|
||||||
|
|
||||||
|
// 读取redis里的访问量数据,如无则从常量中定义
|
||||||
|
$this->getReadNum();
|
||||||
|
|
||||||
|
// 设置响应头信息
|
||||||
|
$response->header('Content-Type', 'text/html; charset=utf-8');
|
||||||
|
// 设置cookie信息
|
||||||
|
$response->cookie('code', 'Hello world', time() + 1800);
|
||||||
|
// 输出显示内容
|
||||||
|
$response->end($html);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 增加访问量方法
|
||||||
|
*/
|
||||||
|
public function addReadNum()
|
||||||
|
{
|
||||||
|
$update_db = new Swoole\Coroutine\MySQL();
|
||||||
|
$select_db = new Swoole\Coroutine\MySQL();
|
||||||
|
$config = [
|
||||||
|
'host' => '127.0.0.1',
|
||||||
|
'port' => 3306,
|
||||||
|
'user' => 'swoole',
|
||||||
|
'password' => 'Zhang1994)!)(',
|
||||||
|
'database' => 'swoole',
|
||||||
|
'charset' => 'utf8mb4',
|
||||||
|
'timeout' => 2
|
||||||
|
];
|
||||||
|
|
||||||
|
// 进行MySQL数据库连接
|
||||||
|
$conn_res = $select_db->connect($config);
|
||||||
|
|
||||||
|
if ($conn_res === false) {
|
||||||
|
echo 'MySQL connect error!' . PHP_EOL;
|
||||||
|
var_dump($select_db->connect_errno, $select_db->connect_error) . PHP_EOL;
|
||||||
|
throw new Swoole\ExitException('program exit.');
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取到访问量的数据
|
||||||
|
$result = $select_db->query('SELECT read_num FROM test WHERE id = 1');
|
||||||
|
|
||||||
|
if ($result !== false) {
|
||||||
|
if (isset($result[0]['read_num'])) $this->read_num = $result[0]['read_num'];
|
||||||
|
echo 'MySQL execute success, data: ' . PHP_EOL;
|
||||||
|
var_dump($result);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 一定要记得关闭MySQL连接
|
||||||
|
$select_db->close();
|
||||||
|
|
||||||
|
// 进行MySQL数据库连接,这里是并发再开启一个MySQL连接进程
|
||||||
|
$conn_res = $update_db->connect($config);
|
||||||
|
|
||||||
|
if ($conn_res === false) {
|
||||||
|
echo 'MySQL connect error!' . PHP_EOL;
|
||||||
|
var_dump($update_db->connect_errno, $update_db->connect_error) . PHP_EOL;
|
||||||
|
throw new Swoole\ExitException('program exit.');
|
||||||
|
}
|
||||||
|
|
||||||
|
// 执行增加访问量的语句并处理结果
|
||||||
|
$result = $update_db->query('UPDATE test SET read_num = read_num + 1 WHERE id = 1');
|
||||||
|
|
||||||
|
if ($result !== false) {
|
||||||
|
echo 'MySQL execute success, affected rows: ' . $update_db->affected_rows . ', insert id: ' . $update_db->insert_id . PHP_EOL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 一定要记得关闭MySQL连接
|
||||||
|
$update_db->close();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 读取redis里的访问量数据,如无则从常量中定义
|
||||||
|
*/
|
||||||
|
public function getReadNum()
|
||||||
|
{
|
||||||
|
$redis = new Swoole\Coroutine\Redis();
|
||||||
|
$redis->connect('127.0.0.1', 6379);
|
||||||
|
$read_num = $redis->get('read_num');
|
||||||
|
|
||||||
|
if (empty($read_num)) {
|
||||||
|
if (!isset($this->read_num)) {
|
||||||
|
throw new Swoole\ExitException('Read num not exist!');
|
||||||
|
}
|
||||||
|
|
||||||
|
$read_num = $this->read_num;
|
||||||
|
$redis->set('read_num', $read_num);
|
||||||
|
echo 'The data from MySQL.' . PHP_EOL;
|
||||||
|
} else {
|
||||||
|
echo 'The data from Redis.' . PHP_EOL;
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "The redis read num is: {$read_num}";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 启动Http服务器
|
||||||
|
*/
|
||||||
|
public function start()
|
||||||
|
{
|
||||||
|
$this->server->start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$http = new Http();
|
||||||
|
$http->start();
|
58
Server/process.php
Normal file
58
Server/process.php
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
class process
|
||||||
|
{
|
||||||
|
protected $worker = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 执行进程工作
|
||||||
|
*/
|
||||||
|
public function doJob()
|
||||||
|
{
|
||||||
|
// 显示主程序开始时间
|
||||||
|
echo 'process-start-time:' . date('Y-m-d H:i:s') . PHP_EOL;
|
||||||
|
|
||||||
|
// 创建10个子进程来执行耗时逻辑
|
||||||
|
for ($i = 0; $i < 10; $i++) {
|
||||||
|
// 第二个参数$redirect_stdin_and_stdout为重定向子进程的标准输入和输出,设置成true,会把输出结果写入到主进程管道
|
||||||
|
// 第三个参数在第二个参数为false时可设置,作用为子进程创建管道,如果第二个参数设置成true,则这个参数强制为true
|
||||||
|
$process = new Swoole\Process(function (swoole_process $worker) use ($i) {
|
||||||
|
$res = $this->job($i);
|
||||||
|
// 把结果写入管道
|
||||||
|
$worker->write($res);
|
||||||
|
}, true);
|
||||||
|
// 启动进程,返回进程号
|
||||||
|
$pid = $process->start();
|
||||||
|
$this->worker[$pid] = $process;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 显示主程序结束时间
|
||||||
|
echo 'process-end-time:' . date('Y-m-d H:i:s') . PHP_EOL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 显示进程结果
|
||||||
|
*/
|
||||||
|
public function getChannelResponse()
|
||||||
|
{
|
||||||
|
foreach ($this->worker as $worker) {
|
||||||
|
// 通过读取每个管道中的结果来进行显示
|
||||||
|
echo $worker->read();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 进程工作逻辑,模拟耗时1s的任务
|
||||||
|
* @param int $i
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function job(int $i)
|
||||||
|
{
|
||||||
|
sleep(1);
|
||||||
|
return "job {$i} success" . PHP_EOL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$pro = new process();
|
||||||
|
$pro->doJob();
|
||||||
|
$pro->getChannelResponse();
|
50
Server/table.php
Normal file
50
Server/table.php
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
class table
|
||||||
|
{
|
||||||
|
public function doJob()
|
||||||
|
{
|
||||||
|
// 创建内存表,指定大小为1024(2的N次方值)
|
||||||
|
$table = new Swoole\Table(1024);
|
||||||
|
|
||||||
|
// 设置表的列、列类型还有大小
|
||||||
|
$table->column('id', $table::TYPE_INT, 4);
|
||||||
|
$table->column('name', $table::TYPE_STRING, 10);
|
||||||
|
$table->column('age', $table::TYPE_INT, 4);
|
||||||
|
|
||||||
|
// 创建表
|
||||||
|
$table->create();
|
||||||
|
|
||||||
|
// 设置方式1
|
||||||
|
$table['human1'] = [
|
||||||
|
'id' => 1,
|
||||||
|
'name' => 'neo',
|
||||||
|
'age' => 30
|
||||||
|
];
|
||||||
|
|
||||||
|
// 设置方式2
|
||||||
|
$table->set('human2', [
|
||||||
|
'id' => 2,
|
||||||
|
'name' => 'jason',
|
||||||
|
'age' => 28
|
||||||
|
]);
|
||||||
|
|
||||||
|
// 值自增
|
||||||
|
$table->incr('human1', 'age', 1);
|
||||||
|
// 值自减
|
||||||
|
$table->decr('human2', 'age', 2);
|
||||||
|
|
||||||
|
var_dump($table['human1']);
|
||||||
|
var_dump($table->get('human2'));
|
||||||
|
|
||||||
|
echo 'deleted.' . PHP_EOL;
|
||||||
|
|
||||||
|
// 删除值
|
||||||
|
$table->del('human2');
|
||||||
|
|
||||||
|
var_dump($table->exist('human2'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$table = new table();
|
||||||
|
$table->doJob();
|
78
Server/tcp.php
Normal file
78
Server/tcp.php
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* TCP服务端类
|
||||||
|
* User: fantasticbin
|
||||||
|
* Date: 2020/1/15
|
||||||
|
*/
|
||||||
|
class Tcp
|
||||||
|
{
|
||||||
|
const HOST = '127.0.0.1';
|
||||||
|
const PORT = 9502;
|
||||||
|
const WORKER_NUM = 2;
|
||||||
|
const MAX_REQUEST = 10000;
|
||||||
|
|
||||||
|
public $server = null;
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
// 创建TCP服务器,第四个参数默认指定为TCP,监听 127.0.0.1:9501 端口
|
||||||
|
$this->server = new Swoole\Server(self::HOST, self::PORT);
|
||||||
|
|
||||||
|
// 设置TCP服务器参数
|
||||||
|
$this->server->set([
|
||||||
|
'worker_num' => self::WORKER_NUM,
|
||||||
|
'max_request' => self::MAX_REQUEST
|
||||||
|
]);
|
||||||
|
|
||||||
|
// 监听连接进入事件
|
||||||
|
$this->server->on('Connect', [$this, 'onConnect']);
|
||||||
|
// 监听数据接收事件
|
||||||
|
$this->server->on('Receive', [$this, 'onReceive']);
|
||||||
|
// 监听连接关闭事件
|
||||||
|
$this->server->on('Close', [$this, 'onClose']);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 监听连接进入事件
|
||||||
|
* @param $serv Swoole\Server TCP对象
|
||||||
|
* @param $client_id int 客户端连接ID
|
||||||
|
* @param $reactor_id int 线程ID
|
||||||
|
*/
|
||||||
|
public function onConnect($serv, $client_id, $reactor_id)
|
||||||
|
{
|
||||||
|
echo 'Client: Connect.' . PHP_EOL . 'This client id: ' . $client_id . PHP_EOL . 'This reactor id: ' . $reactor_id . PHP_EOL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 监听数据接收事件
|
||||||
|
* @param $serv Swoole\Server TCP对象
|
||||||
|
* @param $client_id int 客户端连接ID
|
||||||
|
* @param $reactor_id int 线程ID
|
||||||
|
* @param $data string 客户端传入的字符串
|
||||||
|
*/
|
||||||
|
public function onReceive($serv, $client_id, $reactor_id, $data)
|
||||||
|
{
|
||||||
|
$serv->send($client_id, 'This client id: ' . $client_id . PHP_EOL . 'This reactor id: ' . $reactor_id . PHP_EOL . 'Hello ' . $data . '!' . PHP_EOL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 监听连接关闭事件
|
||||||
|
* @param $serv Swoole\Server TCP对象
|
||||||
|
* @param $client_id int 客户端连接ID
|
||||||
|
*/
|
||||||
|
public function onClose($serv, $client_id)
|
||||||
|
{
|
||||||
|
echo 'Client: Client ' . $client_id . ' close.' . PHP_EOL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 启动TCP服务器
|
||||||
|
*/
|
||||||
|
public function start()
|
||||||
|
{
|
||||||
|
$this->server->start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$tcp = new Tcp();
|
||||||
|
$tcp->start();
|
53
Server/udp.php
Normal file
53
Server/udp.php
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* UDP服务端类
|
||||||
|
* User: fantasticbin
|
||||||
|
* Date: 2020/1/15
|
||||||
|
*/
|
||||||
|
class Udp
|
||||||
|
{
|
||||||
|
const HOST = '127.0.0.1';
|
||||||
|
const PORT = 9502;
|
||||||
|
const WORKER_NUM = 2;
|
||||||
|
const MAX_REQUEST = 10000;
|
||||||
|
|
||||||
|
public $server = null;
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
// 创建UDP服务器,第四个参数指定为UDP,监听 127.0.0.1:9502 端口
|
||||||
|
$this->server = new Swoole\Server(self::HOST, self::PORT, SWOOLE_PROCESS, SWOOLE_SOCK_UDP);
|
||||||
|
|
||||||
|
// 设置TCP服务器参数
|
||||||
|
$this->server->set([
|
||||||
|
'worker_num' => self::WORKER_NUM,
|
||||||
|
'max_request' => self::MAX_REQUEST
|
||||||
|
]);
|
||||||
|
|
||||||
|
// 监听数据接收事件
|
||||||
|
$this->server->on('Packet', [$this, 'onPacket']);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 监听数据接收事件
|
||||||
|
* @param $serv Swoole\Server UDP对象
|
||||||
|
* @param $data string 客户端传入的字符串
|
||||||
|
* @param $clientInfo array 客户端信息数据
|
||||||
|
*/
|
||||||
|
public function onPacket($serv, $data, $clientInfo)
|
||||||
|
{
|
||||||
|
$serv->sendto($clientInfo['address'], $clientInfo['port'], 'Hello ' . $data . '!' . PHP_EOL);
|
||||||
|
var_dump($clientInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 启动UDP服务器
|
||||||
|
*/
|
||||||
|
public function start()
|
||||||
|
{
|
||||||
|
$this->server->start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$udp = new Udp();
|
||||||
|
$udp->start();
|
128
Server/ws.php
Normal file
128
Server/ws.php
Normal file
@ -0,0 +1,128 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* WebSocket服务端类
|
||||||
|
* User: fantasticbin
|
||||||
|
* Date: 2020/1/15
|
||||||
|
*/
|
||||||
|
class Ws
|
||||||
|
{
|
||||||
|
const HOST = '0.0.0.0';
|
||||||
|
const PORT = 8080;
|
||||||
|
|
||||||
|
public $server = null;
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
// 创建WebSocket服务器,监听本机的所有地址并监听 8080 端口
|
||||||
|
$this->server = new Swoole\WebSocket\Server(self::HOST, self::PORT);
|
||||||
|
|
||||||
|
// 设置响应html文件模式以及定义路径
|
||||||
|
$this->server->set([
|
||||||
|
'worker_num' => 2,
|
||||||
|
'task_worker_num' => 2,
|
||||||
|
'enable_static_handler' => true,
|
||||||
|
'document_root' => dirname(dirname(__FILE__)) . '/Template'
|
||||||
|
]);
|
||||||
|
|
||||||
|
// 监听客户端握手成功
|
||||||
|
$this->server->on('Open', [$this, 'onOpen']);
|
||||||
|
// 监听客户端发送消息
|
||||||
|
$this->server->on('Message', [$this, 'onMessage']);
|
||||||
|
// 监听task任务执行
|
||||||
|
$this->server->on('Task', [$this, 'onTask']);
|
||||||
|
// 监听task任务完成
|
||||||
|
$this->server->on('Finish', [$this, 'onFinish']);
|
||||||
|
// 监听关闭
|
||||||
|
$this->server->on('Close', [$this, 'onClose']);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 监听客户端握手成功
|
||||||
|
* @param $ws Swoole\WebSocket\Server WebSocket对象
|
||||||
|
* @param $request object 请求对象
|
||||||
|
*/
|
||||||
|
public function onOpen($ws, $request)
|
||||||
|
{
|
||||||
|
echo 'A new websocket client is connected, this client id is ' . $request->fd . PHP_EOL;
|
||||||
|
// 每隔10秒执行定时器,向服务端输出信息
|
||||||
|
Swoole\Timer::tick(10000, function ($timer_id) {
|
||||||
|
echo "waiting client send message. this timer id is " . $timer_id . PHP_EOL;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 监听客户端发送消息
|
||||||
|
* @param $ws Swoole\WebSocket\Server WebSocket对象
|
||||||
|
* @param $frame object 客户端数据对象
|
||||||
|
*/
|
||||||
|
public function onMessage($ws, $frame)
|
||||||
|
{
|
||||||
|
echo "Receive from {$frame->fd} : {$frame->data}, opcode : {$frame->opcode}, fin : {$frame->finish}" . PHP_EOL;
|
||||||
|
$data = [
|
||||||
|
'name' => 'neo',
|
||||||
|
'age' => 30
|
||||||
|
];
|
||||||
|
// 投递task任务
|
||||||
|
$ws->task($data);
|
||||||
|
|
||||||
|
// 延时执行定时器,指定5秒后给客户端发送消息
|
||||||
|
Swoole\Timer::after(5000, function () use ($ws, $frame) {
|
||||||
|
echo '5s-timer-after.' . PHP_EOL;
|
||||||
|
$ws->push($frame->fd, 'message_after-push, this time is ' . date('Y-m-d H:i:s'));
|
||||||
|
});
|
||||||
|
|
||||||
|
// 给客户端立即推送消息
|
||||||
|
$ws->push($frame->fd, 'message-push-success, this time is ' . date('Y-m-d H:i:s'));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 监听task任务执行
|
||||||
|
* @param $serv Swoole\WebSocket\Server WebSocket对象
|
||||||
|
* @param $task_id int task任务ID
|
||||||
|
* @param $worker_id int worker进程ID
|
||||||
|
* @param $data array 传递的数据
|
||||||
|
* @return string 执行结果
|
||||||
|
*/
|
||||||
|
public function onTask($serv, $task_id, $worker_id, $data)
|
||||||
|
{
|
||||||
|
// 打印传递过来的数据
|
||||||
|
var_dump($data);
|
||||||
|
// 模拟耗时场景,执行10秒
|
||||||
|
sleep(10);
|
||||||
|
// 告诉worker结果
|
||||||
|
return 'on task finish.';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 监听task任务完成
|
||||||
|
* @param $serv Swoole\WebSocket\Server WebSocket对象
|
||||||
|
* @param $task_id int task任务ID
|
||||||
|
* @param $data string onTask执行完返回的结果
|
||||||
|
*/
|
||||||
|
public function onFinish($serv, $task_id, $data)
|
||||||
|
{
|
||||||
|
echo "Finish task id: {$task_id}" . PHP_EOL;
|
||||||
|
echo "Finish data message: {$data}" . PHP_EOL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 监听关闭
|
||||||
|
* @param $ws Swoole\WebSocket\Server WebSocket对象
|
||||||
|
* @param $client_id int 客户端连接ID
|
||||||
|
*/
|
||||||
|
public function onClose($ws, $client_id)
|
||||||
|
{
|
||||||
|
echo "client-{$client_id} is closed" . PHP_EOL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 启动WebSocket服务器
|
||||||
|
*/
|
||||||
|
public function start()
|
||||||
|
{
|
||||||
|
$this->server->start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$webSocket = new Ws();
|
||||||
|
$webSocket->start();
|
11
Template/index.html
Normal file
11
Template/index.html
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>我的Swoole主页</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>欢迎来到我的Swoole主页</h1>
|
||||||
|
<h3>We just do it!</h3>
|
||||||
|
</body>
|
||||||
|
</html>
|
35
Template/ws.html
Normal file
35
Template/ws.html
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>我的SwooleWebSocket主页</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Hello Swoole WebSocket.</h1>
|
||||||
|
<div id="append"></div>
|
||||||
|
</body>
|
||||||
|
<script>
|
||||||
|
var webSocket = new WebSocket('ws://www.cimeisi.cn:8080');
|
||||||
|
|
||||||
|
// 流程跟服务端相同,监听握手成功,监听服务端发送消息,监听关闭,同时多了一个监听失败
|
||||||
|
webSocket.onopen = function (evt) {
|
||||||
|
// 给服务端发送消息
|
||||||
|
webSocket.send("Hello, my name is neo.");
|
||||||
|
window.document.getElementById("append").insertAdjacentHTML("beforeend", "<h3>connected-swoole-success</h3>");
|
||||||
|
}
|
||||||
|
|
||||||
|
webSocket.onmessage = function (evt) {
|
||||||
|
const html = "<h3>" + evt.data + "</h3>";
|
||||||
|
window.document.getElementById("append").insertAdjacentHTML("beforeend", html);
|
||||||
|
}
|
||||||
|
|
||||||
|
webSocket.onclose = function (evt) {
|
||||||
|
window.document.getElementById("append").insertAdjacentHTML("beforeend", "<h3>closed</h3>");
|
||||||
|
}
|
||||||
|
|
||||||
|
webSocket.onerror = function (evt, e) {
|
||||||
|
const html = "<h3><font color='red'>" + evt.data + "</font></h3>";
|
||||||
|
window.document.getElementById("append").insertAdjacentHTML("beforeend", html);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</html>
|
Loading…
Reference in New Issue
Block a user