php與swoole進程模型知多少

2021-01-08 小碼農談IT

面試中,我們經常會被問到,PHP是怎麼運行的,swoole為什麼比nginx和php-fpm的組合效率高等等進程模式方向的內容。平時倒是多多少少有聽過sapi,php-fpm,Master/Worker,但要是真回答起來,就開始模稜兩可甚至概念都會有點模糊。因此特地整理總結了一下,也為大家理清一下思路。

Apache和LoadModule模式

Apache和LoadModule模式運行PHP應該是屬於比較經典的了,小馬初識PHP就是用的這個模式。是否還記得我們安裝完apache和PHP後在 Apache的配置文件 httpd.conf中加上這樣的配置:

# 加入以下2句LoadModule php5_module E:/php/php5apache2_2.dllAddType application/x-httpd-php .php# 修改如下內容<IfModule dir_module>DirectoryIndex index.php index.html</IfModule>

所以,這種方式本質是用 LoadModule 來加載 php5_module,把php作為apache的一個子模塊來運行。當通過web訪問php文件時,apache就會調用php5_module來解析php代碼。php5_module通過sapi將數據傳給php解析器來解析php代碼。如圖。

圖片資源來源於網絡

apache調用php執行的過程如下:apache -> httpd -> php5_module(sapi) -> php

sapi(server api)其實就是一種協議,sapi提供了一個和外部通信的接口,使得PHP可以和其他應用(apache,nginx等)進行交互數據。常見的有如PHP提供給apache和nginx的php5_module、CGI、FastCGI,提供給IIS的ISAPI(記得小馬曾經在.net團隊中配置過IIS跑PHP),提供給Shell的CLI等協議。

Apache也有三種工作模式

圖片資源來源於網絡

Apache進程模型

圖片資源來源於網絡

每一個請求到達,apache都會去fork一個子進程來連接php通過sapi來處理請求,直到這個請求處理完畢,且apache處理請求是同步阻塞方式。一個客戶端佔用一個進程,所以進程的數量決定了並發處理的能力,對高並發並不是很友好。

Nginx和php-fpm組合

Nginx和php-fpm的組合是 Master主進程/Worker多進程模式,啟動一個 Master 進程通過 FastCGI 協議監聽來自 Nginx 傳輸的請求,再fork 多個Worker進程處理請求,但每個Worker進程只對應一個請求連接,用於執行完整的PHP代碼。對於CGI來說,每一個Web請求PHP都必須重新解析php.ini、重新載入全部擴展,並重新初始化全部數據結構。而使用FastCGI,所有這些都只在進程啟動時發生一次。

圖片資源來源於網絡

總結一下:進程模型apache與nginx兩者的主要區別在於apache是同步多進程模型,一個連接對應一個進程;而nginx是異步的,多個連接可以對應一個進程(一個Master多個Worker)。(題外話:不過apache的rewrite比Nginx的rewrite強大。)

運行模式的「進化」

所以,PHP WEB伺服器目前最佳方式是Apache/Nginx + FastCGI + PHP-FPM(+PHP-CGI)不建議 Module加載或者CGI方式。

swoole進程模型

swoole是怎麼做到那麼優秀的呢?為什麼就重新定義了PHP而使其能號稱全宇宙最好的語言呢?我們看一下進程模型。

swoole也是Master主進程(由多個 Reactor 線程組成)和Worker多進程(或多線程)模式,不同的是,包含了Reactor 線程和Manager 進程的概念。

swoole進程模型

啟動一個Master進程,初始化PHP代碼(僅在啟動時執行一次初始化),因為 swoole 需要通過cli的方式運行,所以初始化時,不會初始化 PHP 的全局變量,如 $_SERVER, $_POST, $_GET 等;執行 PHP 腳本,包括詞法、語法分析,變量、函數、類的初始化等,由Reactor線程監聽 Socket 句柄的事件變化(Master進入監聽狀態,但並不會結束進程),Reactor線程負責子多線程的均衡問題,Manager 進程管理Worker多進程,包括 TaskWorker 的進程。每一個Worker進程接收來自Reactor的請求,只需要執行回調函數部分的PHP代碼。

