首先了解一下,phg 的運行原理,這裡簡單提一下。
PHP 的四層體系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 可以不再考慮如何針對不同應用進行兼容,而應用本身也可以針對自己的特點實現不同的處理方式。
Application:
這就是我們平時編寫的 PHP 程序,通過不同的 sapi 方式得到各種各樣的應用模式,如通過 webserver 實現 web 應用、在命令行下以腳本方式運行等等。
如果 PHP 是一輛車,那麼車的框架就是 PHP 本身,Zend 是車的引擎(發動機),Ext 下面的各種組件就是車的輪子,Sapi 可以看做是公路,車可以跑在不同類型的公路上,而一次 PHP 程序的執行就是汽車跑在公路上。因此,我們需要:性能優異的引擎 + 合適的車輪 + 正確的跑道。
先來講講 SAPISAPI 通過通過一系列的接口,使得外部應用可以和 PHP 交換數據,並可以根據不同應用特點實現特定的處理方法,我們常見的一些 sapi 有:
apache2handler:這是以 apache 作為 webserver,採用 mod_PHP 模式運行時候的處理方式。cgi:這是 webserver 和 PHP 直接的另一種交互方式,也就是大名鼎鼎的 fastcgi 協議,在最近今年 fastcgi+PHP 得到越來越多的應用,也是異步 webserver 所唯一支持的方式。cli:命令行調用的應用模式
下面來看看 php 的運行模式(這其實也是面試常問的)1.cgi 全稱 「通用網關接口」(Common Gateway Interface), 它可以讓一個客戶端,從瀏覽器向 Web 伺服器上的程序請求數據,是客戶端和程序之間傳輸數據的一種標準,另外 CGI 獨立於任何語言,所以可以用任何一種語言編寫,只要這種語言具有標準輸入、輸出和環境變量。如 php,perl,tcl 等。CGI 針對每個用戶請求都要開單獨的子進程去維護,執行結束處理掉這個進程。典型的 fork-and-execute 方式
2.fastcgi,根據 1 中 cgi 的特性,可以知道消耗很大,如果很多用戶請求,則會申請很多個子進程。。這時候出現了 FastCGI。FastCGI 像是一個常駐 (long-live) 型的 CGI,它可以一直執行著,只要激活後,不會每次都要花費時間去 fork 一次 (這是 CGI 最為人詬病的 fork-and-execute 模式)。這個是當下用的最多的了。。linux+nginx+php+mysql
CLI 模式 ,PHP-CLI 是 PHP Command Line Interface 的簡稱,如同它名字的意思,就是 PHP 在命令行運行的接口,區別於在 Web 伺服器上運行的 PHP 環境(PHP-CGI,ISAPI 等)。也就是說,PHP 不單可以寫前臺網頁,它還可以用來寫後臺的程序。PHP 的 CLI Shell 腳本適用於所有的 PHP 優勢,使創建要麼支持腳本或系統甚至與 GUI 應用程式的服務端,在 Windows 和 Linux 下都是支持 PHP-CLI 模式的
還有其餘 2 種,自行百度。
## 簡單總結一下:
那麼在這裡,我們 的 命令行其實 就是 cli 的運行模式。而 傳統的 lamp\lnmp, 都是 cgi 模式。
我們執行 golang=>go run test.go python,=>python test.py。也是通過命令行去執行代碼
。
那麼接下來,我們就講講 laravel 中 封裝的 php cli 運行工具,artisan 以及 tinker。
Artisan 是 Laravel 自帶的命令行接口,
有什麼用它提供了相當多的命令來幫助你構建 Laravel 應用。
怎麼用可以通過 list 命令查看所有可用的 Artisan 命令
php artisan list
每個命令都包含了「幫助」界面,它會顯示和概述命令的可用參數及選項。只需要在命令前加上 help 即可查看命令幫助界面:
php artisan help migrate
詳細可以查看 laravel 文檔
2. 如何編寫 Artisan 命令創建命令類首先,我們要了解專門有一個系統自帶命令 make:command 來創建自定義命令文件:
php artisan make:command WelcomeMessage --command=welcome:message
執行完該命令後,會在 app/Console/Commands 目錄下創建一個 WelcomeMessage.php 文件,如果不佳 command 參數,則會自動創建一個 命令名字(根據類名)
註冊 命令類在 app/Console/Kernel.php,
新創建的命令類 WelcomeMessage 添加到 $commands 完成註冊:
protected $commands = [
App\Console\Commands\WelcomeMessage::class
];
php artisan list 就可以看到 welcome:message 命令了。
3. laravel 中的 tinker 用過嗎?學習連結xueyuanjun.com/post/9689
是什麼?這是一種交互式 Shell:獲取用戶輸入並執行它們,然後將結果列印出來返回給用戶。
如何用?php artisan tinker
有什麼用處?可以在 Tinker Shell 中演練測試 Laravel 代碼。如,模型服務調用,還可以手動觸發隊列任務、體驗服務和事件
比如模型和服務,你可以使用控制臺來創建一個新的模型,將其保存到資料庫,然後查詢這條記錄(如果之前沒有運行過 php artisan migrate 命令創建 users 表,先運行 migrate 命令創建):
還記得 factory 批量創建測試用戶嗎?
你也可以使用 tinker 來操作。
php cli 何時使用?
php artisan 為我們提供了哪些便利?
你自定義過哪些 artisan 命令,是如何實現的?在哪一個業務中使用的?
說出你常用的,artisan 命令。
簡介 php 的運行原理
防爬蟲說明禁止 學習某地爬蟲,知乎爬蟲,CSDN 爬蟲。
本文,首發在 learnku 社區。
@author
汪春波(www.shxdledu.cn)