记一次socket_create()函数耗时异常记录

Posted Hello,World!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记一次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

(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 参数,是设置指定 domain 套接字下的具体协议。这个值可以使用 getprotobyname() 函数进行读取。如果所需的协议是 TCP 或 UDP,可以直接使用常量 SOL_TCP 和 SOL_UDP 。

 

之前协议$protocol一直填的是0,直到今天目标机器关机以后,一直连不上,改了一下协议为SOL_UDP ,耗时恢复正常

下附代码:

     /**     * 发送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);
        $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);

//发送数据到这个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()函数耗时异常记录的主要内容,如果未能解决你的问题,请参考以下文章

记一次MySQL Group by 的坑

问题记录记一次ConnectionTimeout问题排查

记一次苏宁小店事故分析和总结

记一次因@Async引发的程序bug

记一次 Flink 反压问题排查过程

原创记一次Project插件开发