php中的前端和后端的意义(用PHP玩转进程之一—基础)PHP基础 / PHP基础前后端交互...

wufei123 发布于 2024-07-03 阅读(3)

首发于公众号 Howborn《用PHP玩转进程之一 — 基础》我们工作中接触最多的就是 进程,但是我们对它又比较陌生,因为它是业务不需要关心的地方,既有的公有组件和操作系统已经对我们屏蔽了它的复杂性然后跟它的接触时间一长,我们难免会对它产生好奇:How it works?。

什么是进程进程是 程序的实体,是系统进行 资源分配和调度的基本单位,是操作系统结构的基础每个进程都有自己唯一标识(PID),每个进程都有父进程,这些父进程也有父进程,所有进程都是init进程(PID 为 1)的子进程。

我们来直观感受下它的存在,可以说它是看不见又摸不着$ pstree -p init(1)-+-init(3)---bash(4) |-nginx(771)-+-nginx(773) |。

|-nginx(774) ||-nginx(776) |`-nginx(777) |-php-fpm(702)-+-php-fpm(707) `

-php-fpm(712) 进程分类前台进程前台进程具有控制终端,会堵塞控制终端它的特点是:可以同用户交互,但容易被意外终止;有较高的响应速度,优先级别稍高;$ php server.php start。

PHPServer start [OK] # 堵塞了/_ \通常,在控制终端使用Ctrl+C组合键,会导致前台进程终止退出守护进程守护进程是一种运行在后台的特殊进程,因为它不属于任何一个终端,所以不会收到任何终端发来的任何信号。

它与前台进程显著的区别是:它没有控制终端,不能直接和用户交互,在后台运行;它不受用户登录和注销的影响,只受开机或关机的影响,可以长期运行;通常我们编写的程序,都需要在 后台不终止的长期运行 ,此时就可以使用守护进程。

当然,我们可以在代码中调用系统函数,或者直接在启动命令后追加&操作符,如下:$ nohup php server.php start & # &使进程脱离控制终端运行通常&与 nohup 结合使用,忽略 SIGHUP 信号来实现一个守护进程。

该方式对业务代码侵入最小,方便且成本低,常用于临时执行任务脚本的场景进程间通信(InterProcess Communication)进程的用户空间是相互独立的,一般而言是不能相互访问但很多情况下,进程间需要互相通信来进行数据传输、共享数据、通知事件、进程控制等,这就必须通过内核实现进程间通信。

进程间通信有管道、消息队列、信号、共享内存、套接字等方式,本文只介绍后 3 种共享内存(Shared Memory)共享内存是一段被映射到多个进程地址空间的内存,虽然这段共享内存是由一个进程创建,但是多个进程都可以访问。

如下图:

共享内存是最快的进程间通信方式,但是可能会存在竞争,因此需要加锁Linux 支持三种共享内存:mmap、Posix、以及 System V套接字(Socket)套接字是一个通信链的句柄,可以用域、端口号、协议类型来表示一个套接字,其中域分为 Internet 网络(IP 地址)和 UNIX 文件(Sock 文件)两种。

当域为 Internet 网络时,通信流程如下图:

特别的是,当套接字域为 Internet 网络时,可以实现 跨主机的进程间通信因此,若要实现跨主机进行进程间通信,则须选用套接字信号(Signal)信号受事件驱动,是一种异步且最复杂的通信方式,用于通知接受进程有某个事件已经发生,因此常用于事件处理。

信号的处理机制,如下图:

常用的信号值在 Linux 系统中,可使用kill -l命令查看这 62 个信号值其中常用值如下:信号名称值说明进程默认行为SIGHUP1终端控制进程结束TerminateSIGINT2键盘Ctrl+C被按下。

TerminateSIGQUIT3键盘Ctrl+/被按下DumpSIGKILL9无条件结束进程TerminateSIGUSR110用户保留TerminateSIGUSR212用户保留TerminateSIGALRM

