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();

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,383评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,522评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,852评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,621评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,741评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,929评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,076评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,803评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,265评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,582评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,716评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,395评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,039评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,027评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,488评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,612评论 2 350

推荐阅读更多精彩内容