身為非底層程式設計師,要深入了解socket的內部實作機制是很困難的,我們只要明白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('comment'=>'this is a robot comment'); $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中文網其他相關文章!