$master_pid
$master_pid : integer
主进程PID
Class swoole_server
Author: wudi wudi23@baidu.com Date: 2016/02/17
on(string $event, mixed $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 | |
mixed | $callback |
send(integer $fd, string $data, integer $from_id) : boolean
向客户端发送数据
TCP服务器
swoole-1.6以上版本不需要$from_id
UDP服务器
integer | $fd | |
string | $data | |
integer | $from_id |
sendto(string $ip, integer $port, string $data, boolean $ipv6 = false) : boolean
向任意的客户端IP:PORT发送UDP数据包
示例
//向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 | |
boolean | $ipv6 |
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) : boolean
投递一个异步任务到task_worker池中。此函数会立即返回。worker进程可以继续处理新的请求
此功能用于将慢速的任务异步地去执行,比如一个聊天室服务器,可以用它来进行发送广播。当任务完成时,在task进程中调用$serv->finish("finish")告诉worker进程此任务已完成。当然swoole_server->finish是可选的。
注意事项
mixed | $data | |
integer | $dst_worker_id |
sendMessage(string $message, integer $dst_worker_id = -1) : boolean
此函数可以向任意worker进程或者task进程发送消息。在非主进程和管理进程中可调用。收到消息的进程会触发onPipeMessage事件
!! 使用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 |
finish(string $task_data)
此函数用于在task进程中通知worker进程,投递的任务已完成。此函数可以传递结果数据给worker进程
$serv->finish("response");
使用swoole_server::finish函数必须为Server设置onFinish回调函数。此函数只可用于task进程的onTask回调中
swoole_server::finish是可选的。如果worker进程不关心任务执行的结果,不需要调用此函数 在onTask回调函数中return字符串,等同于调用finish
string | $task_data |
connection_info(integer $fd, integer $from_id = -1) : array
获取连接的信息
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 |
| bool
connection_list(integer $start_fd = -1, integer $pagesize = 100) : 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进程
一台繁忙的后端服务器随时都在处理请求,如果管理员通过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
after(integer $after_time_ms, mixed $callback_function, mixed $param = null)
在指定的时间后执行函数
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 |
addProcess(\Swoole\swoole_process $process)
添加一个用户自定义的工作进程
子进程会托管到Manager进程,如果发生致命错误,manager进程会重新创建一个
\Swoole\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( $interval_ms, mixed $callback, mixed $param = null) : integer
增加tick定时器
可以自定义回调函数。此函数是swoole_timer_tick的别名
worker进程结束运行后,所有定时器都会自动销毁
设置一个间隔时钟定时器,与after定时器不同的是tick定时器会持续触发,直到调用swoole_timer_clear清除。与swoole_timer_add不同的是tick定时器可以存在多个相同间隔时间的定时器。
$interval_ms | ||
mixed | $callback | |
mixed | $param |
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) : boolean
发送文件到TCP客户端连接
endfile函数调用OS提供的sendfile系统调用,由操作系统直接读取文件并写入socket。sendfile只有2次内存拷贝,使用此函数可以降低发送大量文件时操作系统的CPU和内存占用。
$filename 要发送的文件路径,如果文件不存在会返回false 操作成功返回true,失败返回false 此函数与swoole_server->send都是向客户端发送数据,不同的是sendfile的数据来自于指定的文件。
integer | $fd | |
string | $filename | 文件绝对路径 |
bind(integer $fd, integer $uid) : boolean
将连接绑定一个用户定义的ID,可以设置dispatch_mode=5设置已此ID值进行hash固定分配。可以保证某一个UID的连接全部会分配到同一个Worker进程
在默认的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 |