即时通讯或者推送消息的守护进程?开启几个进程?

进程根据状态可以分为三种进程,守护进程,僵尸进程,孤儿进程。今天我们着重来分析下守护进程。

1.daemon?
(1)概念

守护进程 (daemon) 是一类在后台运行的特殊进程,用于执行特定的系统任务。很多守护进程在系统引导的时候启动,并且一直运行直到系统关闭。另一些只在需要的时候才启动,完成任务后就自动结束.

(2)基本特点

生存周期长[非必须],一般操作系统启动的时候就启动,关闭的时候关闭。

守护进程和终端无关联,也就是他们没有控制终端,所以当控制终端退出,也不会导致守护进程退出。

守护进程是在后台运行,不会占着终端,终端可以执行其他命令

守护进程的父进程是1号进程,也就是init进程。

(3)在Linux中 , 大概有三种方式实现脚本后台化 :

PHP 编写守护进程 - 知乎 (zhihu.com)

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 

(4)php代码实现

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

// ... 真正的处理逻辑
2.开启多少进程

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;

...

你可能感兴趣的:(PHP,php,后端)