linux - 安裝mod_php5模組, 實現apache對php的支援, 這個東西怎麼理解??

來源:互聯網
上載者:User
php 不是有自己的解析器嗎?
apache 只是將url請求對應到本機伺服器的磁碟檔案,發現該檔案是.php的,就會交給php解析器來做(這個過程之後就和apache暫時沒有關係了)
apache所在使用者(www-data)需要對該檔案有讀取的許可權 然後php解析器去執行這個指令碼
將執行完畢的結果(dom文檔)一併交給apache,
apche再將dom文檔原樣(可能加一些回應標頭之類的)返回給用戶端瀏覽器
用戶端瀏覽器接收到dom文檔,載入js引擎 逐行解析, 碰到img這些特殊標籤才會再次向伺服器發送請求 ...

我理解的是apache只是負責傳遞一下分配一下? 請前輩指出我理解不對的地方

回複內容:

php 不是有自己的解析器嗎?
apache 只是將url請求對應到本機伺服器的磁碟檔案,發現該檔案是.php的,就會交給php解析器來做(這個過程之後就和apache暫時沒有關係了)
apache所在使用者(www-data)需要對該檔案有讀取的許可權 然後php解析器去執行這個指令碼
將執行完畢的結果(dom文檔)一併交給apache,
apche再將dom文檔原樣(可能加一些回應標頭之類的)返回給用戶端瀏覽器
用戶端瀏覽器接收到dom文檔,載入js引擎 逐行解析, 碰到img這些特殊標籤才會再次向伺服器發送請求 ...

我理解的是apache只是負責傳遞一下分配一下? 請前輩指出我理解不對的地方

從宏觀上來看,PHP核心的實現與世界上絕大多數的程式一樣,接收輸入資料, 做相應處理然後輸出(返回)結果。 我們編寫的代碼就是PHP接收的輸入資料,PHP核心對我們編寫的代碼進行解釋和運算, 最後返回相應的運算結果。

這個問題要從『PHP內部的生命週期』和『SAPI介面』來理解:
先來看張圖:

從圖上可以看出,PHP從下到上是一個4層體系:

Zend引擎:Zend整體用純C實現,是PHP的核心部分,它將PHP代碼翻譯(詞法、文法解析等一系列編譯過程)為可執行opcode的處理並實現相應的處理方法、實現了基本的資料結構(如hashtable、oo)、記憶體配置及管理、提供了相應的api方法供外部調用,是一切的核心,所有的外圍功能均圍繞Zend實現。

Extensions:圍繞著Zend引擎,extensions通過組件式的方式提供各種基礎服務,我們常見的各種內建函數(如array系列)、標準庫等都是通過extension來實現,使用者也可以根據需要實現自己的extension以達到功能擴充、效能最佳化等目的(如貼吧正在使用的PHP中介層、富文本解析就是extension的典型應用)。

Sapi:Sapi全稱是Server Application Programming Interface,也就是服務端應用編程介面,Sapi通過一系列鉤子函數,使得PHP可以和外圍互動資料,這是PHP非常優雅和成功的一個設計,通過sapi成功的將PHP本身和上層應用解耦隔離,PHP可以不再考慮如何針對不同應用進行相容,而應用本身也可以針對自己的特點實現不同的處理方式。

上層應用:這就是我們平時編寫的PHP程式,通過不同的sapi方式得到各種各樣的應用模式,如通過webserver實現web應用、在命令列下以指令碼方式運行等等。

Sapi通過通過一系列的介面,使得外部應用可以和PHP交換資料並可以根據不同應用特點實現特定的處理方法,我們常見的一些sapi有:

  • apache2handler:這是以apache作為webserver,採用mod_PHP模式運行時候的處理方式,也是現在應用最廣泛的一種。

  • cgi:這是webserver和PHP直接的另一種互動方式,也就是大名鼎鼎的fastcgi協議,在最近今年fastcgi+PHP得到越來越多的應用,也是非同步webserver所唯一支援的方式。

  • cli:命令列調用的應用模式

Apache是Apache軟體基金會的一個開放原始碼的Web伺服器, 可以在大多數電腦作業系統中運行,由於其跨平台和安全性被廣泛使用,是最流行的Web伺服器端軟體之一。 Apache支援許多特性,大部分通過模組擴充實現。常見的模組包括mod_auth(許可權驗證)、mod_ssl(SSL和TLS支援) mod_rewrite(URL重寫)等。一些通用的語言也支援以Apache模組的方式與Apache整合。 如Perl,Python,Tcl,和PHP等。

當PHP需要在Apache伺服器下運行時,一般來說,它可以mod_php5模組的形式整合, 此時mod_php5模組的作用是接收Apache傳遞過來的PHP檔案請求,並處理這些請求, 然後將處理後的結果返回給Apache。如果我們在Apache啟動前在其設定檔中配置好了PHP模組(mod_php5), PHP模組通過註冊apache2的ap_hook_post_config掛鈎,在Apache啟動的時候啟動此模組以接受PHP檔案的請求。

先看一些Apache裡的PHP配置httpd.conf:

LoadModule php5_module modules/libphp5.soAddHandler application/x-httpd-php .php

libphp5.so/libphp7.so作為Apache的一個模組module,PHP解譯器是工作在Apache進程內(運行使用者是相同的),Apache會把.php尾碼的檔案交給進程內的PHP模組處理,並把結果返回給瀏覽器.也就是說,載入了PHP模組的Apache就是一個PHP運行容器,它們是一個整體,是耦合的,所以必須先編譯Apache,才能在編譯PHP時用參數--with-apxs2=/png/httpd/2.4/bin/apxs指定Apache模組構建指令碼,告訴Apache我要構建PHP模組.

對於Nginx和PHP-FPM這種模式,樓主才需要考慮到運行使用者不同許可權不同的問題,因為Nginx和PHP-FPM是分離的,兩者是不同的進程,通過TCP或者Unix Domain Socket通訊,不過一般Nginx和PHP-FPM都設為同樣的運行使用者,方便Nginx和PHP-FPM都能有許可權操作同樣的檔案.另外PHP-FPM也可以看做一個PHP容器,因為PHP-FPM進程也是內建了PHP解譯器的,因為其不依賴命令列的php,也不依賴php-cgi,跟Apache的區別就是PHP-FPM是一個FastCGI服務,而Apache是一個HTTP服務,Apache能夠直接跟瀏覽器通訊,而PHP-FPM則需要通過Nginx跟瀏覽器互動.

題外話:
PHP從5.4開始內建了一個HTTP伺服器,官方定位是用於開發與測試,因為這個HTTP伺服器並不是一個通用的標準的HTTP伺服器,比如其不支援HTTPS,也不支援目錄列表,還有單進程架構也不能利用多核.除了用來開發,我還找到了一個有意思的應用情境,既然PHP內建了HTTP伺服器和SQLite資料庫,那就可以把它當做一個家用的物聯網伺服器,於是我在Ubuntu上交叉編譯了適用於Android和樹莓派(Raspbian)的PHP,然後用Java寫了個App,調用命令列啟動PHP的HTTP伺服器,然後開啟WebView訪問本地PHP伺服器,本地PHP負責操作檔案系統和網路,WebView用於人機互動,雖然不能調用Android上的Java API,但也能做蠻多事了.這個App已經跑在我的小米4上了.

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.