server

swoole 中的swerver,一个异步服务器程序,支持TCP、UDP、UnixSocket 3种协议,仅需要设置网络事件的回调函数即可。swoole_server只能用于php-cli环境,否则会抛出致命错误,类似与php内置服务器和nginx一样!
1,回调函数(常用的)
1-1start ;//server在一启动的时候会调用次回掉,
::回调的名称, 大小写不敏感,具体内容参考回调函数列表,事件名称字符串不要加on
::函数是回调的PHP函数,可以是函数名的字符串,类静态方法,对象方法数组,匿名函数。
1-2 workerstart 在worker进程启动的时候会调用,可以在这里判断是worker进程还是task进程, ($server,$workerId)
if($server->taskworker){//task进程}else{ //worker进程},也可以设置进程名称,swoole_set_process_name('Swoole_Process_Name');
1-3 managerstart 在这个回调函数中可以修改管理进程的名称。
1-4 connect 当有用户连接进来的时候会触发该函数 !connect($server,$fd)
1-5 receive 当接受到用户发来的数据时会触发 !receive($server,$fd,$from_id,$data)
1-6 close 客户端关闭的时候触发! close($server,$fd)
1-7 task finish 这两个回调应该是同时出现的,要使用task,需要设置 task_worker_num=>2.
1-8 send 服务端发送给客户端 !$server->send($fd,$data)
1-9 addListener 添加端口,不是很常用,除非一定要添加额外的端口 ('0.0.0.0',9502,SWOOLE_SOCK_TCP || SWOOLE_SOCK_UDP),1024以下的端口你是知道干嘛的。它的别名是 listen, listen(string $host, int $port, int $type);
1-10 tick ,tick定时器,可以自定义回调函数。此函数是swoole_timer_tick的别名。(毫秒,回调函数) ,注意:它会一直的执行下去,除非遇见clearTimer($tick),类似JS中的setInterval
1-11 after 延迟执行,类是JS中的setTimeout,一次性定时器,执行完成后就会销毁,(毫秒,回调函数)
1-12 task 投递一个异步任务到task_worker池中。此函数是非阻塞的,执行完毕会立即返回。Worker进程可以继续处理新的请求。使用Task功能,必须先设置 task_worker_num,并且必须设置Server的onTask和onFinish事件回调函数。(耗时的功能就放在task中去执行),当有回调时不执行onFinish方法!
在使用这个的时候,一定要合理的设置 task_worker_num=>int ,数量,这里例如设置为2,但是每个用户每次发的都放入task中,当用户第三次输入的时候,如果前两次还没有处理完,那么第三次就会走onFinish(数据依然是处理完啦的)!
还有一种情况就是,当你的task_worker_num设置过小,比如为2,当一个用户发两次,但没有task没有处理完的时候,另一个用户再次发的时候,前一个用户task处理完的数据有可能会发送到后一个用户中去!所以需要合理的设置task_worker_num!
1-13 finish 在task中处理完数据后,需要返回就用$server->finish($data);这里需要注意一点的是,当在投放task异步任务的时候,如果设置了回调函数,就不会走onFinish方法,直接回到回调中!
1-14 addProcess 添加一个用户进程子进程会托管到Manager进程,如果发生致命错误,manager进程会重新创建一个,子进程内不能使用swoole_server->task/taskwait接口,此函数在swoole-1.7.9以上版本可用(添加一个自定义进程开销不会很大),添加的是一个swoole_process对象!
以上就是一些常用到的回调!
2,常用的配置选项
2-1 worker_num 设置启动的worker进程数。业务代码是全异步非阻塞的,这里设置为CPU的1-4倍最合理,因为开启太多的话,是有内存开销的!
2-2 task_worker_num 配置Task进程的数量,配置此参数后将会启用task功能!
2-3 daemonize 守护进程化。设置daemonize => 1时,程序将转入后台作为守护进程运行。
2-4 log_file => '/data/log/swoole.log', 指定swoole错误日志文件。在swoole运行期发生的异常信息会记录到这个文件中。默认会打印到屏幕。
2-5 heartbeat_check_interval 启用心跳检测,此选项表示每隔多久轮循一次,单位为秒
2-6 heartbeat_idle_time 与heartbeat_check_interval配合使用。表示连接最大允许空闲的时间
3,常用属性列表
3-1 connections TCP连接迭代器,可以使用foreach遍历服务器当前所有的连接,此属性的功能与swoole_server->connnection_list是一致的,但是更加友好。遍历的元素为单个连接的fd。
3-2 taskworker true表示当前的进程是Task工作进程,false表示当前的进程是Worker进程

<?php

class Server
{
private $server;
private $process;
private $count;
function __construct()
{
$this->server = new swoole_server('127.0.0.1',9501);
$this->server->set([
'worker_num' => 1, // 工作进程数量. 设置为CPU的1-4倍最合理
'max_request' => 1000, // 防止 PHP 内存溢出, 一个工作进程处理 X 次任务后自动重启 (注: 0,不自动重启)
'max_conn' => 1024, // 最大连接数
'task_worker_num' => 1, // 任务工作进程数量
// 'task_ipc_mode' => 2, // 设置 Task 进程与 Worker 进程之间通信的方式。
'task_max_request' => 0, // 防止 PHP 内存溢出
//'task_tmpdir' => '/tmp',
//'message_queue_key' => ftok(SYS_ROOT . 'queue.msg', 1),
'dispatch_mode' => 2,
//'daemonize' => 1, // 设置守护进程模式
'backlog' => 128,
//'log_file' => '/data/logs/swoole.log',
'heartbeat_check_interval' => 10, // 心跳检测间隔时长(秒)
'heartbeat_idle_time' => 20, // 连接最大允许空闲的时间
//'open_eof_check' => 1,
//'open_eof_split' => 1,
//'package_eof' => "\r\r\n",
//'open_cpu_affinity' => 1,
'socket_buffer_size' => 1024 * 1024 * 128,
'buffer_output_size' => 1024 * 1024 * 2,
// 'enable_delay_receive' => true,
]);
$this->server->on('start',[$this,'onStart']);
$this->server->on('managerstart',[$this,'onManagerStart']);
$this->server->on('workerstart',[$this,'onWorkerStart']);
$this->server->on('connect',[$this,'onConnect']);
$this->server->on('receive',[$this,'onReceive']);
$this->server->on('task',[$this,'onTask']);
$this->server->on('finish',[$this,'onFinish']);
$this->server->on('close',[$this,'onClose']);
// $this->process = new swoole_process([$this,'onProcess']);
// $this->server->addProcess($this->process);
$this->server->addlistener('0.0.0.0',9502,SWOOLE_SOCK_TCP);
$this->server->start();
}
public function onStart($ser)
{
echo "server is run! \n";
}
public function onManagerStart()
{
swoole_set_process_name('HYH_Master_process');
echo "manager is run! \n";
}
public function onWorkerStart($server,$worker_id)
{
// var_dump(get_included_files());
if($server->taskworker){
swoole_set_process_name('HYH_Task_Work_process');
echo "task worker!\n";
}else{
swoole_set_process_name('HYH_Work_process');
echo "workstart\n";
}
}
public function onConnect($server,$fd)
{
echo "client {$fd} connect!\n";
}
public function onReceive($server, $fd,$from,$data)
{
echo "receive client:{$fd} data:{$data}";
// $server->tick(1000, function() use ($server, $fd) {
// $server->send($fd, "hello world");
// });
// echo "count:".count($server->connections);
// var_dump($server->connection_list(0,10));
// $this->process->write($data);
// var_dump($server->connection_info($fd));
// foreach ($server->connections as $item) {
// if($item != $fd){
// $server->send($item,$fd.': '.$data);
// }
// }
//
swoole_async_read('file.txt',function($filename,$content) use ($server,$fd){
echo "{$filename},{$content}\n";
$server->send($fd,$content);
});
// $server->task($data,-1,function($serv,$task_id,$data) use($server,$fd){
// echo "{$data}\n";
// $server->send($fd,$data);
// });
// $task_id = $server->task($data);
// var_dump($server->stats());
// echo "task_id:{$task_id}\n";
}
public function onProcess($process)
{
while (1) {
$msg = $this->process->read();
foreach ($this->server->connections as $conn) {
$this->server->send($conn,$msg);
}
}
}
public function onTask($server,$fd,$from_id,$data)
{

}
public function onFinish($server,$task_id,$data)
{
    echo "task finish {$task_id},{$data}\n";
}
public function onClose($server ,$fd)
{
    echo "client {$fd} close! \n";
}

}

new Server();

推荐阅读更多精彩内容