PHP多进程系列笔记(四)

本节主要讲解Posix常用函数和进程池的概念,也会涉及到守护进程的知识。本节难度较低。

Posix常用函数

posix_kill

向指定pid进程发送信号。成功时返回 , 或者在失败时返回 。

,可以检测进程是否存在,不会发送信号。

示例:

注:通过 可以看到Linux下所有的信号常量。

posix_getpid

返回当前进程id。

posix_getppid

返回父进程id。

posix_setsid

设置新会话组长,脱离终端。成功时返回session id,失败返回 -1。写守护进程(Daemon) 用到该函数。下面引用Workerman源代码里的一段示例:

如果程序需要以守护进程的方式执行,在业务代码之前调用该函数即可。

防盗版声明:本文系原创文章,发布于公众号 (fhyblog)及博客园,转载需作者同意。

进程池

什么是进程池? 其实是很简单的概念,就是预先创建一组子进程,当有新任务来时,系统通过调配该组进程中的某个子进程完成此任务。

前面几节的示例里我们都是使用这种方式,预先创建好进程,而不是动态创建。

引入《Linux高性能服务器编程》的一段话,描述动态创建进程的缺点:

动态创建进程(或线程)比较耗费时间,这将导致较慢的客户响应。

动态创建的子进程通常只用来为一个客户服务,这样导致了系统上产生大量的细微进程(或线程)。进程和线程间的切换将消耗大量CPU时间。

动态创建的子进程是当前进程的完整映像,当前进程必须谨慎的管理其分配的文件描述符和堆内存等系统资源,否则子进程可能复制这些资源,从而使系统的可用资源急剧下降,进而影响服务器的性能。

所以任何时候,建议预先创建好进程,也就是使用进程池的方式实现。

像我们熟知的php-fpm还支持最大创建多少个进程、初始创建多少个进程这种方式,大家感兴趣可以研究研究。

(未完待续)

推广时间

最近在GitChat开了一期 Chat ,主题是《PHP Socket 编程进阶指南》,主要和大家讲解 PHP Socket 编程相关知识。通过参与本场 Chat,您将学到如下内容:

熟悉 Socket 系列函数。

熟悉 stream_socket 系列函数。

如何使用 Socket 系列函数实现 TCP 服务端和客户端?

如何使用 socket_select 实现 I/O 多路复用?

如何使用 stream_socket 系列函数实现TCP服务端和客户端?

如何使用 stream_select 实现 I/O 多路复用?

欢迎感兴趣的朋友参加或者帮忙宣传!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180625G08BZZ00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券