守护进程 (daemon) 是一类在后台运行的特殊进程,用于执行特定的系统任务。很多守护进程在系统引导的时候启动,并且一直运行直到系统关闭。另一些只在需要的时候才启动,完成任务后就自动结束.
生存周期长[非必须],一般操作系统启动的时候就启动,关闭的时候关闭。
守护进程和终端无关联,也就是他们没有控制终端,所以当控制终端退出,也不会导致守护进程退出。
守护进程是在后台运行,不会占着终端,终端可以执行其他命令
守护进程的父进程是1号进程,也就是init进程。
a:在命令后添加一个&符号 , 比如 php task.php & . 这个方法的缺点在于 如果terminal终端关闭 , 无论是正常关闭还是非正常关闭 , 这个php进程都会随着终端关闭而关闭 , 其次是代码中如果有echo或者print_r之类的输出文本 , 会被输出到当前的终端窗口中 .
b:使用nohup命令 , 比如 nohup php task.php & . 默认情况下 , 代码中echo或者print_r之类输出的文本会被输出到php代码同级目录的nohup.out文件中 . 如果你用exit命令或者关闭按钮等正常手段关闭终端 , 该进程不会被关闭 , 依然会在后台持续运行 . 但是如果终端遇到异常退出或者终止 , 该php进程也会随即退出 . 本质上 , 也并非稳定可靠的daemon方案 .
c:使用fork和setsid , 我暂且称之为 : *nix解决方案
d:使用supervisor工具 (推荐此方案)
e:systemd
PHP中实现守护进程的步骤是什么,如何编程-群英 (qycn.com)
session leader
- 0) {
- exit(0);
- }
-
- / 以下是子进程 /
-
- // [3] 创建一个新的会话并成为 session leader
- if ( ($sid = posix_setsid()) <= 0 ) {
- die("set sid failed.\n");
- }
-
- // [4] 重设文件掩码
- umask(0);
-
- // [5] 改变工作目录
- if (chdir('/') === false) {
- die("chdir failed.\n");
- }
-
- // [6] 关闭标准输入输出
- fclose(stdin);
- fclose(stdout);
- fclose(stderr);
- }
-
- daemon();
-
- // ... 真正的处理逻辑
Gateway进程数不是开得越多越好,Gateway进程增多会导致进程间通讯开销变大。
每个Gateway进程可以轻松处理5000连接的请求转发,业务同时在线连接数少于5000时可以只开1-2个Gateway进程。1万同时在线可以开2-3个Gateway进程,每5000个连接增加一个Gateway进程,依次类推。
BusinessWorker进程中根据业务是否有阻塞式IO设置进程数为CPU核数的1倍-4倍即可。 即start_businessworker.php
中$worker->count = cpu
核数的1-4倍;
进程数是由count
属性决定的(windows系统不支持进程数设置),例如下面代码
- use Workerman\Worker;
- require_once __DIR__ . '/vendor/autoload.php';
-
- $http_worker = new Worker("http://0.0.0.0:2345");
-
- // ## 启动4个进程对外提供服务 ##
- $http_worker->count = 4;
-
- ...