热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

请问swoole/http/server能否监听unixsocket?

想做一个连接池,想通过swoole/http/server去监听unixsocket去实现,好处是这样连接不会造成服务器出现大量time_wait。如果监听tcp/ip那情况会很糟糕的

想做一个连接池,想通过swoole/http/server去监听unixsocket去实现,好处是这样连接不会造成服务器出现大量time_wait。如果监听tcp/ip那情况会很糟糕的



但是我写了一个代码,虽然可以监听,并且产生出对应的unixsocket文件,但是我用curl库带上CURLOPT_UNIX_SOCKET_PATH参数去请求,发现服务端的on("request")没有触发,也就是没有收到请求

请问我要怎么做?



相关curl请求unixsocket代码跑nginx的unixsocket网站获取数据完全没问题,所以请求的代码我已经测试过了

server的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86

use Swoole\Http\Response;

include_once("../../init.base.cli.php");



/**

 *  

 *  

 */



class HtServer {

    public $server;

   

   

    private $pm_listenAddress = "/home/htserver.sock";//"0.0.0.0";

           

    private $pm_listenPort = 0;

   

   

   

    public function __construct() {



        if(file_exists($logDir) == false || is_dir($logDir) == false)

        {

            @mkdir($logDir,0777);

        }

       

        $serverCOnfig= array(

            "heartbeat_check_interval" => 5,//表示每5秒遍历一次,一个连接如果60秒内未向服务器发送任何数据,此连接将被强制关闭

            "heartbeat_idle_time" => 6000,//一个连接60秒未互相通讯则自动断开

            "open_tcp_keepalive" => 1,//开启踢掉死链接

//              "daemonize"=>1,//守护进程化

            "open_tcp_nodelay"=>1,//开启后TCP连接发送数据时会关闭Nagle合并算法,立即发往客户端连接

//             "ssl_key_file" => "",//sslkey

//             "ssl_cert_file" => "",//sslcrt

//             "task_worker_num"=>10,//每个任务占用一个

            "task_enable_coroutine"=>true,

            "log_file" => $logDir."/swoole.log"

        );

            if($this->pm_listenPort >0)

            {

                $this->server = new Swoole\Http\Server($this->pm_listenAddress, $this->pm_listenPort,SWOOLE_BASE,SWOOLE_SOCK_TCP);

            }else

            {

                $this->server = new Swoole\Http\Server($this->pm_listenAddress,0 ,SWOOLE_BASE,SWOOLE_UNIX_STREAM);

            }

       

       

        //配置信息

        $this->server->set($serverConfig);



        $this->server->on("request",function(swoole_http_request $request, swoole_http_response $response)

        {

            echo "on request:\r\n";

            print_r($request);

           

            $response->write("get your data");

        });

       

        $this->server->on("close", function ($ser, $fd) {

            echo "client {$fd} closed\n";

           

            $clientId = $this->pm_clientFdInfoMap[$fd]["clientId"];

            if($clientId != "")

            {

                unset($this->pm_clientInfoMap[$clientId]);

            }

            unset($this->pm_clientFdInfoMap[$fd]);

        });

       

        $this->server->on("start",function(Swoole\Http\Server $server)

        {

            $logCOntent= "on start,pid:".getmypid();

            echo $logContent."\n";

        });

       

           

        echo "htserver Start\r\n";

        $this->server->start();

       

       

       

    }

   

}



new HtServer();

请求页面的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
function curlPost($url , $fields , $unixSocket = null ,$headers = array(),$useCert = array(),$cOnnectTimeout=2,$requestTimeout=3000)

