热门标签 | 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");



   



推荐阅读
  • 随着毕业设计的结束,我终于有时间更新我的博客了。这次,我将分享如何在自己的服务器上搭建 Bitwarden,一个广受好评的开源密码管理工具。 ... [详细]
  • Node.js 入门指南(一)
    本文介绍了Node.js的安装步骤、如何创建第一个应用程序、NPM的基本使用以及处理回调函数的方法。通过实际操作示例,帮助初学者快速掌握Node.js的基础知识。 ... [详细]
  • 本文介绍了如何在Ubuntu 16.04系统上配置Nginx服务器,以便能够通过网络访问存储在服务器上的图片资源。这解决了在网页开发中需要使用自定义在线图标的需求。 ... [详细]
  • 本文探讨了如何在Node.js环境中,通过Tor网络使用的SOCKS5代理执行HTTP请求。文中不仅提供了基础的实现方法,还介绍了几种常用的库和工具,帮助开发者解决遇到的问题。 ... [详细]
  • 本文探讨了浏览器的同源策略限制及其对 AJAX 请求的影响,并详细介绍了如何在 Spring Boot 应用中优雅地处理跨域请求,特别是当请求包含自定义 Headers 时的解决方案。 ... [详细]
  • Microsoft即将发布WPF/E的CTP(Community Technology Preview)和SDK,标志着RIA(Rich Internet Application)技术的新里程碑。更多详情及下载链接请参见MSDN官方页面。 ... [详细]
  • PHP调用Shell命令的多种方法及环境配置指南
    本文详细介绍了在PHP中调用Shell命令的不同方式及其应用场景,同时提供了在Ubuntu系统中配置PHP以支持Shell命令执行的具体步骤。此外,还涵盖了安装与配置Apache服务器及PHP环境的过程,以便于开发者能够顺利地在Web环境中执行Shell脚本。 ... [详细]
  • 本文详细探讨了在使用Python、uWSGI和nginx配置时遇到的权限问题,并提供了具体的解决方案。 ... [详细]
  • 本文探讨了在支付项目开发中使用SS5 Socket Server实现内部网络访问外部网络的技术方案。详细介绍了SS5的安装、配置及性能测试过程,旨在为面临相同需求的技术人员提供参考。 ... [详细]
  • JavaScript:简洁与复杂之间的平衡
    本文探讨了在编写JavaScript教程时,如何在保持内容简洁的同时,确保初学者能够理解并应用实际开发中的复杂问题。文章通过具体示例分析了不同层次的JavaScript代码实现。 ... [详细]
  • 本文将详细介绍如何在ThinkPHP6框架中实现多数据库的部署,包括读写分离的策略,以及如何通过负载均衡和MySQL同步技术优化数据库性能。 ... [详细]
  • 本文介绍了一个优化过的JavaScript函数,用于从API获取电影信息并渲染到网页上,同时注册Service Worker以提升用户体验和性能。 ... [详细]
  • 本文将介绍如何利用Python爬虫技术抓取国内主流在线学习平台的数据,并以51CTO学院为例,进行详细的技术解析和实践操作。 ... [详细]
  • 本文档详细介绍了Scrapy框架中的信号系统,包括如何利用信号来增强爬虫的功能性和灵活性,以及各个内置信号的具体用途和参数。 ... [详细]
  • 探索Squid反向代理中的远程代码执行漏洞
    本文深入探讨了在网站渗透测试过程中发现的Squid反向代理系统中存在的远程代码执行漏洞,旨在帮助网站管理者和开发者了解此类漏洞的危害及防范措施。 ... [详细]
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社区 版权所有