• 欢迎来到本博客,希望可以y一起学习与分享

swoole快速入门

PHP benz 3年前 (2018-05-26) 393次浏览 0个评论 扫描二维码
文章目录[隐藏]

一、swoole安装

先安装 php

这里,我选择percl安装

 

PECL安装:

1>pecl install swoole    //如果以上步骤一切正常的话,即表示swoole已经成功的安装了。

2>extension=swoole.so            //成功之后,我们打开php.ini(不知道配置文件在哪的回去再把CLI看一遍),把swoole.so加入到文件最后

3>$ php -m | grep swoole    //查看swoole是否被正确的安装

 

如如果想要升级swoole:pecl upgrade swoole

 

二、TCP服务器

1. 创建TCP服务

new swoole_server(string $host, int $port, int $mode = SWOOLE_PROCESS, int $sock_type = SWOOLE_SOCK_TCP);

$host : 监听的IP地址

  • 127.0.0.1 本地IP
  • 192.168.50.133 监听对应外网IP
  • 0.0.0.0 监听所有IP

$port : 端口号 1024 以下都被分配好

$mode : SWOOLE_PROCESS (默认)多进程的方式

$sock_type :

  • SWOOLE_SOCK_TCP (默认) 创建TCP socket
  • SWOOLE_SOCK_TCP6 创建TCP IPV6 socket
  • SWOOLE_SOCK_UDP 创建UDP socket
  • SWOOLE_SOCK_UDP6 创建UDP IPV6 socket

2. 监听TCP服务

bool swoole_server->on(string $event, mixed $callback);

$event :

  • connect : 当建立连接的时候
      参数 :

    • $serv 服务器句柄
    • $fd 客户端信息
  • receive : 当接收数据的时候
    参数 :

    • $serv 服务器句柄
    • $fd 客户端信息
    • $from_id 客户端ID
    • $data 接收到的数据
  • close : 关闭连接
    参数 :

    • $serv 服务器句柄
    • $fd 客户端信息

$callback :自定义回调函数 (建议使用闭包)

3. 开启TCP服务

bool swoole_server->start();

4. 发送消息

bool swoole_server->send(int $fd, string $data,int $reactorThreadId = 0);

5.设置参数

function swoole_server->set(array $setting);

示例

UDP服务器

1. 创建UDP服务器

//关键点:$sock_type = SWOOLE_SOCK_UDP
new swoole_server($host, $port, $mode, $sock_type);

2. 接收数据

function onPacket(swoole_server $server, string $data, array $client_info);
$server : swoole句柄
$data : 接收到的数据
$client_info : 客户端信息

3. 发送数据

bool swoole_server->sendto(string $ip, int $port, string $data, int $server_socket = -1);
$ip : 目标IP
$port : 目标端口
$data : 发送的数据
$server_socket : socket标记号

示例

WEB服务器

1. 创建WEB服务

new swoole_http_server(string $host, int $port);
swoole_http_server 继承自 swoole_server
$host : 监听IP地址
$port : 监听端口

2. 监听接收事件

on('request',function($request, $response){});

3. 设置返回头信息

$response->header("Content-Type", "text/html;charset=utf-8");

4. 发送信息

$response->end("Hello world");

5. 启动服务

$serv->start();

示例

WebSocket服务器

1. 创建WebSocket服务

$ws = new swoole_websocket_server(string $host, int $port);
swoole_websocket_server 继承自 swoole_http_server

$host : 监听IP地址
$port : 监听端口

2. 监听建立连接事件

$ws->on('open',function($ws, $request){});

3. 监听接收信息事件

$ws->on('message',function($ws, $request){});

4. 监听关闭连接事件

$ws->on('close',function($ws, $request){});

5. 推送数据

$ws->push($request->fd, "get it message".PHP_EOL);

6. 启动服务

$ws->start();

示例

客户端

定时器

定时器

int swoole_timer_tick(int $ms, callable $callback, mixed $user_param);

  • $ms 指定时间,单位为毫秒
  • $callback_function 时间到期后所执行的函数,必须是可以调用的。
  • $user_param 用户参数, 该参数会被传递到$callback_function中. 如果有多个参数可以使用数组形式. 也可以使用匿名函数的use语法传递参数到回调函数中
  • 定时器仅在当前进程空间内有效
  • 定时器是纯异步实现的,不能与阻塞IO的函数一起使用,否则定时器的执行时间会发生错乱

单次定时器