{

    if(strlen(trim($url)) == 0){ return ;}

    $isSSL = substr($url, 0, 8) == "https://" ? true : false;



    $curl = curl_init();

    curl_setopt($curl , CURLOPT_URL , $url);

    curl_setopt($curl , CURLOPT_HEADER , false);

    curl_setopt($curl , CURLOPT_CONNECTTIMEOUT , $connectTimeout);//连接超时

   

    if($unixSocket)

    {

        curl_setopt($curl, CURLOPT_UNIX_SOCKET_PATH, $unixSocket);

        echo "use unix socket:".$unixSocket."\r\n";

    }

   

    if($requestTimeout ==0)

    {

        curl_setopt($curl, CURLOPT_NOSIGNAL, true);    //注意,毫秒超时一定要设置这个

        curl_setopt($curl, CURLOPT_TIMEOUT_MS, 10);    //注意,毫秒超时一定要设置这个

    }else

    {

        curl_setopt($curl , CURLOPT_TIMEOUT , $requestTimeout);//执行超时

    }

    curl_setopt($curl,  CURLOPT_FOLLOWLOCATION, 1); //302重定向

    if(!empty($fields))

    {

        curl_setopt($curl , CURLOPT_POST , true);

        curl_setopt($curl , CURLOPT_POSTFIELDS , $fields);

    }

    //处理post字符串时特殊的header

    if(is_string($fields))

    {

        for($i=0;$i
        {

            if(strpos($headers[$i] , "Content-Length:"))

            {

                array_splice($headers, $i,1);

            }else

            {

                $i++;

            }

        }



        array_push($headers, 'Content-Length: ' . strlen($fields));

    }



    if(!empty($headers))

    {

        for($i=0;$i
        {

            if(strpos($headers[$i] , "Expect:"))

            {

                array_splice($headers, $i,1);

                break;

            }else

            {

                $i++;

            }

        }

        $headers[] = "Expect:";

        curl_setopt($curl, CURLOPT_HEADER, false);

        curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);

    }else

    {

        $headers = array("Expect:");

        curl_setopt($curl, CURLOPT_HEADER, false);

        curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);

    }

    curl_setopt($curl , CURLOPT_RETURNTRANSFER , true);



    if ($isSSL == true)

    {

        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

        curl_setopt($curl , CURLOPT_SSL_VERIFYHOST , false);

    }



    if(!empty($useCert)){

        //设置证书

        //使用证书:cert 与 key 分别属于两个.pem文件

        curl_setopt($curl,CURLOPT_SSLCERTTYPE,'PEM');

        curl_setopt($curl,CURLOPT_SSLCERT, $useCert["cert"]);

        curl_setopt($curl,CURLOPT_SSLKEYTYPE,'PEM');

        curl_setopt($curl,CURLOPT_SSLKEY, $useCert["key"]);

    }

    curl_setopt($curl, CURLINFO_HEADER_OUT, true);





    $rs = curl_exec($curl);

//     echo "shit:";print_r(curl_getinfo($curl));



    if($requestTimeout >0)

    {

        $downloadCOntentLength= curl_getinfo($curl,CURLINFO_CONTENT_LENGTH_DOWNLOAD);

        $httpCode = curl_getinfo($curl,CURLINFO_HTTP_CODE);

        if($httpCode != 200 && $downloadContentLength <0)

        {

            //没任何下载内容

            SystemUtil::$s_lastCurlHttpCode = -404;

        }else

        {

            SystemUtil::$s_lastCurlHttpCode = $httpCode;

        }

    }



    curl_close($curl);



    return $rs;

}



//echo curlPost("http://fpm2.okguo.com/test.php", array("a"=>"呵呵哒","b"=>'abcde'),"/run/fmp2.okguo.com.sock");

echo curlPost("http://127.0.0.1/test.php", array("a"=>"呵呵哒","b"=>'abcde'),"/home/htserver.sock");



   



推荐阅读
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 本文介绍了PHP常量的定义和使用方法,包括常量的命名规则、大小写敏感性、全局范围和标量数据的限制。同时还提到了应尽量避免定义resource常量,并给出了使用define()函数定义常量的示例。 ... [详细]
author-avatar
mizrke
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有