php中的进程(php创建进程)

本文目录一览:

php的进程是什么样的,单进程多进程,线程呢?

进程就像地主,有土地(系统资源),线程就像佃户(线程,执行种地流程)

进程-资源分配的最小单位,相对健壮,崩溃一般不影响其他进程,但是切换进程时耗费资源,效率差些。

线程-程序执行的最小单位,没有独立的地址空间,一个线程死掉可能整个进程就死掉,但是节省资源,切换效率高。

PHP 到底是单进程还是多进程

一般都是多进程,由php-fpm或者fastcgi开启并管理的。这个没什么意义。

你应该想问的是PHP是单线程还是多线程。

一般PHP是默认单线程的,不过可以用php插件来支持多线程模式。

PHP进程管理三种模式

ondemand:按请示创建进程数;

dynamic:初始化启动number进程数;

static:固定启动进程数;

php-fpm进程管理一共有三种模式: ondemand、static、dynamic ,我们可以在同一个fpm的master配置三种模式,看下图1。php-fpm的工作模式和nginx类似,都是一个master,多个worker模型。每个worker都在accept本pool内的监听套接字(linux已不存在惊群现象)。

ondemand

在php-fpm启动的时候,不会给这个pool启动任何一个worker,是按需启动,当有连接过来才会启动。

配置文件(我的配置文件地址为:/usr/local/php/etc/php-fpm.conf)

当前pool的名字为test

原理

 ondemand原理图

1. 从上图可以看出,新建worker的触发条件是连接的到来,而不是实际的请求(例如,只进行连接比如telnet,不发请求数据也会新建worker)

2. worker的数量受限于pm.max_children配置,同时受限全局配置process.max(准确的说,三种模式都受限于全局配置)

3.1秒定时器作用

找到空闲worker,如果空闲时间超过pm.process_idle_timeout大小,关闭。这个机制可能会关闭所有的worker。

配置项要求

1. pm.max_children 0

2. pm.process_idle_timeout 0,如果不设置,默认10s

优缺点

优点:按流量需求创建,不浪费系统资源(在硬件如此便宜的时代,这个优点略显鸡肋)

缺点:由于php-fpm是短连接的,所以每次请求都会先建立连接,建立连接的过程必然会触发上图的执行步骤,所以,在大流量的系统上master进程会变得繁忙,占用系统cpu资源,不适合大流量环境的部署

dynamic

在php-fpm启动时,会初始启动一些worker,在运行过程中动态调整worker数量,worker的数量受限于pm.max_children配置,同时受限全局配置process.max

当前pool的名字为test

原理

dynamic原理图

1. 1秒定时器作用

检查空闲worker数量,按照一定策略动态调整worker数量,增加或减少。增加时,worker最大数量=max_children· =全局process.max;减少时,只有idle pm.max_spare_servers时才会关闭一个空闲worker。

idle pm.max_spare_servers,关闭启动时间最长的一个worker,结束本次处理

idle = pm.max_children,打印WARNING日志,结束本次处理

idle pm.max_children,计算一个num值,然后启动num个worker,结束本次处理

配置项要求

1. pm.min_spare_servers/pm.max_spare_servers有效范围(0,pm.max_children]

2. pm.max_children 0

3. pm.min_spare_servers=pm.max_spare_servers

4. pm.start_servers有效范围[pm.min_spare_servers,pm.max_spare_servers]如果没有配置,默认pm.min_spare_servers + (pm.max_spare_servers – pm.min_spare_servers) / 2

优缺点

优点:动态扩容,不浪费系统资源,master进程设置的1秒定时器对系统的影响忽略不计;

缺点:如果所有worker都在工作,新的请求到来只能等待master在1秒定时器内再新建一个worker,这时可能最长等待1s;

static

php-fpm启动采用固定大小数量的worker, 在运行期间也不会扩容,虽然也有1秒的定时器,仅限于统计一些状态信息,例如空闲worker个数,活动worker个数,网络连接队列长度等信息。

当前pool的名字为test

原理

配置项要求

1、pm.max_children 0 必须配置,且只有这一个参数生效

优缺点

如果配置成static,只需要考虑max_children的数量,数量取决于cpu的个数和应用的响应时间,我司配置的是50。

我司不考虑动态的增加减少那么十几个或者几十个worker,我们的内存没有紧张到这个程度,所以,我们一步到位,把worker数配置到支持最大流量,(哈哈,50也是随便定的,足矣足矣呢)

