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/zh-hk/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

發表回復

登錄後才能評論