1. 程式人生 > >PHP核心之旅-2.SAPI中的Cli

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.SAPICli

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

Shader2:四宮格畫面實現

書寫本文的初衷是為了自我反省記錄。如有表達不當,請批評指正 首先貼出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_