1. 程式人生 > >記一次socket_create()函數耗時異常記錄

記一次socket_create()函數耗時異常記錄

des inpu 100% 可能 應用程序 解釋 一次 urn 異常

技術分享

背景:

下午開發時突然整個頁面耗時增加,空接口每次都需要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

(PHP 
4 >= 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()函數耗時異常記錄