php多进程编程:第一次fork

工作原因,要用到php多进程,于是粗略的了解一下,完成之后把过程记录下来,整理成教程,希望对学习php多进程编程的程序员有所帮助。

前言

使用php cli的时候,我们在终端会这样

php hello.php

运行一个hello.php程序,这样linux会为我们创建一个进程。不考虑 nohup ,在一个终端,我们以cli方式运行的php程序也只能有这一个进程。一个进程处理的任务必定是有限的,在系统资源空闲那么多的情况下,为什么不使用多进程来提高效率呢?

不过php多进程需要安装pcntl和posix扩展(windows不支持)

fork,创建子进程

创建子进程的方法就是fork,在php里面,这个函数是pcntl_fork()

pcntl_fork作用就是创建和当前进程一样的子进程,这个子进程代码段和当前进程一模一样,但是拥有自己的数据段。看一个最简单的创建子进程的方法

<?php

$pid = pcntl_fork();
if( $pid == -1 ){
    exit("fork error");
}
if( $pid == 0 ){
    //子进程执行pcntl_fork的时候,pid总是0,并且不会再fork出新的进程
    echo "child process{$pid}\n";
}else{
    //父进程fork之后,返回的就是子进程的pid号,pid不为0
    echo "parent process{$pid}\n";
}

可以这样解释:pcntl_fork之后,系统会再次启动一个进程,重新运行当前的代码,就酱~

运行结果如下

可以看到,父进程经过pcntl_fork之后,反回了一个pid为3558,下面ps的进程号有一个3558,那就是经过fork之后的子进程啦
来看一下进程(之前我在hello.php里面sleep了几十秒,所以程序未退出)

这样,一个简单地多进程就出来了。如果要执行任务,那么就可以直接把任务的代码放到条件里面去就可以啦

 

你可能还喜欢下面这些文章

用php编写守护进程

在此之前,需要知道守护进程这个概念,知道之后,才可以用php来编写守护进程。那么创建守护进程需要有下面这几个步骤。1.创建子进程,父进程退出父进程先与子进程退出,子进程则会被1号进程收养,这个子进程就会成为init的子进程php使用pcntl_fork()来创建子进程。pcntl_fork()返回一个整型值,在父进程里面返回的是子进程的id,子进程返回的是0,失败则返回-1。这样我们就可以根据这个来分别控制父进程和子进程执行任务。2.子进程创建会话这个是重要的一步,在这一步中该子进程会做这些事情:1.让进程摆脱原会话的控制;2.让进程摆脱员进程组的控制;3.让进程摆脱终端的控制。为什么要这样?

GDB入门:使用bt查看程序出core的调用栈

当程序崩溃的时候,会产生一个core文件。我们可以称它为进程死亡现场。排查进程死亡就和破案一样,找到案发现场,仔细排查每个细节,抽丝剥茧,最终定位原因。很幸运我们有一个强大的工具调查现场信息。这个工具就是GDB。下面我们就来看看如何用GDB排查问题。首先以一个越界访问数组的程序为例,如下:#include #include void core() { std::vector<int> a; std::cout << a;}int main() { core(); return 0;}执行上面的代码将会产生一个core文件。假设我们的core文件为

解决Mac ReportCrash进程占用大量CPU的问题

今天电脑风扇一直呼呼转,发烫利害。于是看看到底哪个进程占用了大量cpu,top查看发现ReportCrash占用了大量CPU,直接kill之后还是会拉起。于是从网上查看如何关闭这个进程,方法如下:打开终端,执行下面命令launchctl unload -w /System/Library/LaunchAgents/com.apple.ReportCrash.plistsudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.ReportCrash.Root.plist如果后续要打开,可以在终端执行如下命令:launchct

守护进程介绍

1.守护进程概述守护进程,也就是通常所说的daemon进程,是Linux中的后台服务进程。它是一个生存期较长的进程,通常独立于控制终端并且周期性地 执行某种任务或等待处理某些发生的事件。守护进程常常在系统引导载入时启动,在系统关闭时终止。Linux有很多系统服务,大多数服务都是通过守护进程实 现的。同时,守护进程还能完成许多系统任务,例如,作业规划进程crond、打印进程lqd等(这里的结尾字母d就是daemon的意思)。由于在Linux中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端称为这些进程的 控制终端,当控制终端被关闭时,相应的进程都

php-fpm与fastcgi之间的关系

php-fpm与fastcgi名词解释php-fpm 全称为php fastcgi progress manager (php fastcgi 进程管理器)FastCGI全称为fast common gateway interface (Fast 通用网关接口)FastCGI是一种协议Fastcgi是CGI的升级版,一种语言无关的协议,用来沟通程序(如PHP, Python, Java)和Web服务器(Apache2, Nginx), 理论上任何语言编写的程序都可以通过Fastcgi来提供Web服务。Fastcgi的特点是会在一个进程中依次完成多个请求,以达到提高效率的目的,大多数Fastcg

赞赏

微信赞赏支付宝赞赏

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注