int swoole_timer_after(int $after_time_ms, mixed $callback_function, mixed $user_param);

  • $after_time_ms 指定时间,单位为毫秒,最大不得超过 86400000
  • $callback_function 时间到期后所执行的函数,必须是可以调用的。
  • $user_param 用户参数, 该参数会被传递到$callback_function中. 如果有多个参数可以使用数组形式. 也可以使用匿名函数的use语法传递参数到回调函数中

清除定时器

bool swoole_timer_clear(int $timer_id)

  • $timer_id,定时器ID,调用swoole_timer_tickswoole_timer_after后会返回一个整数的ID
  • swoole_timer_clear不能用于清除其他进程的定时器,只作用于当前进程

示例

异步TCP服务器

task()函数 投递异步任务
on(‘事件’,function(){})处理函数 执行异步函数
finish()函数 任务处理完后返回信息

示例

TCP客户端

PHP Warning: Swoole\Client::recv(): recv() failed.Error: Resource temporarily unavailable [11] in
服务器必须在设定时间内发回数据,否则如上报错

异步TCP服务器

new swoole_client();
SWOOLE_SOCK_TCP TCP协议
SWOOLE_SOCK_ASYNC 异步支持(默认同步)

示例

进程创建

new swoole_process(callable $function, $redirect_stdin_stdout = false, $create_pipe = true);

  • $function,子进程创建成功后要执行的函数,底层会自动将函数保存到对象的callback属性上。如果希望更改执行的函数,可赋值新的函数到对象的callback属性
  • $redirect_stdin_stdout,重定向子进程的标准输入和输出。启用此选项后,在子进程内输出内容将不是打印屏幕,而是写入到主进程管道。读取键盘输入将变为从管道中读取数据。默认为阻塞读取。
  • $create_pipe,是否创建管道,启用$redirect_stdin_stdout后,此选项将忽略用户参数,强制为true。如果子进程内没有进程间通信,可以设置为 false

示例

进程事件

bool swoole_event_add(mixed $sock, mixed $read_callback, mixed $write_callback = null, int $flags = null);
参数
参数1可以为以下四种类型:

  • int,就是文件描述符,包括swoole_client->$sockswoole_process->$pipe或者其他fd
  • stream资源,就是stream_socket_client/fsockopen创建的资源
  • sockets资源,就是sockets扩展中socket_create创建的资源,需要在编译时加入 ./configure --enable-sockets
  • objectswoole_processswoole_client,底层自动转换为管道或客户端连接的socket

参数2为可读回调函数,参数3为可写事件回调,可以是字符串函数名、对象+方法、类静态方法或匿名函数,当此socket可读时回调指定的函数。

参数4为事件类型的掩码,可选择关闭/开启可读可写事件,如SWOOLE_EVENT_READSWOOLE_EVENT_WRITE,或者SWOOLE_EVENT_READ | SWOOLE_EVENT_WRITE

在 Server 程序中使用时,必须在 Worker 进程启动后使用。在 Server::start 之前不得调用任何异步 IO 接口

返回值

  • 添加事件监听成功成功返回true
  • 添加失败返回false,请使用swoole_last_error获取错误码
  • 已添加过的socket不能重复添加,可以使用swoole_event_set修改socket对应的回调函数和事件类型
使用swoole_event_addsocket加入到事件监听后,底层会自动将该socket设置为非阻塞模式

示例

进程的队列通信

向进程外 取数据
string swoole_process->pop(int $maxsize = 8192);
向进程内 写数据
bool swoole_process->push(string $data);
防止僵尸进程
array swoole_process::wait(bool $blocking = true);

示例

进程信号触发器

bool swoole_process::signal(int $signo, callable $callback);

  • 此方法基于signalfdeventloop是异步IO,不能用于同步程序中
  • 同步阻塞的程序可以使用pcntl扩展提供的pcntl_signal
  • $callback如果为null,表示移除信号监听
  • 如果已设置了此信号的回调函数,重新设置时会覆盖历史设置

function swoole_process::alarm(int $interval_usec, int $type = ITIMER_REAL) : bool

  • $interval_usec 定时器间隔时间,单位为微秒。如果为负数表示清除定时器
  • $type 定时器类型,0 表示为真实时间,触发SIGALAM信号,1 表示用户态CPU时间,触发SIGVTALAM信号,2 表示用户态+内核态时间,触发SIGPROF信号
  • 设置成功返回true,失败返回false,可以使用swoole_errno得到错误码

示例

锁机制

