首頁  >  文章  >  後端開發  >  php為什麼不適合socket

php為什麼不適合socket

(*-*)浩
(*-*)浩原創
2019-10-19 15:02:212411瀏覽

身為非底層程式設計師,要深入了解socket的內部實作機制是很困難的,我們只要明白socket是一套作業系統封裝好的實作流程通訊的函數,會建立和呼叫就夠了。

php為什麼不適合socket

PHP的語言特性和自身定位決定了它只適合做socket客戶端,而不適合做socket伺服器端。

因為socket主要是針對底層和網路服務開發,一般伺服器端都是用C 或Java 等語言實現,這樣能更好地操作底層,對網路服務開發中遇到的問題(如併發、阻塞等)也有成熟完善的解決方案,而PHP顯然不適合這種應用場景。  (推薦學習:PHP視訊教學

實際上,PHP操作MySQL資料庫也是透過socket進行的,這正是由於socket屏蔽了底層的協議,使得網路服務之間的互聯互通變得簡單。

除了傳統的伺服器端語言實現的socket外,隨著HTML5的流行,瀏覽器用戶端實現的WebSocket也逐漸興起,對於這一點值得關注,FlashSocket也是一個不錯的解決方案。

要在客戶端操作socket,可使用fsockopen、socket_create 或 stream_socket_client 等函數實現,如果是PHP5,建議使用stream_socket_client。

socket互動應用程式實例:使用socket提交表單

新test.php 文件,向http://demo.com/index .php?id=1  提交表單數據,程式碼如下:

<?php
$data = array(&#39;comment&#39;=>&#39;this is a robot comment&#39;);
$data = http_build_query($data);
 
$out = "POST http://demo.com/index.php?id=1 HTTP/1.1\r\n";  // 通过POST方式发送数据
$out .= "Host: demo.com\r\n";
$out .= "Content-type: application/x-www-form-urlencoded; charset=UTF-8\r\n";
$out .= "Content-length: ".strlen($data)."\r\n";
$out .= "User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:48.0) Gecko/20100101 Firefox/48.0"."\r\n";
$out .= "Connection: close"."\r\n"."\r\n";    // 注意:此处有两个 \r\n
 
$out .= $data."\r\n";   // 正文数据
 
$fp = fsockopen("demo.com", 80, $errno, $errstr, 30);  // 创建socket客户端连接
 
// $fp = stream_socket_client("tcp://demo.com:80", $errno, $errstr, 30);  推荐这种写法
 
fwrite($fp, $out);    // 向服务器发送数据
 
while (!feof($fp)) {
    echo fgets($fp, 1280);    // 读取服务器响应的数据
}
fclose($fp);  // 关闭socket连接
?>

需要注意以下幾點:

fsockopen的第一個參數,也可以使用IP位址,不要帶http:// 字串,除非使用SSL等

請求頭(headers)不一定要帶上所有的頭域,一般只需帶上幾個核心的header即可

在最後一個header處,即Connection 後面有兩個換行

#注意編碼問題

以上是php為什麼不適合socket的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn