$setting
$setting : array
当前服务器管理进程的Settings
swoole_server::set()函数所设置的参数会保存到$setting属性上。 在回调函数中可以访问运行参数的值。 配置选项 https://wiki.swoole.com/wiki/page/274.html
swoole-1.6.11+可用
Class swoole_http_server
内置 Web 服务器
$setting : array
当前服务器管理进程的Settings
swoole_server::set()函数所设置的参数会保存到$setting属性上。 在回调函数中可以访问运行参数的值。 配置选项 https://wiki.swoole.com/wiki/page/274.html
swoole-1.6.11+可用
$connections : \Swoole\Connection\Iterator
TCP连接迭代器,可以使用foreach遍历服务器当前所有的连接,此属性的功能与swoole_server->connnection_list是一致的,但是更加友好。遍历的元素为单个连接的fd
连接迭代器依赖pcre库,未安装pcre库无法使用此功能
foreach($server->connections as $fd)
{
$server->send($fd, "hello");
}
echo "当前服务器共有 ".count($server->connections). " 个连接\n";
$ports : array<mixed,\Swoole\Server\Port>
on(string $event, callable $callback)
注册事件回调函数,与swoole_server->on相同。swoole_http_server->on的不同之处是:
swoole_http_server->on 额外接受1种新的事件类型onRequest
事件列表
$http_server->on('request', function(swoole_http_request $request, swoole_http_response $response) { $response->end("
在收到一个完整的Http请求后,会回调此函数。回调函数共有2个参数:
!! $response/$request 对象传递给其他函数时,不要加&引用符号
string | $event | |
callable | $callback |
__construct(string $host, integer $port, integer $mode = SWOOLE_PROCESS, integer $sock_type = SWOOLE_SOCK_TCP)
swoole_server 构造函数 https://wiki.swoole.com/wiki/page/14.html
string | $host | ipv4: 本机 127.0.0.1 全部地址 0.0.0.0 ipv6: 本机 ::1 全部地址 :: |
integer | $port | $sock_type 为 UnixSocket Stream/Dgram,此参数将被忽略 监听 1024 以下的端口需要 root 权限 0 随机可用端口 |
integer | $mode | swoole_server的3种运行模式介绍 https://wiki.swoole.com/wiki/page/353.html |
integer | $sock_type | swoole 支持的 Socket 类型 https://wiki.swoole.com/wiki/page/16.html $sock_type | SWOOLE_SSL 可以启用 SSL 隧道加密 |
send(integer $fd, string $data, integer $from_id) : boolean
向客户端发送数据 https://wiki.swoole.com/wiki/page/p-server/send.html
TCP服务器
swoole-1.6以上版本不需要$from_id
UDP服务器
integer | $fd | |
string | $data | |
integer | $from_id |
sendto(string $ip, integer $port, string $data, integer $server_socket = -1) : boolean
向任意的客户端IP:PORT发送UDP数据包 https://wiki.swoole.com/wiki/page/381.html
示例
//向IP地址为220.181.57.216主机的9502端口发送一个hello world字符串。
$server->sendto('220.181.57.216', 9502, "hello world");
//向IPv6服务器发送UDP数据包
$server->sendto('2600:3c00::f03c:91ff:fe73:e98f', 9501, "hello world", true);
server必须监听了UDP的端口,才可以使用swoole_server->sendto server必须监听了UDP6的端口,才可以使用swoole_server->sendto向IPv6地址发送数据
string | $ip | |
integer | $port | |
string | $data | |
integer | $server_socket | 服务器可能会同时监听多个UDP端口,此参数可以指定使用哪个端口发送数据包 |
close(integer $fd, boolean $reset = false) : boolean
关闭客户端连接 https://wiki.swoole.com/wiki/page/p-server/close.html
!! swoole-1.6以上版本不需要$from_id swoole-1.5.8以下的版本,务必要传入正确的$from_id,否则可能会导致连接泄露
操作成功返回true,失败返回false.
Server主动close连接,也一样会触发onClose事件。不要在close之后写清理逻辑。应当放置到onClose回调中处理。
integer | $fd | |
boolean | $reset | true 会强制关闭连接,丢弃发送队列中的数据 |
taskwait(mixed $task_data, float $timeout = 0.5, integer $dst_worker_id = -1) : string
taskwait与task方法作用相同,用于投递一个异步的任务到task进程池去执行。 与task不同的是taskwait是阻塞等待的,直到任务完成或者超时返回
$result为任务执行的结果,由$serv->finish函数发出。如果此任务超时,这里会返回false。
taskwait是阻塞接口,如果你的Server是全异步的请使用swoole_server::task和swoole_server::finish,不要使用taskwait 第3个参数可以制定要给投递给哪个task进程,传入ID即可,范围是0 - serv->task_worker_num $dst_worker_id在1.6.11+后可用,默认为随机投递 taskwait方法不能在task进程中调用
mixed | $task_data | |
float | $timeout | |
integer | $dst_worker_id |
task(mixed $data, integer $dst_worker_id = -1, callable $callback = null) : integer|false
投递一个异步任务到task_worker池中。此函数会立即返回。worker进程可以继续处理新的请求
此功能用于将慢速的任务异步地去执行,比如一个聊天室服务器,可以用它来进行发送广播。当任务完成时,在task进程中调用$serv->finish("finish")告诉worker进程此任务已完成。当然swoole_server->finish是可选的。
注意事项
mixed | $data | |
integer | $dst_worker_id | |
callable | $callback | onFinish函数,如果任务设置了回调函数,Task返回结果时会直接执行指定的回调函数,不再执行Server的onFinish回调 |
调用成功返回任务编号,失败(比如没启用task进程)返回false
sendMessage(string $message, integer $dst_worker_id = -1) : boolean
此函数可以向任意worker进程或者task进程发送消息。在非主进程和管理进程中可调用。收到消息的进程会触发onPipeMessage事件 https://wiki.swoole.com/wiki/page/363.html
!! 使用sendMessage必须注册onPipeMessage事件回调函数
$serv = new swoole_server("0.0.0.0", 9501);
$serv->set(array(
'worker_num' => 2,
'task_worker_num' => 2,
));
$serv->on('pipeMessage', function($serv, $src_worker_id, $data) {
echo "#{$serv->worker_id} message from #$src_worker_id: $data\n";
});
$serv->on('task', function ($serv, $task_id, $from_id, $data){
var_dump($task_id, $from_id, $data);
});
$serv->on('finish', function ($serv, $fd, $from_id){
});
$serv->on('receive', function (swoole_server $serv, $fd, $from_id, $data) {
if (trim($data) == 'task')
{
$serv->task("async task coming");
}
else
{
$worker_id = 1 - $serv->worker_id;
$serv->sendMessage("hello task process", $worker_id);
}
});
$serv->start();
string | $message | |
integer | $dst_worker_id |
connection_info(integer $fd, integer $from_id = -1, boolean $ignore_close = false) : array
获取连接的信息 https://wiki.swoole.com/wiki/page/p-connection_info.html
connection_info可用于UDP服务器,但需要传入from_id参数
array (
'from_id' => 0,
'from_fd' => 12,
'connect_time' => 1392895129,
'last_time' => 1392895137,
'from_port' => 9501,
'remote_port' => 48918,
'remote_ip' => '127.0.0.1',
)
integer | $fd | |
integer | $from_id | |
boolean | $ignore_close |
| bool
connection_list(integer $start_fd = -1, integer $pagesize = 10) : array
用来遍历当前Server所有的客户端连接,connection_list方法是基于共享内存的,不存在IOWait,遍历的速度很快。另外connection_list会返回所有TCP连接,而不仅仅是当前worker进程的TCP连接
示例:
$start_fd = 0;
while(true)
{
$conn_list = $serv->connection_list($start_fd, 10);
if($conn_list===false or count($conn_list) === 0)
{
echo "finish\n";
break;
}
$start_fd = end($conn_list);
var_dump($conn_list);
foreach($conn_list as $fd)
{
$serv->send($fd, "broadcast");
}
}
integer | $start_fd | |
integer | $pagesize |
| bool
reload() : boolean
重启所有worker进程 https://wiki.swoole.com/wiki/page/p-server/reload.html
一台繁忙的后端服务器随时都在处理请求,如果管理员通过kill进程方式来终止/重启服务器程序,可能导致刚好代码执行到一半终止。 这种情况下会产生数据的不一致。如交易系统中,支付逻辑的下一段是发货,假设在支付逻辑之后进程被终止了。会导致用户支付了货币,但并没有发货,后果非常严重。
Swoole提供了柔性终止/重启的机制,管理员只需要向SwooleServer发送特定的信号,Server的worker进程可以安全的结束。
swoole的reload有保护机制,当一次reload正在进行时,收到新的重启信号会丢弃
kill -USR1 主进程PID
仅重启task_worker的功能。只需向服务器发送SIGUSR2即可。
kill -USR2 主进程PID 平滑重启只对onWorkerStart或onReceive等在Worker进程中include/require的PHP文件有效,Server启动前就已经include/require的PHP文件,不能通过平滑重启重新加载 对于Server的配置即$serv->set()中传入的参数设置,必须关闭/重启整个Server才可以重新加载 Server可以监听一个内网端口,然后可以接收远程的控制命令,去重启所有worker
addListener(string $host, integer $port, integer $type = SWOOLE_SOCK_TCP) : \swoole_server_port|boolean
Swoole提供了swoole_server::addListener来增加监听的端口。业务代码中可以通过调用swoole_server::connection_info来获取某个连接来自于哪个端口
可以混合使用UDP/TCP,同时监听内网和外网端口。 示例:
$serv->addlistener("127.0.0.1", 9502, SWOOLE_SOCK_TCP);
$serv->addlistener("192.168.1.100", 9503, SWOOLE_SOCK_TCP);
$serv->addlistener("0.0.0.0", 9504, SWOOLE_SOCK_UDP);
$serv->addlistener("/var/run/myserv.sock", 0, SWOOLE_UNIX_STREAM);
string | $host | |
integer | $port | |
integer | $type |
如果成功,1.8.0以上版本返回swoole_server_port,以下返回TRUE;如果失败返回FALSE
stats() : array
得到当前Server的活动TCP连接数,启动时间,accpet/close的总次数等信息 https://wiki.swoole.com/wiki/page/288.html
array ( 'start_time' => 1409831644, 'connection_num' => 1, 'accept_count' => 1, 'close_count' => 0, );
after(integer $after_time_ms, mixed $callback_function, mixed $param = null) : integer
在指定的时间后执行函数 https://wiki.swoole.com/wiki/page/320.html
swoole_server::after函数是一个一次性定时器,执行完成后就会销毁。
$after_time_ms 指定时间,单位为毫秒 $callback_function 时间到期后所执行的函数,必须是可以调用的。callback函数不接受任何参数 $after_time_ms 最大不得超过 86400000 此方法是swoole_timer_after函数的别名
integer | $after_time_ms | |
mixed | $callback_function | |
mixed | $param |
$timerId
addProcess(\Swoole\swoole_process|\Swoole\Process $process)
添加一个用户自定义的工作进程 https://wiki.swoole.com/wiki/page/390.html
子进程会托管到Manager进程,如果发生致命错误,manager进程会重新创建一个
\Swoole\swoole_process|\Swoole\Process | $process |
addtimer(integer $interval) : boolean
设置定时器。1.6.12版本前此函数不能用在消息队列模式下,1.6.12后消息队列IPC模式也可以使用定时器
第二个参数是定时器的间隔时间,单位为毫秒。swoole定时器的最小颗粒是1毫秒。支持多个定时器。此函数可以用于worker进程中。
即使在代码中多次添加一个定时器,也只会有1个生效
增加定时器后需要为Server设置onTimer回调函数,否则Server将无法启动。多个定时器都会回调此函数。在这个函数内需要自行switch,根据interval的值来判断是来自于哪个定时器。
// 面向对象风格 $serv->addtimer(1000); //1s $serv->addtimer(20); //20ms
integer | $interval |
tick(integer $interval_ms, mixed $callback, mixed $param = null) : integer
增加tick定时器 https://wiki.swoole.com/wiki/page/414.html
可以自定义回调函数。此函数是 swoole_timer_tick 的别名
worker进程结束运行后,所有定时器都会自动销毁
设置一个间隔时钟定时器,与after定时器不同的是tick定时器会持续触发,直到调用swoole_timer_clear清除。与swoole_timer_add不同的是tick定时器可以存在多个相同间隔时间的定时器。
integer | $interval_ms | |
mixed | $callback | |
mixed | $param |
$timerId
handler(string $event_name, mixed $event_callback_function) : boolean
设置Server的事件回调函数
第一个参数是swoole的资源对象 第二个参数是回调的名称, 大小写不敏感,具体内容参考回调函数列表 第三个函数是回调的PHP函数,可以是字符串,数组,匿名函数。比如 handler/on/set 方法只能在swoole_server::start前调用
$serv->handler('onStart', 'my_onStart');
$serv->handler('onStart', array($this, 'my_onStart'));
$serv->handler('onStart', 'myClass::onStart');
string | $event_name | |
mixed | $event_callback_function |
sendfile(integer $fd, string $filename, integer $offset, integer $length) : boolean
发送文件到TCP客户端连接 https://wiki.swoole.com/wiki/page/187.html
sendfile函数调用OS提供的sendfile系统调用,由操作系统直接读取文件并写入socket。sendfile只有2次内存拷贝,使用此函数可以降低发送大量文件时操作系统的CPU和内存占用。
$filename 要发送的文件路径,如果文件不存在会返回false 操作成功返回true,失败返回false 此函数与swoole_server->send都是向客户端发送数据,不同的是sendfile的数据来自于指定的文件。
integer | $fd | |
string | $filename | 文件绝对路径 |
integer | $offset | |
integer | $length |
bind(integer $fd, integer $uid) : boolean
将连接绑定一个用户定义的ID,可以设置dispatch_mode=5设置已此ID值进行hash固定分配。可以保证某一个UID的连接全部会分配到同一个Worker进程 https://wiki.swoole.com/wiki/page/369.html
在默认的dispatch_mode=2设置下,server会按照socket fd来分配连接数据到不同的worker。 因为fd是不稳定的,一个客户端断开后重新连接,fd会发生改变。这样这个客户端的数据就会被分配到别的Worker。 使用bind之后就可以按照用户定义的ID进行分配。即使断线重连,相同uid的TCP连接数据会被分配相同的Worker进程。
同一个连接只能被bind一次,如果已经绑定了uid,再次调用bind会返回false 可以使用$serv->connection_info($fd) 查看连接所绑定uid的值
integer | $fd | |
integer | $uid |