$lock = new swoole_lock(int $type, [string $lockfile])

  • $type为锁的类型
    swoole_lock类支持5种锁的类型:

    1. 文件锁 SWOOLE_FILELOCK
    2. 读写锁 SWOOLE_RWLOCK
    3. 信号量 SWOOLE_SEM
    4. 互斥锁 SWOOLE_MUTEX
    5. 自旋锁 SWOOLE_SPINLOCK

    注意:请勿在onReceive等回调函数中创建锁,否则底层的GlobalMemory内存会持续增长,造成内存泄漏。

  • $lockfile,当类型为SWOOLE_FILELOCK时必须传入,指定文件锁的路径

注意每一种类型的锁支持的方法都不一样。如读写锁、文件锁可以支持$lock->lock_read()。
另外除文件锁外,其他类型的锁必须在父进程内创建,这样fork出的子进程之间才可以互相争抢锁。

上锁
$lock->lock();
解锁
$lock->unlock();

示例

DNS查询

将域名解析为IP地址。调用此函数是非阻塞的,调用会立即返回。将向下执行后面的代码。

  • 当DNS查询完成时,自动回调指定的callback函数。
  • 当DNS查询失败时,比如域名不存在,回调函数传入的$ip为空

关闭DNS缓存

DNS随机

指定DNS服务器

异步文件读取

异步读取文件内容,函数原型
//函数风格
swoole_async_readfile(string $filename, mixed $callback);
//命名空间风格
Swoole\Async::readFile(string $filename, mixed $callback);

  • 文件不存在会返回false
  • 成功打开文件立即返回true
  • 数据读取完毕后会回调指定的callback函数。

示例

swoole_async_readfile会将文件内容全部复制到内存,所以不能用于大文件的读取
如果要读取超大文件,请使用swoole_async_read函数
swoole_async_readfile最大可读取4M的文件,受限于SW_AIO_MAX_FILESIZE

异步写文件

异步写文件,调用此函数后会立即返回。当写入完成时会自动回调指定的callback函数。
swoole_async_writefile(string $filename, string $fileContent, callable $callback = null, int $flags = 0)

  • 参数1为文件的名称,必须有可写权限,文件不存在会自动创建。打开文件失败会立即返回false
  • 参数2为要写入到文件的内容,最大可写入4M
  • 参数3为写入成功后的回调函数,可选
  • 参数4为写入的选项,可以使用FILE_APPEND表示追加到文件末尾
  • 如果文件已存在,底层会覆盖旧的文件内容

示例

异步事件

bool swoole_event_add(mixed $sock, mixed $read_callback, mixed $write_callback = null,
int $flags = null);

参数

参数1可以为以下四种类型:

  • int,就是文件描述符,包括swoole_client->$sockswoole_process->$pipe或者其他fd
  • stream资源,就是stream_socket_client/fsockopen创建的资源
  • sockets资源,就是sockets扩展中socket_create创建的资源,需要在编译时加入 ./configure --enable-sockets
  • objectswoole_processswoole_client,底层自动转换为管道或客户端连接的socket

参数2为可读回调函数,参数3为可写事件回调,可以是字符串函数名、对象+方法、类静态方法或匿名函数,当此socket可读时回调指定的函数。

参数4为事件类型的掩码,可选择关闭/开启可读可写事件,如SWOOLE_EVENT_READSWOOLE_EVENT_WRITE,或者SWOOLE_EVENT_READ | SWOOLE_EVENT_WRITE
返回值

  • 添加事件监听成功成功返回true
  • 添加失败返回false,请使用swoole_last_error获取错误码
  • 已添加过的socket不能重复添加,可以使用swoole_event_set修改socket对应的回调函数和事件类型
使用swoole_event_addsocket加入到事件监听后,底层会自动将该socket设置为非阻塞模式

示例

异步MySQL

实例异步MySQL对象
$db = new swoole_mysql;
异步连接到MySQL服务器
function swoole_mysql->connect(array $serverConfig, callable $callback);

  • $serverConfig为MySQL服务器的配置,必须为关联索引数组
  • $callback连接完成后回调此函数

执行SQL查询
function swoole_mysql->query($sql, callable $callback);

  • $sql为要执行的SQL语句
  • $callback执行成功后会回调此函数
  • 每个MySQLi连接只能同时执行一条SQL,必须等待返回结果后才能执行下一条SQL

示例

简陋websocket聊天室

服务端代码

客户端代码


文章 swoole快速入门 转载需要注明出处
喜欢 (0)

您必须 登录 才能发表评论!