最后我们再介绍下worker的工作流程

fastcgi与php-fpm的关系一句话解读:fastcgi只是通信应用协议,php-fpm就是实现了fastcig协议,并嵌入了一个 PHP 解释器。

php 如何实现多进程

#!/usr/bin/env php

?php

$cmds=array(

        array(‘/apps/bin/launcher.php’,’charge/promotion_props_stat.php’,’mobile’,1),

        array(‘/apps/bin/launcher.php’,’charge/promotion_props_stat.php’,’mobile’,2),

        array(‘/apps/bin/launcher.php’,’charge/promotion_props_stat.php’,’click’,1),

        array(‘/apps/bin/launcher.php’,’charge/promotion_props_stat.php’,’click’,2),

        array(‘/apps/bin/launcher.php’,’charge/promotion_props_stat.php’,1),

        array(‘/apps/bin/launcher.php’,’charge/promotion_props_stat.php’,2)

);

foreach($cmds as $cmd){

        $pid=pcntl_fork();

        if($pid==-1){ //进程创建失败

                die(‘fork child process failure!’);

        }

        else if($pid){ //父进程处理逻辑

                pcntl_wait($status,WNOHANG);

        }

        else{ //子进程处理逻辑

                pcntl_exec(‘/usr/local/bin/php’,$cmd);

        }

}

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/270418.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-16 13:37
下一篇 2024-12-16 13:37

相关推荐

  • PHP和Python哪个好找工作?

    PHP和Python都是非常流行的编程语言,它们被广泛应用于不同领域的开发中。但是,在考虑择业方向的时候,很多人都会有一个问题:PHP和Python哪个好找工作?这篇文章将从多个方…

    编程 2025-04-29
  • 如何通过jstack工具列出假死的java进程

    假死的java进程是指在运行过程中出现了某些问题导致进程停止响应,此时无法通过正常的方式关闭或者重启该进程。在这种情况下,我们可以借助jstack工具来获取该进程的进程号和线程号,…

    编程 2025-04-29
  • PHP怎么接币

    想要在自己的网站或应用中接受比特币等加密货币的支付,就需要对该加密货币拥有一定的了解,并使用对应的API进行开发。本文将从多个方面详细阐述如何使用PHP接受加密货币的支付。 一、环…

    编程 2025-04-29
  • 使用PHP foreach遍历有相同属性的值

    本篇文章将介绍如何使用PHP foreach遍历具有相同属性的值,并给出相应的代码示例。 一、基础概念 在讲解如何使用PHP foreach遍历有相同属性的值之前,我们需要先了解几…

    编程 2025-04-28
  • PHP获取301跳转后的地址

    本文将为大家介绍如何使用PHP获取301跳转后的地址。301重定向是什么呢?当我们访问一个网页A,但是它已经被迁移到了另一个地址B,此时若服务器端做了301重定向,那么你的浏览器在…

    编程 2025-04-27
  • Java中的僵尸进程简介与解决方法

    本文将对Java中的僵尸进程进行详细阐述,并给出几种解决方法。 一、僵尸进程的概念 在操作系统中,进程是指正在执行的程序。当一个进程创建了一个子进程,而该子进程完成了任务却没有被父…

    编程 2025-04-27
  • 多线程和多进程的应用

    多线程和多进程是现代编程中常用的技术,可以提高程序的效率和性能。本文将从不同的角度对多线程和多进程进行详细的介绍和应用。 一、多线程 vs 多进程 多线程和多进程都是为了实现程序并…

    编程 2025-04-27
  • Python多进程读取数据

    本文将从多个方面详细阐述在Python中如何通过多进程读取数据,并给出完整的代码示例。 一、多进程概述 在计算机科学中,进程是正在执行的程序实例。多进程是指计算机系统同时执行多个进…

    编程 2025-04-27
  • PHP登录页面代码实现

    本文将从多个方面详细阐述如何使用PHP编写一个简单的登录页面。 1. PHP登录页面基本架构 在PHP登录页面中,需要包含HTML表单,用户在表单中输入账号密码等信息,提交表单后服…

    编程 2025-04-27
  • 进程a与进程b共享变量s1

    本文将从多个方面对进程a与进程b共享变量s1做详细的阐述,并给出代码示例。 一、定义全局变量s1 进程a与进程b共享变量s1,意味着s1是一个全局变量。在C语言中,可以使用关键字e…

    编程 2025-04-27

发表回复

登录后才能评论