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