PHP核心之旅-2.SAPI中的Cli
PHP 核心之旅系列
一、SAPI是什麼?
1.1 理解SAPI
(1)SAPI是PHP框架的介面層。有很多種伺服器的SAPI的實現,程式碼在sapi資料夾下。常見的介面抽象層實現有:cgi,apache2,cli,embed,fpm。
(2)各個伺服器遵循著相同的約定,每個伺服器的SAPI實現都有一套自己的實現。由於很多操作都是相同的,所以有一部分使用的是預設方法。
(3)SAPI類似面向物件中的模板方法模式的應用。 SAPI.c和SAPI.h檔案所包含的一些函式就是模板方法模式中的抽象模板, 各個伺服器對於sapi_module的定義及相關實現(cli,fpm,apache2)則是一個個具體的模板。
sapi在原始碼中的路徑如下:
1.2 呼叫SAPI實現的介面的示意圖
上層呼叫可以是命令列視窗執行php指令碼,然後到SAPI介面層,然後具體執行php指令碼的是cli(Command Line Interface)介面的方法。
我們就以最簡單的SAPI介面Cli來講SAPI的實現。
二、Cli是什麼?
Cli即命令列介面,當在命令列視窗下執行php指令碼時,則會呼叫Cli。
2.1 直接執行指令碼檔案
在命令列視窗執行test.php指令碼
$ php test.php
還可以傳遞一些指定的引數,比如
2.2 -r: 直接執行php程式碼
設定變數$a = 123,然後列印變數$a的值,並回車換行 $ php -r '$a=123; echo $a . "\r\n";'列印結果:123
2.3 -v: 列印php的版本號
[email protected]:~$ php -v
PHP 7.2.2-3+ubuntu14.04.1+deb.sury.org+1 (cli) (built: Feb 6 2018 16:35:00) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.2.2-3+ubuntu14.04.1+deb.sury.org+1, Copyright (c) 1999-2018, by Zend Technologies
三、Cli的執行流程?
Cli是單程序模式。處理完請求就關閉了。
生命週期:
核心程式碼:
main函式位於檔案:\sapi\cli\php_cli.c
虛擬碼如下:
1 main() 2 { 3 // 1.初始化變數 4 ... 5 6 // 2.定義sapi_module,它是記錄SAPI資訊的主要結構。 7 // 結構體型別為_sapi_module_struct,在\main\SAPI.h定義了結構體_sapi_module_struct型別。 8 sapi_module_struct *sapi_module = &cli_sapi_module; 9 10 // 3.初始化sapi_module 11 sapi_startup(sapi_module); //sapi_startup函式位於\main\SAPI.c 12 13 14 // 4.模組初始化階段 15 sapi_module->startup(sapi_module); //這裡的startup在結構體_sapi_module_struct型別中有定義, 16 //而Cli定義的cli_sapi_module的結構體中php_cli_startup指向了startup,所以其實就是呼叫了php_cli_startup 17 //而php_cli_startup直接呼叫了php_module_startup() 18 19 // 5.請求初始化及執行請求 20 do_cli(); 21 // 5.1 根據命令列指定的引數執行相應的操作,如果是查詢系統資訊之類的請求(-i、-m、-v),則會跳過請求初始化階段 22 switch ($args) { 23 ... 24 } 25 // 5.2 請求初始化 26 php_request_startup() 27 // 5.3 執行指令碼 28 switch (behavior) { 29 case PHP_MODE_STANDARD: //標準執行模式,執行指令碼檔案 30 php_execute_script(&file_handle); 31 break; 32 case ...//其他執行模式 33 } 34 // 5.4.請求關閉階段 35 out: 36 php_request_shutdown((void *) 0); 37 38 // 6.模組關閉階段 39 php_module_shutdown(); 40 sapi_shutdown(); 41 }
參考資料:http://www.php-internals.com/
作 者:
出 處:http://www.cnblogs.com/jackson0714/
關於作者:專注於微軟平臺的專案開發。如有問題或建議,請多多賜教!
版權宣告:本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連結。
特此宣告:所有評論和私信都會在第一時間回覆。也歡迎園子的大大們指正錯誤,共同進步。或者直接私信我
聲援博主:如果您覺得文章對您有幫助,可以點選文章右下角【推薦】一下。您的鼓勵是作者堅持原創和持續寫作的最大動力!
我的部落格即將搬運同步至騰訊雲+社群,邀請大家一同入駐:https://cloud.tencent.com/developer/support-plan?invite_code=1apoiadc013o2
相關推薦
PHP核心之旅-2.SAPI中的Cli
PHP 核心之旅系列 一、SAPI是什麼? 1.1 理解SAPI (1)SAPI是PHP框架的介面層。有很多種伺服器的SAPI的實現,程式碼在sapi資料夾下。常見的介面抽象層實現有:cgi,apache2,cli,embed,fpm。 (2)各個伺服器遵循著相同的約定,每個伺服器的SAP
Linux下PHP開發之旅-2.開發環境相關設定探索
一.預設目錄在哪兒? 開始時面對該xampp整合開發環境的相關配置有點不知所錯,於是便先想著找httpd.conf,通過該檔案,對該整合環境的配置檔案關係有了大致瞭解,具體操作如下; cd /opt/lampp/etc vi httpd.conf 預設ServerName
PHP核心之旅-5.強大的陣列
PHP 核心之旅系列 一、陣列的內部結構 1.底層實現為散列表(HashTable,也稱作雜湊表) 2.散列表的概念: 是根據關鍵碼值(Key value)而直接進行訪問的資料結構。通過把關鍵碼值對映到表中一個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做散列表
PHP核心之旅-3.變數
PHP 核心之旅系列 一、弱型別語言 php是弱型別語言。一個變數可以表示任意資料型別。 php強大的一部分原因就是因為它是弱型別語言,但是弱型別語言也有它的缺點,使用不當也會造成很大的問題。 定義變數的時候不需要指定變數型別,也不需要初始化變數。 //定義變數 $test;
PHP核心之旅-6.垃圾回收機制
回收PHP 核心之旅系列 一、引用計數 只有使用引用計數的變數才需要回收。引用計數就是用來標記變數的引用次數的。 當有新的變數zval指向value時,計數器加1,當變數zval銷燬時,計數器減一。當引用計數為0時,表示此value沒有被任何變數指向,可以對value進行釋放。 下面的例子說明引用
PHP核心之旅-1.生命週期
PHP 核心之旅系列 1.SAPI介面 PHP具體應用的程式設計介面。 2.開始和結束 PHP開始執行以後會經過兩個主要的階段: 處理請求之前的開始階段和請求之後的結束階段。 1.1開始階段: 1.1.1 模組初始化階段(MINT),只進行一次。
PHP核心之旅-4.可變長度的字串
PHP 核心之旅系列 一、字串原始碼 zend_string 1 typedef struct _zend_string zend_string; //定義 zend_string變數 2 struct _zend_string { //_zend_string結構體 3
java學習之旅-2
通過 operator 表達 加減 class sta println 就是 方法 最近看了一些java的,可是很多都和C的一樣,比如++,--的前置和後置,簡單的四則運算(加減乗除)也沒什麽說的,還有三目(三元)運算符“?”的使用方法也是和C的用法一樣。不過在學習三目運算
父與子的程式設計之旅2——easygui
1、要用EasyGui顯示一個訊息框,可以使用msgbox(),如下: easygui.msgbox("This is the answer!") 2、要用EasyGui得到一個字串輸入,要用enterbox,如下: easygui = easygui.enterbox("What is you
python學習之旅2(函式進階)
目錄 楔子 名稱空間和作用域 函式巢狀及作用域鏈 函式名的本質 閉包 本章小結 楔子 假如有一個函式,實現返回兩個數中的較大值: def my_max(x,y): m = x if x>y else y return mbigger
python學習之旅2(函數進階)
tuple emp 作用 pen dba cell spl reat HERE 目錄 楔子 命名空間和作用域 函數嵌套及作用域鏈 函數名的本質 閉包 本章小結 楔子 假如有一個函數,實現返回兩個數中的較大值: def my_max(x,y): m
Python從白雞到大佬之旅(2)
本博文為系列性博文,如果是像我一樣的小白起步的話,強烈建議從0看起 Python物件型別及其運算 Python程式中儲存的所有資料都是圍繞物件這個概念展開的 程式中儲存的所有資料都是物件 每個物件都有一個身份,一個型別和一
菜鳥的微服務之旅(2)---springBoot(上)
springboot是spring團隊推出的全新框架。相信有所耳聞的人都不陌生,那麼一些理論的定義介紹我就不再闡述了。本文主要從quick start和常用框架(redis,activeMQ,mybatis)整合共兩個部分來進行筆記記錄。 第一部分 Quick start
Shader之旅2:四宮格畫面實現
書寫本文的初衷是為了自我反省記錄。如有表達不當,請批評指正 首先貼出shader程式碼。這段程式碼是實現相機拍攝畫面四宮格的實現。分別傳入不同的channel 0 1 2 3。然後將UV進行切割分為四塊填入四個channel uniform float selected_
Html5學習之旅(2)元素
元素 b元素:這是 <b>HTML5</b> 教程<br> strong元素:這是 <strong>HTML5</strong> 教程<br> wbr元素,這裡填充一下:Thisisa<wbr&g
Linux下PHP開發之旅-1.開發環境搭建
一.下載相關安裝包 從官網:https://www.apachefriends.org/download.html 下載對應版本的安裝包,由於學的版本為5.5,選擇5.6版本安裝包 二.執行安裝 由於下載的檔案直接就是xampp-linux-x64-5.6.39-0-i
WebView爬坑之旅2--a標籤是target="_blank"時建立新視窗
如果網頁裡連結的a標籤是target=”_blank”,而碰巧你的WebView又沒有處理,那這個時候就會出現狂點連結/button頁面卻無動於衷的情況,給人想砸手機的感覺… 好了,解決方案其實也挺簡
王帥:深入PHP核心(二)——SAPI探究
http://www.csdn.net/article/2014-09-26/2821885-exploring-of-the-php-2 SAPI是Server Application Programming Interface(伺服器應用程式設計介面)的縮寫。P
中科之旅------C#開發中遇到的問題
1.在用USB2XXX_Example來做二次開發的時候遇到了找不到usbxxx.dll後來詢問客服得知,將C:\Program Files\USB2XXX\USB2XXX Software目錄下的libusb-1.0.dll和USB2XXX.dll放到 G:\zkss20181016\c#\s
PDFium-PDF開源之旅(2)——執行除錯pdfium自帶的測試程式
PDFium-PDF開源之旅(2) ——執行除錯PDFium自帶的測試程式 趁熱打鐵週末,總算有時間繼續啦。廢話少說,切入正題. 編譯執行pdfium_test.exe 下載程式碼之後,原想直接寫個Demo,認真看了工程,PDFium是有自帶一個測試程式的,叫pdfium_