記一次socket_create()函數耗時異常記錄
背景:
下午開發時突然整個頁面耗時增加,空接口每次都需要2-3秒的耗時,一開始以為連開發環境數據庫出現問題,最後斷開數據庫跑,發現還是很慢
最終逐步調試此頁面耗時,定位到了socket_create()此函數上面,這個函數主要用在發送udp監控日誌,但是創建socket連接時socket_create()的第三個參數出現了問題
改過後的方式:
$sock = socket_create(AF_INET, SOCK_DGRAM, 1);
先看下php官網的解釋此函數的
http://www.php.net/manual/zh/function.socket-create.php
socket_create (PHP4 >= 4.1.0, PHP 5, PHP 7) socket_create — 創建一個套接字(通訊節點) 說明 ? resource socket_create ( int $domain , int $type , int $protocol ) 創建並返回一個套接字,也稱作一個通訊節點。一個典型的網絡連接由 2 個套接字構成,一個運行在客戶端,另一個運行在服務器端。
$domain = AF_INET ; //AF_INET IPv4 網絡協議。TCP 和 UDP 都可使用此協議。
$type = SOCK_DGRAM ; //提供數據報文的支持。(無連接,不可靠、固定最大長度).UDP協議即基於這種數據報文套接字。
$protocol = 0;//icmp Internet Control Message Protocol 主要用於網關和主機報告錯誤的數據通信。例如“ping”命令(在目前大部分的操作系統中)就是使用 ICMP 協議實現的。
$protocol = 1;//udp User Datagram Protocol 是一個無連接的、不可靠的、具有固定最大長度的報文協議。由於這些特性,UDP 協議擁有最小的協議開銷。
$protocol = 2;//tcp Transmission Control Protocol 是一個可靠的、基於連接的、面向數據流的全雙工協議。TCP 能夠保障所有的數據包是按照其發送順序而接收的。如果任意數據包在通訊時丟失,TCP 將自動重發數據包直到目標主機應答已接收。因為可靠性和性能的原因,TCP 在數據傳輸層使用 8bit 字節邊界。因此,TCP 應用程序必須允許傳送部分報文的可能。
之前協議$protocol一直填的是0,直到今天目標機器關機以後,一直連不上,改了一下協議為1,耗時恢復正常
下附代碼:
/** * 發送udp數據 * @param type $input 發送的數據 * @param type $server 發送的服務器 * @param type $port 發送的端口 * @return boolean 發送成功與否 */ static function UdpSend($input, $server = "test1.mopon.cn", $port = 8125) { try { //創建一個socket $sock = socket_create(AF_INET, SOCK_DGRAM, 1); //發送數據到這個socket socket_sendto($sock, $input, strlen($input), 0, $server, $port); //關閉創建的socket socket_close($sock); //返回 return true; } catch (\Exception $e) { $errorCode = socket_last_error(); $errorMsg = socket_strerror($errorCode); Log::error("Could not send data: [$errorCode] $errorMsg \n"); return false; } }
記一次socket_create()函數耗時異常記錄