当前位置: 首页 > 后端技术 > PHP

PHP多进程系列笔记(四)

时间:2023-03-30 01:39:26 PHP

本节主要讲解Posix常用函数和进程池的概念,同时也涉及到守护进程的知识。这部分难度较低。Posix常用函数posix_kill向指定的pid进程发送信号。成功时返回TRUE,失败时返回FALSE。boolposix_kill(int$pid,int$sig)$sig=0,可以检测进程是否存在,不会发出信号。示例://向当前进程发送SIGUSR1信号posix_kill(posix_getpid(),SIGUSR1);注:Linux下通过kill-l可以看到所有的信号常量。posix_getpid返回当前进程ID。posix_getppid返回父进程ID。posix_setsid设置新的会话领导者,离开终端。成功返回sessionid,失败返回-1。编写守护进程(Daemon)来使用这个功能。这是Workerman源代码中的一个示例:functiondaemonize(){umask(0);$pid=pcntl_fork();if(-1===$pid){die('forkfail');}elseif($pid>0){退出(0);}if(-1===posix_setsid()){die("setsidfail");}//再次fork避免SVR4系统重新获得终端的控制权。$pid=pcntl_fork();if(-1===$pid){die("forkfail");}elseif(0!==$pid){退出(0);}}如果程序需要作为守护进程执行,在业务代码之前调用该函数即可。反盗版声明:本文为原创文章,发表于公众号飞鸿影博客(fhyblog)和博客园,转载需征得作者同意。进程池什么是进程池?其实是一个很简单的概念,就是预先创建一组子流程。当一个新的任务到来时,系统通过在进程组中分配一个子进程来完成这个任务。在前面几节的例子中,我们都是使用这种方式来提前创建进程,而不是动态创建进程。引入《Linux高性能服务器编程》的一段话,描述了动态创建进程的缺点:动态创建进程(或线程)比较耗时,会导致客户响应变慢。动态创建的子进程通常只用于为一个客户端服务,这导致系统上存在大量微小的进程(或线程)。在进程和线程之间切换会消耗大量的CPU时间。动态创建的子进程是当前进程的完整映像。当前进程必须仔细管理分配给它的系统资源,例如文件描述符和堆内存。否则,子进程可能会复制这些资源,导致系统可用资源急剧下降,从而影响服务器性能。所以任何时候,建议提前创建一个进程,也就是使用进程池来实现。正如我们所熟悉的,php-fpm还支持最大创建进程数和初始创建多少个进程。如果你有兴趣,可以研究一下。(未完待续)欢迎关注公众号,及时获取最新文章!推荐!您每月只需2.5即可拥有带SSD的VPS!