本篇文章給大家帶來的內容是關於php中通訊協定以及進程與線程的基礎講解,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所協助。
整理了一些關於PHP相關的基礎。請大家隨意摘看。
通訊協定
網路通訊協定是一種網路通用語言,為串連不同作業系統和不同硬體體繫結構的互連網絡引提供通訊支援,是一種網路通用語言。
應用程式層
名稱 |
注釋 |
HTTP |
Hypertext Transfer Protocol 超文字傳輸通訊協定 (HTTP),顯示網頁 |
DNS |
Domain Name System 網域名稱系統 |
FTP |
File Transfer Protocol 檔案傳輸通訊協定 |
SFTP |
SSH File Transfer Protocol 安全檔案傳送協議 |
SSH |
Secure Shell |
通訊層
名稱 |
注釋 |
TCP |
Transmission Control Protocol 三向交握傳輸協議 |
UDP |
|
網路層
名稱 |
注釋 |
IP |
Internet Protocol |
ICMP |
Internet Control Message Protocol,主要用於路由發送錯誤報表 |
HTTP
HTTP是Hyper Text Transfer Protocol(超文字傳輸通訊協定 (HTTP))的縮寫。它的發展是全球資訊網協會(World Wide Web Consortium)和Internet工作小組IETF(Internet Engineering Task Force)合作的結果,(他們)最終發布了一系列的RFC,RFC 1945定義了HTTP/1.0版本。其中最著名的就是RFC 2616。RFC 2616定義了今天普遍使用的一個版本——HTTP 1.1。
HTTP協議(HyperText Transfer Protocol,超文字傳輸通訊協定 (HTTP))是用於從WWW伺服器傳輸超文本到本地瀏覽器的傳送協議。它可以使瀏覽器更加高效,使網路傳輸減少。它不僅保證電腦正確快速地傳輸超文字文件,還確定傳輸文檔中的哪一部分,以及哪部分內容首先顯示(如文本先於圖形)等。
HTTP是一個應用程式層協議,由請求和響應構成,是一個標準的用戶端伺服器模型。HTTP是一個無狀態的協議。
在TCP/IP協議棧中的位置
HTTP協議通常承載於TCP協議之上,有時也承載於TLS或SSL協議層之上,這個時候,就成了我們常說的HTTPS。如所示
預設HTTP的連接埠號碼為80,HTTPS的連接埠號碼為443。
HTTP的請求響應模型
HTTP協議永遠都是用戶端發起請求,伺服器回送響應。見
這樣就限制了使用HTTP協議,無法實現在用戶端沒有發起請求的時候,伺服器將訊息推送給用戶端。
HTTP協議是一個無狀態的協議,同一個用戶端的這次請求和上次請求是沒有對應關係。
HTTP Request
用戶端發送一個HTTP請求到伺服器的請求訊息包括以下格式
請求行(request line)
要求標頭部(header)
空行和請求資料四個部分組成。
Get請求例子
GET /562f25980001b1b106000338.jpg HTTP/1.1Host img.mukewang.comUser-Agent Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36Accept image/webp,image/*,*/*;q=0.8Referer http://www.imooc.com/Accept-Encoding gzip, deflate, sdchAccept-Language zh-CN,zh;q=0.8
POST請求例子
POST / HTTP1.1Host:www.wrox.comUser-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)Content-Type:application/x-www-form-urlencodedContent-Length:40Connection: Keep-Alivename=Professional%20Ajax&publisher=Wiley
第一部分:請求行,第一行顯示請求類型,以及http1.1版本。
第二部分:要求標頭部,第二行至第六行。
第三部分:空行,第七行的空行。
第四部分:請求資料,第八行。
HTTP Response
一般情況下,伺服器接收並處理用戶端發過來的請求後會返回一個HTTP的響應訊息。
HTTP響應也由四個部分組成
HTTP/1.1 200 OKDate: Fri, 22 May 2009 06:07:21 GMTContent-Type: text/html; charset=UTF-8<html><head></head><body><!--body goes here--></body></html>
第一部分狀態行 : 由HTTP協議版本號碼、狀態代碼、狀態訊息三部分組成。
第二部分訊息前序 : 用來說明用戶端要使用的一些附加資訊
第三部分空行 : 訊息前序後面的空行是必須的
第四部分響應本文 : 伺服器返回給用戶端的文本資訊。
HTTP 狀態代碼
狀態碼有三位元字組成,第一個數字定義了響應的類別,共分五種類別
狀態 |
注釋 |
1xx |
指示資訊--表示請求已接收,繼續處理 |
2xx |
成功--表示請求已被成功接收、理解、接受 |
3xx |
重新導向--要完成請求必須進行更進一步的操作 |
4xx |
用戶端錯誤--請求有語法錯誤或請求無法實現 |
5xx |
伺服器端錯誤--伺服器未能實現合法的請求 |
進程與線程
進程的概念是作業系統的結構的基礎。Multics的設計者在20世紀60年代首次使用了這個技術詞語,它比作業更通用一些。關於進程的定義,如下所示
為什麼設計了進程?
設計出一個能夠協調各種不同活動的系統軟體是非常困難的。
在任何時刻都有許多作業在運行中,每個作業都包括要求按照順序執行的很多步驟,因此分析時間的序列組合是不可的。由於缺乏能夠在所有活動中進行協調和合作的系統級的方法,程式員只能基於他們對作業系統所控制的環境的理解,採用自己的特殊方法。然而這種方法是很脆弱的,尤其對於一些程式設計中的小錯誤,因為這些錯誤只有在很少見的時間序列發生時才會出現。
由於需要從應用程式軟體錯誤和硬體錯誤中區分出這些錯誤,因而診斷工作是很困難的。及時檢測出錯誤,也很難確定原因,因為很難線上錯誤產生的精確情境。一般而言,產生這類錯誤的4個主要原因如下:
解決這些問題需要一種系統層級的方法監控處理器中不同程式的執行。進程的概念為此提供了基礎。
因此進程可以看做是由三部分組成的
一段可以執行的程式
程式所需要的相關資料
程式的執行內容
進程的建立
傳統地,作業系統建立進程的方式對使用者和應用程式都是透明的,這在當代作業系統中也很普遍。但是允許一個進程引發另一個進程的建立將是很有用的。
例如一個程式進程可以產生另一個進程,以接受應用程式產生的資料,並將資料群組織成適合以後分析的格式。新進程與應用程式並行的運行,併當得到新的資料時被啟用。
這個方案對於構造應用程式是非常有用的,例如,伺服器處理序(如列印伺服器、檔案伺服器)可以為它處理的每個請求產生一個新進程。當作業系統為另一個進程的顯式請求產生一個新進程時,這個動作稱為進程派生。
當一個進程派生另一個進程時,前一個稱作父進程,被派生的進程稱作子進程。在典型的情況下,相關進程需要像話之間通訊和合作。對程式員來說,合作是一個非常困難的任務。
什麼是線程
線程是進程的一個執行流,線程不能分配系統資源,它是進程的一部分,比進程更小的獨立啟動並執行單位
進程和線程的關係
進程就像地主,有土地(系統資源),線程就像佃戶(線程,執行種地流程)。每個地主(進程)只要有一個幹活的佃戶(線程)。
進程-資源分派的最小單位,相對健壯,崩潰一般不影響其他進程,但是切換進程時耗費資源,效率差些。
線程-程式執行的最小單位,沒有獨立的地址空間,一個線程死掉可能整個進程就死掉,但是節省資源,切換效率高。
PHP常見的進程和線程
在web應用中,我們每次訪問php,就建立一個PHP進程,當然也會建立至少一個PHP線程
PHP使用pcntl來進行多進程編程
PHP中使用pthreads來進行多線程編程
nginx的每個進程只有一個線程,每個線程可以處理多個用戶端的訪問
php-fpm使用多進程模型,每個進程只有一個線程,每個線程只能處理一個用戶端訪問
apache可能使用多進程模型,也可能使用多執行緒模式,取決於使用哪種SAPI