php中pcntl_fork创建子进程

Offer收割机
• 阅读 6557

一、php中pcntl_fork函数概述

  1. pcntl_fork()函数是php中用于创建子进程的一个函数,返回创建的子进程的pid。
  2. 该函数创建子进程具体fork的过程:

    (1)调用该函数即创建一个子进程,创建成功父进程返回子进程的pid,子进程返回0;
    (2)创建子进程实际上对父进程的一个拷贝,共享代码空间,拷贝父进程的数据,也就是说父进程改变父进程的数据,子进程改变子进程的数据变量等;

二、示例代码分析

  1. 代码示例:

    <?php
       $curr_pid = posix_getpid();//获取当前的进程id
       
       //将当前进程的id写入文件中
       echo '当前进程:'.$curr_pid.PHP_EOL;
       
       //开始创建子进程
       $son_pid = pcntl_fork();//返回子进程的id
      
       //查看当前进程
       echo '创建子进程之后当前的进程为:'.posix_getpid().PHP_EOL;
       
       //创建了子进程之后
       if($son_pid > 0){
           //父进程fork成功返回子进程的id,此为父进程的执行逻辑
           echo '子进程id:'.$son_pid.PHP_EOL;
       }elseif($son_pid = 0){
           //子进程fork后返回的pid是0,因此为子进程执行逻辑
       }else{
           //$son_pid=-1的时候,代表fork子进程失败
       }
  2. 以上代码执行后结果为:

    php中pcntl_fork创建子进程

  3. 示例代码分析:

    (1)发现创建了子进程之后,系统会切换到子进程中,而子进程中的代码是从含有pcntl_fork函数的那行执行的
    (2)创建子进程之后,子进程的代码段是拷贝pcntl_fork函数及之后的代码段,之前的代码段并不拷贝,但是具体的数据变量子进程仍然会拷贝
    (3)可见,fork之后程序会分叉执行,即子进程执行

三、pcntl_fork的业务场景举例

  1. php的多进程中,常用pcntl_fork来实现并发,多用于一些简单工具的实现。
  2. 例如监控工具,想要监控几个不同指标的情形,可以使用主进程监控各指标的配置变化,然后对每个指标分别fork一个子进程来监控其具体的情形,当主进程发现指标的配置改变则kill掉之前的子进程重新创建子进程进行监控。
  3. 主进程进行业务分发操作,子进程进行具体的业务逻辑执行。
点赞
收藏
评论区
推荐文章
android的ptrace函数详细分析
@toc1.ptrace函数详解1.1在系统中调用需要包含头文件及函数声明include<sys/ptrace.hintptrace(intrequest,intpid,intaddr,intdata);1.2详细分析函数Ptrace提供了一种父进程可以控制子进程运行,并可以检查和改变它的核心image。它主要
九章 九章
4年前
Android应用启动速度优化
应用启动流程总结:①点击启动一个App,Launcher进程采用BinderIPC向ActivityManagerService发起startActivity请求;②ActivityManagerService接收到请求后,向zygote进程发送创建进程的请求;③Zygote进程fork出新的子进程,即App进程;④App进程通过Bin
DevOpSec DevOpSec
4年前
nginx安全配置
安全是一个重要的问题,必须引起注意。1.nginx介绍nginx本身不能处理PHP(http://www.ttlsa.com/php/"php"),它只是个web服务器,当接收到请求后,如果是php请求,则发给php解释器处理,并把结果返回给客户端。nginx一般是把请求发fastcgi管理进程处理,fastcgi管理进程选择cgi子
Bill78 Bill78
4年前
Python多进程 - 实现多进程的几种方式
方式一:os.fork()coding:utf8"""pidos.fork()1.只用在Unix系统中有效,Windows系统中无效2.fork函数调用一次,返回两次:在父进程中返回值为子进程id,在子进程中返回值为0"""importospidos.fork()ifpid0:
Stella981 Stella981
3年前
PHP用proc_open新建子进程使用管道通信非阻塞执行PHP脚本
PHP用proc\_open新建子进程使用管道通信非阻塞执行PHP脚本.脚本结束时register\_shutdown\_function回调函数访问管道获取子进程输出的数据.例子1(popen):<?phpfunctionfoo(){echodate('YmdH:i:s')."\n";
Wesley13 Wesley13
3年前
PHP 技能精进之 PHP
PHPFPM提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置。那么当我们谈论PHPFPM多进程模型的时候,作为PHPer的你了解多少呢?首先,让我们一起看几个问题:①:PHPFPM启动进程的方式主要有哪几种,区别是什么?②:PHPFPM,是主进程接收请求转给子进程,还是子进程单独接收请求并处理
Stella981 Stella981
3年前
Shell实现自动登录ssh
!/usr/bin/expect//指定shebangsettimeout3//设定超时时间为3秒spawnsshuser_name@172...//fork一个子进程执行ssh命令expec
Stella981 Stella981
3年前
Linux fork() 系统调用
    在Linux中,当程序调用fork()函数时,系统会创建新的进程,为其分配资源(存储数据和代码的空间),然后把原来进程的所有值都复制到新进程中,只有少量数值与原来的进程值不同,相当于复制了本身。      fork()系统调用,被调用一次,却能返回两次:父进程和子进程各自返回一次。可以通过fork()的返回值的不同来区分父进程和子进程。
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Stella981 Stella981
3年前
Linux内核学习笔记(3)
一、进程创建:  Unix下的进程创建很特别,与许多其他操作系统不同,它分两步操作来创建和执行进程:fork()和exec()。首先,fork()通过拷贝当前进程创建一个子进程;然后,exec()函数负责读取可执行文件并将其载入地址空间开始运行。1、fork():kernel/fork.c  在Linux系统中,
Wesley13 Wesley13
3年前
Java 多线程并发编程面试笔录一览
知识体系图:!(https://oscimg.oschina.net/oscnet/581c0fcdb0afeef1a63ee27ebb88e03ced4.png)1、线程是什么?线程是进程中独立运行的子任务。2、创建线程的方式方式一:将类声明为Thread的子类。该子类应重写Thread
Offer收割机
Offer收割机
Lv1
可怜夜半虚前席,不问苍生问鬼神。
文章
4
粉丝
0
获赞
0