本文目錄一覽:
了解PHP-FPM
在伺服器上,當我們查看php進程時,全都是php-fpm進程,大家都知道這個就是php的運行環境,那麼,它到底是個什麼東西呢?
PHP-FPM,就是PHP的FastCGI管理器,用於替換PHP FastCGI的大部分附加功能,在PHP5.3.3後已經成為了PHP的標配。
有小夥伴要問了,FastCGI又是什麼鬼?CGI程序又叫做「通用網關介面」,就是讓Web伺服器和你的應用程序進行交互的一個介面。就像nginx中需要配置的fastcgi_pass,一般我們會使用127.0.0.1:9000或者unix:/tmp/php-cgi.sock來配置這個參數。它的意思就是告訴nginx,過來的請求使用tcp:9000埠的監聽程序來處理或者使用unix/socket來處理。它們都是指向的PHP運行程序。
再說得通俗一點,我們運行php腳本用的是
php-fpm就相當於是這個php命令。nginx通過fastcgi_pass來運行php $nginx_root(nginx配置文件中網站根目錄root配置)下的index.php。所以,如果你用的是python或者其他什麼語言,都可以用它們的cgi程序來讓nginx調用。
FastCGI和CGI又有什麼不同呢?FastCGI是啟動一個socket介面,伺服器應用不需要自己去運行php,只需要向這個socket介面提交請求就可以了。
php-fpm在編譯php時需要添加–enable-fpm。一些通用的集成安裝包如lnmp、phpStudy等都會默認編譯並使用php-fpm,畢竟是標配。
上文中說過nginx可以使用127.0.0.1:9000和unix:/tmp/php-cgi.sock這兩種方式來調用php-fpm。它們有什麼區別呢?
前者,一般帶9000埠號的,是tcp形式的調用。也就是php-fpm啟動了一個監聽進程對9000埠進行監聽。它會調起一個tcp/ip服務,nginx在調用的時候會走一次tcp請求流程,也就是3次握手4次揮手,會走到網路七層中的第四層傳輸層。相對來說這種方式性能會稍差一點,啟動php-fpm後使用nestat查看埠中會出現9000埠的佔用。
後者,使用的是unix套接字socket服務,通過sock文件來交換信息,性能相對好一些,因為它沒有tcp連接過程,也不會有9000埠的佔用。
對於高負載大訪問量的網站還是推薦使用unix方式,對於普通小網站來說,無所謂使用哪個都可以,tcp方式反而更容易配置和理解,也是php-fpm.conf中默認的監聽方式。
php-fpm.conf配置中的listen屬性用來配置監聽,這裡的配置要和nginx中的一致,使用tcp的就監聽127.0.0.1:9000,使用unix的就設置成/tmp/php-cgi-56.sock。
以下內容摘自官方文檔:
===========
各自媒體平台均可搜索【硬核項目經理】
php本地用虛擬機怎麼模擬socket
利用socket發送HTTP請求。
Socket的英文原義是「孔」或「插座」。通常也稱作「套接字」,用於描述IP地址和埠,是一個通信鏈的句柄,可以用來實現不同虛擬機或不同計算機之間的通信。在Internet上的主機一般運行了多個服務軟體,同時提供幾種服務。每種服務都打開一個Socket,並綁定到一個埠上,不同的埠對應於不同的服務。如此看來,其實利用socket操作遠程文件和讀寫本地的文件一樣容易,把本地文件看成通過硬體傳輸,遠程文件通過網線傳輸就行了。
因而可以將發送請求的考慮成 建立連接-打開socket介面(fsockopen())-寫入請求(fwrite())-讀出響應(fread()-關閉文件(fclose())。話不多說,直接上代碼:
conn($url);
$this-setHeader(‘Host: ‘ . $this-url[‘host’]);
}
// 此方法負責寫請求行
protected function setLine($method) {
$this-line[0] = $method . ‘ ‘ . $this-url[‘path’] . ‘?’ .$this-url[‘query’] . ‘ ‘. $this-version;
}
// 此方法負責寫頭信息
public function setHeader($headerline) {
$this-header[] = $headerline;
}
// 此方法負責寫主體信息
protected function setBody($body) {
$this-body[] = http_build_query($body);
}
// 連接url
public function conn($url) {
$this-url = parse_url($url);
// 判斷埠
if(!isset($this-url[‘port’])) {
$this-url[‘port’] = 80;
}
// 判斷query
if(!isset($this-url[‘query’])) {
$this-url[‘query’] = ”;
}
$this-fh = fsockopen($this-url[‘host’],$this-url[‘port’],$this-errno,$this-errstr,3);
}
//構造get請求的數據
public function get() {
$this-setLine(‘GET’);
$this-request();
return $this-response;
}
// 構造post查詢的數據
public function post($body = array()) {
$this-setLine(‘POST’);
// 設計content-type
$this-setHeader(‘Content-type: application/x-www-form-urlencoded’);
// 設計主體信息,比GET不一樣的地方
$this-setBody($body);
// 計算content-length
$this-setHeader(‘Content-length: ‘ . strlen($this-body[0]));
$this-request();
return $this-response;
}
// 真正請求
public function request() {
// 把請求行,頭信息,實體信息 放在一個數組裡,便於拼接
$req = array_merge($this-line,$this-header,array(”),$this-body,array(”));
//print_r($req);
$req = implode(self::CRLF,$req);
//echo $req; exit;
fwrite($this-fh,$req);
while(!feof($this-fh)) {
$this-response .= fread($this-fh,1024);
}
$this-close(); // 關閉連接
}
// 關閉連接
public function close() {
fclose($this-fh);
}
}
編程有哪幾種~
編程有幾種類型?
編程語言的種類繁多,總的來說分為機器語言、彙編語言以及高級語言三大類。
機械語言(machinelanguage):計算機可直接識別、運行的二進位代碼,執行速度快,資源佔用少,但可讀性不強,編程複雜;
彙編語言(assemblylanguage):一種用於電子計算機、微處理器、微控制器或其他可編程器件的低級語言,亦稱為符號語言。目標代碼簡短,佔用內存少,執行速度快,但缺乏可移植性,編程複雜;
高級語言(High-levelprogramminglanguage):相對於機器語言以及彙編語言,高級語言的可讀性強,可移植性高,一般通過事先編好的一個叫做編譯程序的機器語言程序編譯成用機器指令表示的目標程序。現在流行的高級語言有Java、C語言、C++、C#、Pascal、Basic等等。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/195346.html