功能描述:建立一个swoole_server资源对象
函数原型:php
// 类成员函数
public function swoole_server::__construct(string $host, int $port, int $mode = SWOOLE_PROCESS, int $sock_type = SWOOLE_SOCK_TCP); // 公共函数 function swoole_server_create(string $host, int $port, int $mode = SWOOLE_PROCESS, int $sock_type = SWOOLE_SOCK_TCP);
返回:一个swoole_server对象
参数说明:html
参数 | 说明 |
---|---|
string host | 监听的IP地址 |
int port | 监听的端口号 |
int mode | 运行模式 |
int sock_type | 指定的socket类型 |
说明: host、port、socket_type的详细说明见swoole_server::addlistener。
mode指定了swoole_server的运行模式,共有以下三种:mysql
mode | 类型 | 说明 |
---|---|---|
SWOOLE_BASE | Base模式 | 传统的异步非阻塞Server。在Reactor内直接回调PHP的函数。若是回调函数中有阻塞操做会致使Server退化为同步模式。worker_num参数对与BASE模式仍然有效,swoole会启动多个Reactor进程 |
SWOOLE_THREAD | 线程模式(已废弃) | 多线程Worker模式,Reactor线程来处理网络事件轮询,读取数据。获得的请求交给Worker线程去处理。多线程模式比进程模式轻量一些,并且线程之间能够共享堆栈和资源。 访问共享内存时会有同步问题,须要使用Swoole提供的锁机制来保护数据。 |
SWOOLE_PROCESS | 进程模式(默认) | Swoole提供了完善的进程管理、内存保护机制。 在业务逻辑很是复杂的状况下,也能够长期稳定运行,适合业务逻辑很是复杂的场景。 |
样例:git
$serv = new swoole_server("127.0.0.1" , 8888 , SWOOLE_PROCESS , SWOOLE_SOCK_TCP);
功能描述:设置swoole_server运行时的各项参数
函数原型:github
// 类成员函数
public function swoole_server::set(array $setting); // 公共函数 function swoole_server_set(swoole_server $server, array $setting);
返回:无
参数说明:sql
参数 | 说明 |
---|---|
array setting | 配置选项数组,采用key-value形式 |
说明:
该函数必须在swoole_server::start函数调用前调用。
所有swoole_server的配置参数点此查看
样例:数组
$serv->set( array( 'worker_num' => 8, 'max_request' => 10000, 'max_conn' => 100000, 'dispatch_mode' => 2, 'debug_mode'=> 1, 'daemonize' => false, ) );
功能描述:绑定swoole_server的相关回调函数
函数原型:服务器
// 类成员函数
public function bool swoole_server->on(string $event, mixed $callback);
返回:设置成功返回true,不然返回false
参数说明:swoole
参数 | 说明 |
---|---|
string event | 回调的名称(大小写不敏感) |
mixed callback | 回调的PHP函数,能够是函数名的字符串,类静态方法,对象方法数组,匿名函数 |
说明:
该函数必须在swoole_server::start函数调用前调用。
此方法与swoole_server::handler功能相同,做用是与swoole_client风格保持一致。
swoole_server::on中事件名称字符串不要加on。
所有的回调函数列表点此查看
样例:网络
$serv->on('connect', function ($serv, $fd){ echo "Client:Connect.\n"; }); $serv->on('receive', array( $myclass, 'onReceive' ) ); // onReceive是myclass的成员函数
功能描述:给swoole_server增长一个监听的地址和端口
函数原型:
// 类成员函数
public function swoole_server::addlistener(string $host, int $port, $type = SWOOLE_SOCK_TCP); // 公共函数 function swoole_server_addlisten(swoole_server $serv, string $host, int $port, $type = SWOOLE_SOCK_TCP);
返回:无
参数说明:
参数 | 说明 |
---|---|
string host | 监听的IP地址 |
int port | 监听的端口号 |
int sock_type | 指定的socket类型 |
说明: swoole支持以下socket类型:
sock_type | 说明 |
---|---|
SWOOLE_TCP/SWOOLE_SOCK_TCP | TCP IPv4 Socket |
SWOOLE_TCP6/SWOOLE_SOCK_TCP6 | TCP IPv6 Socket |
SWOOLE_UDP/SWOOLE_SOCK_UDP | UDP IPv4 Socket |
SWOOLE_UDP6/SWOOLE_SOCK_UDP6 | UDP IPv4 Socket |
SWOOLE_UNIX_DGRAM | Unix UDP Socket |
SWOOLE_UNIX_STREAM | Unix TCP Socket |
Unix Socket仅在1.7.1+后可用,此模式下host参数必须填写可访问的文件路径,port参数忽略
Unix Socket模式下,客户端fd将再也不是数字,而是一个文件路径的字符串
SWOOLE_TCP等是1.7.0+后提供的简写方式,与1.7.0前的SWOOLE_SOCK_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); swoole_server_addlisten($serv, "127.0.0.1", 9502, SWOOLE_SOCK_TCP);
功能描述:设置Server的事件回调函数
函数原型:
// 类成员函数
public function swoole_server::handler(string $event_name, mixed $event_callback_function); // 公共函数 function swoole_server_handler(swoole_server $serv, string $event_name, mixed $event_callback_function);
返回:设置成功返回true,不然返回false
参数说明:
参数 | 说明 |
---|---|
string event_name | 回调的名称(大小写不敏感) |
mixed event_callback_function | 回调的PHP函数,能够是函数名的字符串,类静态方法,对象方法数组,匿名函数 |
说明: 该函数必须在swoole_server::start函数调用前调用。
事件名称字符串要加on。
所有的回调函数列表点此查看
onConnect/onClose/onReceive这3个回调函数必须设置。其余事件回调函数可选
若是设定了timer定时器,onTimer事件回调函数也必须设置
若是启用了task_worker,onTask/onFinish事件回调函数必须设置
样例:
$serv->handler('onStart', 'my_onStart'); $serv->handler('onStart', array($this, 'my_onStart')); $serv->handler('onStart', 'myClass::onStart');
功能描述:启动server,开始监听全部TCP/UDP端口
函数原型:
// 类成员函数
public function swoole_server::start()
返回:启动成功返回true,不然返回false
参数说明:无
说明:
启动成功后会建立worker_num+2个进程:Master进程+Manager进程+worker_num 个 Worker进程。
另外。启用task_worker会增长task_worker_num个Worker进程
三种进程的说明以下:
进程类型 | 说明 |
---|---|
Master进程 | 主进程内有多个Reactor线程,基于epoll/kqueue进行网络事件轮询。收到数据后转发到Worker进程去处理 |
Manager进程 | 对全部Worker进程进行管理,Worker进程生命周期结束或者发生异常时自动回收,并建立新的Worker进程 |
Worker进程 | 对收到的数据进行处理,包括协议解析和响应请求 |
样例:
$serv->start();
功能描述:重启全部worker进程。
函数原型:
// 类成员函数
public function swoole_server::reload()
返回:调用成功返回true,不然返回false
参数说明:无
说明:
调用后会向Manager发送一个SIGUSR1信号,平滑重启所有的Worker进程(所谓平滑重启,是指重启动做会在Worker处理完正在执行的任务后发生,并不会中断正在运行的任务。)
小技巧:在onWorkerStart回调中require相应的php文件,当这些文件被修改后,只须要经过SIGUSR1信号便可实现服务器热更新。
1.7.7版本增长了仅重启task_worker的功能。只需向服务器发送SIGUSR2便可
样例:
$serv->reload();
功能描述:关闭服务器。
函数原型:
// 类成员函数
public function swoole_server::shutdown()
返回:调用成功返回true,不然返回false
参数说明:无
说明:
此函数能够用在worker进程内,平滑关闭所有的Worker进程。
也可向Master进程发送SIGTERM信号关闭服务器。
样例:
$serv->shutdown();
功能描述:设置一个固定间隔的定时器
函数原型:
// 类成员函数
public function swoole_server::addtimer(int $interval); // 公共函数 function swoole_server_addtimer(swoole_server $serv, int $interval);
返回:设置成功返回true,不然返回false
参数说明:
参数 | 说明 |
---|---|
int interval | 定时器的时间间隔,单位为毫秒ms |
说明:
swoole定时器的最小颗粒是1毫秒,支持多个不一样间隔的定时器。
注意不能存在2个相同间隔时间的定时器。
使用多个定时器时,其余定时器必须为最小定时器时间间隔的整数倍。
该函数只能在onWorkerStart/onConnect/onReceive/onClose回调函数中调用。
增长定时器后须要为Server设置onTimer回调函数,不然Server将没法启动。
样例:
$serv->addtimer(1000); //1s swoole_server_addtimer($serv,20); //20ms
功能描述:删除指定的定时器。
函数原型:
// 类成员函数
public function swoole_server::deltimer(int $interval);
返回:无
参数说明:
参数 | 说明 |
---|---|
int interval | 定时器的时间间隔,单位为毫秒ms |
说明:
删除间隔为interval的定时器
样例:
$serv->deltimer(1000);
功能描述:在指定的时间后执行函数
函数原型:
// 类成员函数
public function swoole_server::after(int $after_time_ms, mixed $callback_function, mixed params); // 公共函数 function swoole_timer_after(swoole_server $serv, int $after_time_ms, mixed $callback_function, mixed params);
返回:无
参数说明:
参数 | 说明 |
---|---|
int after_time_ms | 指定时间,单位为毫秒ms |
mixed callback_function | 指定的回调函数 |
mixed params | 指定的回调函数的参数 |
说明:
建立一个一次性定时器,在指定的after_time_ms时间后调用callback_funciton回调函数,执行完成后就会销毁。
callback_function函数的参数为指定的params
须要swoole-1.7.7以上版本。
样例:
$serv->after(1000, function( $params ){ echo "Do something\n"; } , "data" );
功能描述:关闭客户端链接
函数原型:
// 类成员函数
public function swoole_server::close(int $fd, int $from_id = 0);
返回:关闭成功返回true,失败返回false
参数说明:
参数 | 说明 |
---|---|
int fd | 指定关闭的fd |
int from_id | fd来自于哪一个Reactor(swoole-1.6之后已废弃该参数) |
说明:
调用close关闭链接后,链接并不会立刻关闭,所以不要在close以后当即写清理逻辑,而是应该在onClose回调中处理
样例:
$serv->close( $fd );
功能描述:向客户端发送数据
函数原型:
// 类成员函数
public function swoole_server::send(int $fd, string $data, int $from_id = 0);
返回:发送成功返回true,失败返回false
参数说明:
参数 | 说明 |
---|---|
int fd | 指定发送的fd |
string data | 发送的数据 |
int from_id | fd来自于哪一个Reactor |
说明:
样例:
$serv->send( $fd , "Hello World");
功能描述:发送文件到TCP客户端链接
函数原型:
// 类成员函数
public function swoole_server::sendfile(int $fd, string $filename);
返回:发送成功返回true,失败返回false
参数说明:
参数 | 说明 |
---|---|
int fd | 指定发送的fd |
string filename | 发送的文件名 |
说明:
sendfile函数调用OS提供的sendfile系统调用,由操做系统直接读取文件并写入socket。sendfile只有2次内存拷贝,使用此函数能够下降发送大量文件时操做系统的CPU和内存占用。
样例:
$serv->sendfile($fd, __DIR__.'/test.jpg');
功能描述:获取链接的信息
函数原型:
// 类成员函数
public function swoole_server::connection_info(int $fd, int $from_id = 0);
返回:若是fd存在,返回一个数组,链接不存在或已关闭返回false
参数说明:
参数 | 说明 |
---|---|
int fd | 指定发送的fd |
int from_id | 来自于哪一个Reactor |
说明:
UDP socket调用该参数时必须传入from_id.
返回的结果以下:
名称 | 说明 |
---|---|
int from_id | 来自于哪一个Reactor |
int from_fd | 来自哪一个Server Socket |
int from_port | 来自哪一个Server端口 |
int remote_port | 客户端链接的端口 |
string remote_ip | 客户端链接的ip |
int connect_time | 链接到Server的时间,单位秒 |
int last_time | 最后一次发送数据的时间,单位秒 |
sendfile函数调用OS提供的sendfile系统调用,由操做系统直接读取文件并写入socket。sendfile只有2次内存拷贝,使用此函数能够下降发送大量文件时操做系统的CPU和内存占用。
样例:
$fdinfo = $serv->connection_info($fd); $udp_client = $serv->connection_info($fd, $from_id);
功能描述:遍历当前Server的所有客户端链接
函数原型:
// 类成员函数
public function swoole_server::connection_list(int $start_fd = 0, int $pagesize = 10);
返回:调用成功将返回一个数字索引数组,元素是取到的fd。数组会按从小到大排序。最后一个fd做为新的start_fd再次尝试获取。
调用失败返回false
参数说明:
参数 | 说明 |
---|---|
int start_fd | 起始fd |
int pagesize | 每页取多少条,最大不得超过100. |
说明:
connection_list仅可用于TCP,UDP服务器须要自行保存客户端信息
样例:
$start_fd = 0; while(true) { $conn_list = $serv->connection_list($start_fd, 10); if($conn_list===false) { echo "finish\n"; break; } $start_fd = end($conn_list); var_dump($conn_list); foreach($conn_list as $fd) { $serv->send($fd, "broadcast"); } }
功能描述:获取当前Server的活动TCP链接数,启动时间,accpet/close的总次数等信息。
函数原型:
// 类成员函数
public function swoole_server->stats();
返回:结果数组
参数说明:无
说明:
stats方法在1.7.5+后可用
名称 | 说明 |
---|---|
int start_time | 启动时间 |
int connection_num | 当前的链接数 |
int accept_count | accept总次数 |
int close_count | close链接的总数 |
样例:
$status = $serv->stats();
功能描述:投递一个异步任务到task_worker池中
函数原型:
// 类成员函数
public function swoole_server::task(string $data, int $dst_worker_id = -1);
返回:调用成功返回task_worker_id,失败返回false
参数说明:
参数 | 说明 |
---|---|
string data | task数据 |
int dst_worker_id | 指定投递给哪一个task进程,默认随机投递 |
说明:
此功能用于将慢速的任务异步地去执行,调用task函数会当即返回,Worker进程能够继续处理新的请求。
函数会返回一个$task_id数字,表示此任务的ID
任务完成后,能够经过return(低于swoole-1.7.2版本使用finish函数)将结果经过onFinish回调返回给Worker进程。
发送的data必须为字符串,若是是数组或对象,请在业务代码中进行serialize处理,并在onTask/onFinish中进行unserialize。
data能够为二进制数据,最大长度为8K(超过8K可使用临时文件共享)。字符串可使用gzip进行压缩。
使用task必须为Server设置onTask和onFinish回调,并指定task_worker_num配置参数。
样例:
$task_id = $serv->task("some data");
功能描述:投递一个同步任务到task_worker池中
函数原型:
// 类成员函数
public function swoole_server::taskwait(string $task_data, float $timeout = 0.5, int $dst_worker_id = -1);
返回:task执行的结果
参数说明:
参数 | 说明 |
---|---|
string data | task数据 |
float timeout | 超时时间 |
int dst_worker_id | 指定投递给哪一个task进程,默认随机投递 |
说明:
taskwait与task方法做用相同,用于投递一个异步的任务到task进程池去执行。与task不一样的是taskwait是阻塞等待的,直到任务完成或者超时返回。
任务完成后,能够经过return直接返回结果
样例:
$task_id = $serv->taskwait("some data", 30);
功能描述:传递Task结果数据给worker进程
函数原型:
// 类成员函数
public function swoole_server::finish(string $task_data);
返回:无
参数说明:
参数 | 说明 |
---|---|
string data | 结果数据 |
说明:
使用swoole_server::finish函数必须为Server设置onFinish回调函数。此函数只可用于Task Worker进程的onTask回调中
swoole_server::finish是可选的。若是Worker进程不关心任务执行的结果,能够不调用此函数
此函数在swoole-1.7.2以上版本已废弃,使用return代替。
样例:
$serv->finish("result data");
功能描述:进行心跳检测
函数原型:
// 类成员函数
public function swoole_server::heartbeat(bool $if_close_connection = true);
返回:无
参数说明:
参数 | 说明 |
---|---|
bool if_close_connection | 是否关闭超时的链接,默认为true |
说明:
该函数会主动发起一次检测,遍历所有链接,根据设置的heartbeat_check_interval和heartbeat_idle_time参数,找到那些处于idle闲置状态的链接
swoole默认会直接关闭这些链接,heartbeat会返回这些链接的fd
若是if_close_connection为false,则heartbeat会返回这些idle链接的fd,但不会关闭这些链接
if_close_connection参数 在swoole-1.7.4以上版本可用
样例:
$serv->heartbeat();
功能描述:获取mysqli的socket文件描述符
函数原型:
// 公共函数
int swoole_get_mysqli_sock(mysqli $db)
返回:mysqli的fd
参数说明:
参数 | 说明 |
---|---|
mysqli db | mysqli的链接 |
说明:
可将mysql的socket增长到swoole中,执行异步MySQL查询。若是想要使用异步MySQL,须要在编译swoole时制定--enable-async-mysql
swoole_get_mysqli_sock仅支持mysqlnd驱动
即便是异步MySQL也须要一个链接池,并发SQL必须有多个链接。
样例:
$db = new mysqli; $db->connect('127.0.0.1', 'root', 'root', 'test'); $db->query("show tables", MYSQLI_ASYNC); swoole_event_add(swoole_get_mysqli_sock($db), function($db_sock) { global $db; $res = $db->reap_async_query(); var_dump($res->fetch_all(MYSQLI_ASSOC)); swoole_event_exit(); });
功能描述:设置进程的名称
函数原型:
// 公共函数
void swoole_set_process_name(string $name);
返回:无
参数说明:
参数 | 说明 |
---|---|
string name | 进程名称 |
说明:
修改进程名称后,经过ps命令看到的将再也不是php your_file.php,而是设定的字符串
在swoole_server_create以前修改成manager进程名称 onStart调用时修改成主进程名称 onWorkerStart修改成worker进程名称
swoole_set_process_name存在兼容性问题,优先使用PHP内置的cli_set_process_title函数
样例:
woole_set_process_name("swoole server");
功能描述:获取swoole扩展的版本号
函数原型:
// 公共函数
string swoole_version();
返回:swoole扩展的版本号
参数说明:无
说明:
样例:
echo swoole_version();
功能描述:将标准的Unix Errno错误码转换成错误信息
函数原型:
// 公共函数
string swoole_strerror(int $errno);
返回:转化后的错误信息
参数说明:
参数 | 说明 |
---|---|
int errno | errno错误码 |
说明:
样例:
echo swoole_strerror( $errno );
功能描述:获取最近一次系统调用的错误码
函数原型:
// 公共函数
int swoole_errno();
返回:最近一次系统调用的错误码
参数说明:无
说明:
错误码的值与操做系统有关。但是使用swoole_strerror将错误转换为错误信息。
样例:
echo swoole_strerror(swoole_errno());
功能描述:此函数用于获取本机全部网络接口的IP地址
函数原型:
// 公共函数
array swoole_get_local_ip();
返回:以interface名称为key的关联数组
参数说明:无
说明:
目前只返回IPv4地址,返回结果会过滤掉本地loop地址127.0.0.1
返回结果样例array("eth0" => "192.168.1.100"); 样例:
var_dump(swoole_get_local_ip());