swoole進程
swoole運行流程圖

那麼這個進程模式為什麼能對性能加速呢?為什麼能比傳統的PHP運行模式高效呢?因為由Reactor線程(epoll的IO復用方式)負責監聽Socket句柄的事件變化,負責子進程均衡問題,減少高並發下的資源開銷。通過內存常駐的方式節省php代碼初始化的時間。小馬認為,其實主要還是協程的使用。

好了,整理就到這了,應該是比較清晰了。

相關焦點

  • 學習swoole,swoole進程結構必須得掌握
    一、進程的基本知識什麼是進程,所謂進程其實就是作業系統中一個正在運行的程序,我們在一個終端當中,通過php,運行一個php文件,這個時候就相當於我們創建了一個進程,這個進程會在系統中駐存,申請屬於它自己的內存空間系統資源並且運行相應的程序對於一個進程來說,它的核心內容分為兩個部分,一個是它的內存,這個內存是這進程創建之初從系統分配的
  • swoole之進程結構
    一、進程的基本知識什麼是進程,所謂進程其實就是作業系統中一個正在運行的程序,我們在一個終端當中,通過php,運行一個php文件,這個時候就相當於我們創建了一個進程,這個進程會在系統中駐存,申請屬於它自己的內存空間系統資源並且運行相應的程序。
  • Swoole進程模型分析
    在這邊文章中我們將介紹以下內容:Swoole Server的運行模式Swoole進程模型分析swoole進程上圖是Swoole官網提供的各個進程相互關係圖,可以說理解了這張圖,你就理解了Swoole的進程模型。
  • PHP異步網絡通信引擎-Swoole的安裝與應用
    除了異步 IO 的支持之外,Swoole 為 PHP 多進程的模式設計了多個並發數據結構和IPC通信機制,可以大大簡化多進程並發編程的工作。其中包括了並發原子計數器,並發 HashTable,Channel,Lock,進程間通信IPC等豐富的功能特性。Swoole2.0 支持了類似 Go 語言的協程,可以使用完全同步的代碼實現異步程序。
  • swoole教程第一節:進程管理模塊-(消息隊列)
    php$workers = [];$worker_num = 2;for($i = 0; $i < $worker_num; $i++){ $process = new swoole_process(&39;, false, false); $process->useQueue(); $pid = $process->start(); $workers[$pid
  • php異步高並發擴展 swoole-1.6.11 版發布
    簡介: swoole是一個php版本的異步、高並發擴展,是國人被php官方pecl包收錄的力作之一。
  • PHP與Swoole是如何異步通訊的
    本套課程適合已入門的PHP開發者,將帶領大家從swoole基礎到實戰(進程,協程),全面學習swoole。2 Swoole安裝及自動上傳配置3 Swoole學習—TCP服務端4 Swoole學習—TCP客戶同步端5 Swoole學習—同步異步端6 Swoole學習—tcp和udp服務端7 Swoole的練習小案例8 消息推送服務設計思路9 啟動swoole
  • 源碼編譯安裝PHP7+swoole4,其實很簡單
    二、源碼編譯安裝swoole4其實,編譯安裝跟安裝php差不多,只是中間需要做一步使用php的config配置安裝,下面一起來看看第一步:下載swoole4源碼命令wget https://github.com/swoole/swoole-src/archive/v4.3.1.tar.gz
  • PHP-FPM進程模型
    >先說一下PHP-FPM的進程模型,PHP-FPM採用的是Master/Worker進程模型。當PHP-FPM啟動時,會讀取配置文件,然後創建一個Master進程和若干個Worker進程(具體是幾個Worker進程是由php-fpm.conf中配置的個數決定)。Worker進程是由Master進程fork出來的。
  • 高性能Swoole擴展的安裝與使用
    除了異步IO的支持之外,Swoole為PHP多進程的模式設計了多個並發數據結構和 IPC 通信機制,可以大大簡化多進程並發編程的工作。其中包括了並發原子計數器,並發 HashTable、Channel、Lock、進程間通信 IPC 等豐富的功能特性。
  • 在PHP7.4裡配置,源碼安裝swoole4.x,把swoole用起來
    php的phpize來安裝,phpize在這個目錄裡php/bin,phpize是用來生成外部擴展文件的這個時候需要到swoole目錄裡這樣來操作後會出現像下面截圖那樣,接著下一步/home/work/study/soft/php/bin/phpize查看swoole,這個時候的swoole就會多了一些文件,比如configure文件這個時候就來
  • docker下安裝php拓展swoole(linux環境)
    docker下安裝php拓展swooledocker下安裝php拓展,docker下可用的命令少,安裝起來可沒那麼方便了,我這裡用的ubuntu系統,安裝了集成環境dnmp若是一開始知道要用到swoole
  • php異步高並發擴展swoole-1.6.10版發布 - OSCHINA - 中文開源技術...
    簡介: swoole是一個php版本的異步、高並發擴展,是國人被php官方pecl包收錄的力作之一。
  • 為什麼Swoole可以加速php
    所以,每當 PHP-CGI 開始工作的時候,它是完完全全的一個新進程,它需要重新加載配置文件並初始化,這就造成了很大的資源和時間的浪費。FastCGI那麼,怎麼才能避免這種浪費呢,聰明的程式設計師們想出了另外一種方法:我們為什麼不預先加載好配置,然後,每一個執行的任務只需要複製當前的進程,不就能避免上面的浪費了麼。
  • php通信服務框架選擇swoole還是workerman?
    目前php通信服務框架最流行的有swoole與workerman倆個框架,swoole是有C語言開發的php擴展類,而workerman是純PHP開發框架,可能swoole比workerman出名,在百度、騰訊公司都有在使用,使用頻率也比較高,那麼我們來看下php通信服務框架選擇swoole還是
  • 基於 Swoole 的協程 PHP 開發框架
    官網:https://www.imiphp.com/文檔手冊:https://doc.imiphp.com/代碼倉庫:碼云:https://gitee.com/yurunsoft/IMIGithub:https://github.com/Yurunsoft/IMI空項目:https://gitee.com/yurunsoft/empty-imi-demo
  • 在linux下添加PHP擴展通訊swoole的安裝
    (1)下載swoole安裝包到本地(下載到root家目錄下)(2)解壓並進入該目錄tar zxf v1.10.5.tar.gzcd swoole-src-1.10.5/(3)使用phpize來生成php編譯配置(phpize路徑在php安裝目錄的bin目錄下,視實際安裝路徑而定)/www/wdlinux
  • 如何讓swoole完美支持ThinkPHP5呢
    php//開啟http server$http = new swoole_http_server("0.0.0.0", 9905);$http->set( [ 'enable_static_handler' => true, 'document_root' => "/usr/local/openresty/nginx/html/swoole/LiveRadio
  • swoole-1.7.7 發布,Http 伺服器性能大幅提升
    swoole-1.7.7 發布,內置Http伺服器性能是Node.js的12倍PHP的異步並發擴展swoole發布了 1.7.7 版本,此版本主要有:增加對cygwin
  • swoole學習五協程初探
    很幸運的是,swoole已經為我們處理好了這一切。PHP_EOL;});執行發現並不是順序執行的,第一個等待兩秒,但是程序直接執行了第二個,這就是協程帶來的變化,非阻塞gaoz@nobodyMBP hyperf-skeleton % php swoole_demo/coroutine/coroutine.php 2:3:1:再來看普通的阻塞執行