在草稿裡找到以前寫的筆記,應該是在讀 webserver 時寫的筆記。稍微整理了一下發布。
現在的話可以用 ChatGPT。
PHP & HTML?
- PHP 用來產生 HTML
webserver?
- 常見的 web伺服器 / HTTP 伺服器程式
- nginx, IIS, apache
- 如果是 java 生態系,需要運行在 servlet 容器上 => web 容器 tomcat(也是 servlet 容器)
- web 容器 做 的事情跟 CGI 差不多
- CGI vs Servlet
CGI
webserver 怎麼「接收」request 並「解析」request
- 怎麼接收?為什麼他知道有東西進來?
- internet protocol
- 怎麼解析?為什麼他知道收到 request?
- 遵循 port/ request 格式
- 實作 Common Gateway Interface (CGI)
像這樣的網站
常常用簡單的圖解告訴我們 webserver「接收」request 並「解析」request
port 的部分滿多文章都有解釋過,大概理解伺服器啟動的時候就會開啟程序來監聽 port,當有人知道你的 ip port 就可以把東西打進來。
每一個 request 對 server 來說都是 string、封包,那進來的是合法的 request 還是一堆亂碼,webserver 如何解析?
伺服器需要一個程式來處理請求。CGI 就是規定要傳哪些資料、以及怎麼樣的格式的一個介面。各家伺服器廠商實作這個介面。
當你在瀏覽器輸入網址,瀏覽器變會幫你發出一個 request。
裡面寫了標準 HTTP 格式的東西。
完成連線。
詳細內容可以從 dev tool 看。
[CGI 與 WSGI](https://www.itread01.com/content/1540965073.html]
CGI不是一種語言,也不是一種技術,而是一種模式。
CGI 的定義 Common Gateway Interface,“通用閘道器介面”,簡稱CGI。在物理上是一段程式,執行在伺服器上,提供同客戶端 HTML頁面的介面
換句話,只要是提供HTML的伺服器端程式都可以叫CGI,APS、PHP、JSP這些都是,你用C語言寫一個可以提供HTML的伺服器端EXE檔案,也叫CGI。
現在以CGI方式執行的伺服器應該已經沒有了,PHP是FastCGI,也是這個協議還能續到今天的最主要的原因。Servlet和Python的WSGI可以類比,它是一種程式設計介面,通過這種程式設計介面可以將Web Server和Web應用清晰地劃分開界限,每個進入的請求將會呼叫一次Servlet的介面,這樣Web應用就無需關心Web Server使用了多執行緒還是多程序還是多路複用等技術細節,而只需要實現這個介面就行了。既然是程式設計介面,那麼肯定是跟程式語言有關的,Servlet就只能用在Java中,其他語言是不能用Servlet程式設計的(除非有辦法做到和Java相容)
PHP-FPM
現在 server 終於知道有合法 request 進來了,那他要怎麼把腳本語言變成 HTML? PHP-FPM
FPM (FastCGI Process Manager)
FastCGI 程序管理器
PHP-FPM 就是針對於 PHP 的 FastCGI 的一種實現,他負責管理一個程序池,來處理來自Web伺服器的請求。
FPM (FastCGI Process Manager) is an alternative PHP FastCGI implementation with some additional features (mostly) useful for heavy-loaded sites.
process 是什麼?
伺服器會找到 index.php 並讓 PHP 編譯器(PHP interpreter)解析這個 php 檔案,並將回傳交給伺服器
終於到了解析 PHP 的東西 => PHP-FPM,如你所想,他就是在運行在伺服器上的程式,負責將 PHP 產生出結果在交還給伺服器
TL;DW
怎麼編譯檔案?Apache執行PHP的四種方式:
mod_php (DSO,Dynamic Shared Object)
CGI
suPHP
FastCGI
伺服器上的一支程式,當網站伺服器接收到 request,伺服器不是直接去找檔案,而是通知 CGI 去解析腳本語言,將編譯的結果(HTML/JSON/...)回傳。
所以動態網站都是透過 CGI 去解析腳本語言嗎?
並不是,JVM 生態系裡是透過 Java Servlet 這個 Java 程式來處理 HTTP request。
Request 的生命週期
Apache、Niginx 會將請求導向 index.php
,前面提過的應用程式會解析這支 index.php
並將結果回傳。
如果是用 Apache、XAMPP 會發現可以直接走檔案結構讀到檔案
框架、路由分派
- 但現代的框架都有路由分派,以 Laravel 為例
Zend VM
是執行環境
- 如果你之前學過 JavaScript 可能有聽過 V8、Node.js,如果果寫過 C,可能還想起以前裝 gcc 裝老半天,最後發現還是 DEVC++ 最好用這件事 可能PHP 的執行環境就是 Zend。
- 一般的教學就直接從 XAMPP (X AMP P)、Laragon、MAMP 裝下去就結束了。
Languages like C, C++ or Rust are AOT-compiled languages.
Languages like PHP, Java or JavaScript are interpreted.
Normally interpreted languages have less performance and freedom when compared with AOT-compiled languages.
Languages like Java, LUA and now PHP are not only interpreted but also Just In Time compiled!
JIT
- Ahead-of-Time (AOT)編譯
- Just-In-Tine (JIT)編譯
- 深入理解PHP原理之Opcodes
Ref
- what is cgi programming
- CGI/HTML/Web Server (推)
- How the php engine works internally (推)
- How Does PHP Work With The Web Server And Browser? (推)
- Understand TCP: clients, servers, ports, and sockets
- Servlet概述
- Difference between Java Servlet and CGI
- [講解] nginx 與 php-fpm 運作介紹與設定
- Optimizing PHP-FPM for High Performance
- How does a PHP application work?
其他知識的碎片
CGI 程式
-凡是符合 CGI 介面標準的外部程式,就稱之為 CGI 程式CGI 是 Common Gateway Interface 的意思, 它是一個從瀏覽器利用 URL 傳喚伺服機去啟動一個執行檔案, 並且將執行結果傳回瀏覽器的標準介面。
CGI FORM AJAX
- 網路管理語言 Perl 入門與實作
- CGI 程式
關於CGI
CGI是Common Gateway Interface 的簡稱。其主要的功能是在WWW環境下,藉由從使者端傳遞一些訊息給WWW伺服軟體,再由WWW伺服軟體去啟動所指定的程式碼來完成特定的工作。有了CGI功能的加入可以使得WWW的環境不僅可以有單向的資訊瀏覽,更可以有雙向的互動。
網頁如何呼叫 CGI 程式?
- 呼叫 CGI 程式,可以透過 HTML 的 標籤,例如留言板程式:
這是利用表單的寫法。另外,我們也可以直接指定 CGI 程式的 URL 給瀏覽器,例如,在瀏覽器的位址例輸入:
什麼是 CGI?
CGI 為 Common Gateway Interface 的簡寫,簡而言之,CGI 就是在不同作業平臺與不同的 Web server 間,能讓瀏覽器輸入與解讀輸出的界面,CGI 的標準依賴 HTML 與 HTTP 而來。CGI 只是一種技術,而不是程式語言,撰寫 CGI 程式時,可以使用各種不同的程式語言。
例如,我們在 UNIX 或 Windows NT 上都可以利用瀏覽器並且透過一樣的界面規格來執行伺服器端的程式並傳入參數,這種技術就是 CGI。可撰寫 CGI 程式的程式語言當然不限於一種,一般最常用來撰寫 CGI 的程式語言有 Perl 和 C 語言。
C 語言是 UNIX 系統最普通的語言,Perl 具有優秀的字串處理能力,所以常被用來做與字串處理的工作。在 Windows 系統下,還可以使用 Visual Basic 等程式語言來撰寫 CGI 程式。
CGI 的技術提供了能讓瀏覽器傳送資料給伺服器的技術,因此,HTML 的表單資料從傳送到能讓 PHP 程式處理,中間就是透過 CGI 這樣的共同界面才能完成。
CGI 的功能, 為什麼要 CGI?
http://www.cs.nccu.edu.tw/~lien/BCC/HTML/TUTOR/cgi.htm
CGI 是一種介面
當您想要使 W3 與程式結合,就需要用 CGI
W3 的主從架構
使用者端要有瀏覽器 (Browser),如:Netscape、Mosaic...
伺服器則必須存在一個伺服程式 (Daemon),通常被統稱為 HTTPD
使用者就透過 HTTPD 取得想要看的 HTML 檔、圖形檔,但這些檔都是固定內容。除了以編輯器 (Editor) 來編輯更動,否則使用者看到的東西都會是一樣的。
今天絕大部分的 HTTPD 都支援 CGI,讓 HTTPD 與一般程式溝通,達到顯示動態資料的效果 (可用程式控制 W3 的顯示)。這並沒有限定使用那種程式,只要符合 CGI 規格的程式就被稱為 CGI 程式。
實作的準備 => PERL
#!/bin/sh
echo "Content-type: text/html
<html>
<h1> This is a test of CGI !
</html>
"
轉載整理 CGI
https://flykof.pixnet.net/blog/post/25055683
CGI (Common Gateway Interface,共用閘道介面)不是一種語言,而是一種象徵性的名稱。規定了 Http server 和 CGI程式之間 傳遞參數和結果的方法。
一般使用者透過瀏覽器觀賞網頁時,瀏覽 器會和 Web 主機上的 Http server 建立一個連線,然後 Http server 會到一堆事先做好的 HTML 檔案中,找出使用者要看的網頁,回傳給瀏覽器,讓使用者觀賞。這種方式,由於 HTML 檔案是靜態的,所以使用者看過幾次就沒興趣了。因此就有人想到要透過程式來產生 HTML 內容,這樣就不會一成不變了,這就是 CGI的來由。在觀賞CGI網頁時,同樣地瀏覽器會和 Web 主機上的 Http server 建立一個連線, 但是接著 Http server 不是去抓檔案,而是去啟動一個 CGI 程式,然後將 CGI 程式所產生的內容當成 HTML 傳回給使用者瀏覽器。
CGI與PHP同樣都可以做動態網頁那他們的差異在哪?
它是介於客戶端 (Client) 和伺服器端 (Server) 的一種通訊介面,你可以把它想像成家中的一個插座,我們透過插座接上電器,便可以與電力公司通電並使用我們的電器,所以你可以把你的電器解釋成 Client 端,電力公司解釋成 Server 端,而插座即是 Client 與 Server 之間的通訊介面,我們透過插座與電力公司連接進而通電,所以我們可以把插座解釋共用閘道介面,就如同 CGI 的運作原理是一樣的。
而 PHP 就是為了擺脫傳統使用 CGI 介面模式才能完成 Client 與 Server 之間互動所發展出來的高階程式語言,它並非透過所謂的共用閘道介面 (CGI) 才能與 Client 互動,而是真正的厥入於伺服器端程式 (HTTP Server 或 WWW Server),當我們執行 PHP 網頁時,HTTP Server 是將 PHP 預先戴入成為自已的模組,也就是說此時 HTTP Server 已經具備有執行 PHP 的能力,所以當 Client 要求執行 PHP 網頁時,HTTP Server 便可以直接回應資料請求。這類的程式語言我們稱之為 Server Side Script。你不能將 PHP 與 CGI 做比較,它們是完全不同的東西,就好像你拿一張椅子和一本書做比較,風馬牛毫不相干。
至於為什麼要叫做 CGI 程式?或 CGI 語言?,其實那是錯誤也不正確的,而來由則是因為很多人在編寫使用以 CGI 介面模式的網頁程式時,喜歡把副檔名寫為 CGI,例如 bbs.cgi、guestbook.cgi,例如最常用來編寫 CGI 的程式語言 Perl 而言,標準副檔名應該是 *.pl 才對,或是 Python 程式語言,標準副檔名應該為 *.py,但很多時候有些人為了訢求安全性或是一些障眼法,不讓所謂的怪客知道網站是用什麼語言編寫而成,所以都將副檔名改為 *.cgi,因為你讓怪客知道的越多,就越讓人有機可趁躦逃漏洞。也因為如此,久而久之人們 (其實只有台灣人) 的刻板印像,都直接把它叫成 CGI 程式、CGI 語言,甚至也正因為 Perl 的用途幾乎都被拿來使用在 CGI 上,因此很多人也把 Perl 認為是 CGI 或是說 CGI 就是 Perl,久而久之竟變成好像是對的,但那其實是很蠢的,試想前個例子,你若說成插座程式、插座語言是不是很好笑呢?
CGI只是一個介面,提供一些讓瀏覽器和server程式溝通的方法。 但CGI選是附屬壁HTTP通訊協定下,也就是瀏覽器要送資料給你的CGI程式或是CGI程式要將執行結果送到瀏覽器show出來,這都必須經過HTTPd這道關卡,因此CGI程式的I/O就必須要遵守HTTP通訊協定了。 其實CGI程式和一般程式也沒什麼不同,唯一的不同只有它的I/O部分,只要了解CGI程式I/O的原理,那CGI程式也就不足為懼了,接下來就看你programming的功力了。
CGI程式入門
http://ind.ntou.edu.tw/~dada/cgi/CGIprog.htm
在這份文件中有幾點要注意的:當我只寫『CGI』這三個字母,只代表著一個interface、一個gateway; 我若寫『CGI程式』,才是代表程式本身
perl & php
Perl 語言在 Web 程式設計的發展過程中,佔有舉足輕重的地位,尤其是在 ASP、PHP 尚未興起之前,所有使用者與伺服器的溝通,完全是靠 CGI(Common Gateway Interface)來達成,而這些 CGI 背後的程式語言,至少有一半以上是靠 Perl 來完成使命的。
Web Server Support and Configuration
Python - CGI Programming
https://www.tutorialspoint.com/python/python_cgi_programming.htm
What is CGI and How Does it Work?
https://www.tcl.tk/man/aolserver3.0/cgi-ch1.htm
<FORM METHOD="POST" ACTION="/cgi-bin/myprog">
Flask 為甚麼需要 WSGI 與 Nginx
https://www.maxlist.xyz/2020/05/06/flask-wsgi-nginx/
使用 Apache / Nginx 擇一做為反向代理伺服器:負責靜網頁與動態網頁請求和結果的回覆
使用 gunicorn / uWSGI 擇一做為 WSGI 伺服器:負責接收代理伺服器的請求後,轉發給 Flask 以及接收 Flask 返回信息轉發給 Nginx
Flask 收到請求後處理數據並返回頁面給 uWSGI 伺服器。
web server (nginx)
- web service
- gunicorn WSGI
- server app 協議
WEB請求處理三:Servlet容器請求處理
https://reader.monster/yuanmajiagou/44567/web-qingqiuchulisan-servlet-rongqiqingqiuchuli
Tomcat / JVM / Servlet / Cgi 的关系? - V2EX
CGI和servlet运行方式本质的区别是什么?PHP和Java在Web ...
Tomcat / JVM / Servlet / Cgi 的关系? (推推)
http 服务器负责接收客户端请求,找资源,返回资源给客户端,比如 apache / nginx ,如果请求的是静态资源,比如 html / image , http 服务器就直接找到并返回给客户端了。
这个时候如果客户端请求比如 php , http 服务器自己无法解析 php 的文件,如果没有配置解释器那它就会直接把这个 php 的源码给展示了出来(当成了文本文件),如果 http 服务器配置了解释器,因此它知道 php 这种后缀的文件应该去请求 php-cgi ,于是它就去让 php-cgi 执行 php , php 完成处理后把结果给 http 服务器, http 服务器把结果再给客户端。另外为了解决非编译型语言每次都初始化应用基础环境的重复工作,于是出现了 fast-cgi 的标准( master 执行初始化后就变成常驻进程,开启 worker 来处理单个请求), php-fpm 就是这个标准的具体实现。
CGI、FastCGI和PHP-FPM區別和關係詳解(包含圖解)
https://www.itread01.com/content/1543133893.html
①CGI:是 Web Server 與 Web Application 之間資料交換的一種協議。
②FastCGI:同 CGI,是一種通訊協議,但比 CGI 在效率上做了一些優化。同 樣, SCGI 協議與 FastCGI 類似。
③PHP-CGI:是 PHP (Web Application)對 Web Server 提供的 CGI 協議的介面程式。
④PHP-FPM:是 PHP(Web Application)對 Web Server 提供的 FastCGI 協議的介面程式,額外還提供了相對智慧一些任務管理。
⑤WEB 中,Web Server 一般指Apache、Nginx、IIS、Lighttpd、Tomcat等伺服器。
⑥Web Application 一般指PHP、Java、Asp.net等應用程式。