14时钟定时信号TerminateSIGTERM15程序结束TerminateSIGCHLD16子进程结束Ignore产生信号的方式实际中,硬件或者软件中断都会触发信号,但这里只列举两种信号产生方式终端按键

按键/命令信号名称Ctrl+CSIGINTCtrl+\SIGQUITEXITSIGHUP系统调用通过kill系统调用发送信号例如,在 Shell 中使用kill -9发送 SIGKILL 信号对于kill

调用,需要注意以下两种特殊情况:1、 特殊信号可以发送编号为0的信号来 检测进程是否存活$pid = 577; if (posix_kill($pid, 0)) { echo"进程存在\n"; }

else { echo"进程不存在\n"; } 2、 特殊 PID这里的参数$pid,根据取值范围不同,含义也不同具体如下:$pid > 0: 向 PID 为 $pid 的进程发送信号$pid = 0。

:向当前进程组所有进程发送信号,比较常用;$pid = -1:向所有进程(除 PID 为 1)发送信号(权限);进程的处理方式进程共有 3 种处理信号的方式:默认行为;忽略;捕获并处理—注册信号处理器后,当捕获到信号时,执行对应的处理器;

其中,默认行为进一步可以细分为以下几种:默认处理类型描述Terminate进程被中止(杀死)Dump进程被中止(杀死),并且输出 dump 文件Ignore信号被忽略Stop进程被停止信号的默认行为类型,见 常用的信号值 默认行为部分。

进程间关系使用ps -ajx命令查看所有进程信息,如下:#父PID PID 组ID 会话ID 终端 时间 名称PPIDPIDPGIDSIDTTYTIMECOMMAND0111?0:00

/initro1434343?0:00/usr/sbin/sshd43111341113411134?0:00 sshd:root@pts/111134111691116911169pts/10:00-bash

11169 11251 11251 11169 pts/1 0:00 PHPServer:master11251 11252 11251 11169 pts/1 0:36 PHPServer:worker

11251 11253 11251 11169 pts/1 0:42 PHPServer:worker进程组(Process Group)进程组是一个或多个进程的集合每个进程除了有一个 PID 之外还有一个进程组 ID(GID),每个进程都属于一个进程组,每个进程都有一个组长进程。

如上图中,1 个PHPServer: master主进程和 2 个PHPServer: worker子进程,属于同一个进程组11251,可以看出主进程是组长进程会话(Session)会话是一个或多个进程组的集合,一个会话有对应的控制终端。

如上图中,4 个PHPServer进程和-bash进程同属于一个会话,因为他们在一个pts/1的控制终端需要说明的是,当用户退出(Logout)会话以后,系统默认对该会话下的进程进行如下操作:系统向该会话发出 SIGHUP 信号;。

该会话将 SIGHUP 信号发给所有子进程;子进程收到 SIGHUP 信号后,自动退出;而对于后台进程,用户在退出时系统默认不会发送 SIGHUP 信号,这是由 Shell 的huponexit参数(默认

off)控制可通过shopt -s huponexit设置成on(当前会话有效),此时后台进程会收到 SIGHUP 信号进程模型从进程层面来说,程序可以分为单进程和多进程模型单进程单进程模型的程序,只有一个进程在运行。

他是最基本的进程模型,实现起来比较简单,Redis 就是采用这种进程模型多进程

为了提高程序的并发处理能力,程序由单进程慢慢演变成了多进程,一 个 Master 进程和多个 Worker 进程是多进程常见的构成形态可以说,现在大部分程序都是多进程模型,其中 Nginx 是典型的代表。

总结到这里,我们已经对进程有了基础的认识,后续我将用 PHP 一步步实现一个 PHPServer 应用。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

河南中青旅行社综合资讯 奇遇综合资讯 盛世蓟州综合资讯 综合资讯 游戏百科综合资讯 新闻17742