底层Http类无法解析请求数据

多多

为什么创建一个http服务,向游览器发送数据,打包tcp服务为http过程中,为什么我在Http类,打印任何方法都不能断点。这里和缓冲有什么关系吗?

2850 5 0
5个回答

blogdaren

肯定可以var_dump之类的打印,但是绝对不要 die 或 exit 断点调试.

  • 多多 2018-12-10

    没有die,但是就是打印不出来,换了ws也不行,

  • blogdaren 2018-12-10

    加了调试代码后,重启服务了吗?

  • 多多 2018-12-10

    @614:重启了呢

多多

[attach]1482[/attach]

[attach]1483[/attach]

[attach]1484[/attach]

[attach]1485[/attach]
 

  • blogdaren 2018-12-10

    看不到你完整代码,你第一张图那段代码貌似是裸tcp在通信吧,如果是的话那肯定打印不出来,因为encode那个方法是websocket应用层协议的封装实现。

  • 多多 2018-12-10

    大佬啥叫裸tcp协议,我服务端是这种$tcp_worker = new Worker("websocket://192.168.0.111:2348"); 前台是 ws = new WebSocket("ws://192.168.0.111:2348");

  • 多多 2018-12-10

    @614:郁闷了,怎么试都不行

  • 多多 2018-12-10

    @614:开的是虚拟机

  • blogdaren 2018-12-10

    1、你用的 new Worker("websocket://192.168.0.111:2348"); 那就是启动是 websocket 服务,你贴这句代码之前,我是根据你变量名猜测的。
    2、至于啥是裸tcp协议启动,就是指直接这样启动 new Worker("tcp://192.168.0.111:2348");

  • blogdaren 2018-12-10

    1、绝对可以打印的,我经常这样debug呢,也没见你说的问题啊,肯定是有哪里细节没注意到。
    2、对于websocket这样的应用层协议,调用$connection->send($data, $raw = false)方法, 在 $raw == false的情况下,统统都是要路由到对应应用层协议的 encode()方法的
    3、实在不行,你逐步的老办法调试打印。

  • 多多 2018-12-10

    @614:大佬是不是自动加载问题,我还是不行,方法都进不去

  • 多多 2018-12-10

    @614:真的好奇怪

多多

[attach]1492[/attach]

[attach]1491[/attach]

[attach]1493[/attach]
 

  • blogdaren 2018-12-10

    还不好使吗?方便的话,你保留调试代码然后整体打个包,我运行下看~~

  • 多多 2018-12-10

    @614:我传了

多多

11

  • 暂无评论
blogdaren
 37     public static function input($recv_buffer, TcpConnection $connection)
 38     {
 39         var_dump(4234);die;                                                                                                                     
 40         if (!strpos($recv_buffer, "\r\n\r\n")) {
 41             // Judge whether the package length exceeds the limit.
 42             if (strlen($recv_buffer) >= $connection->maxPackageSize) {
 43                 $connection->close();
 44                 return 0;
 45             }
 46             return 0;
 47         }

1、一开始就给你说了,禁止在代码里die 或者  exit , 你说你第39行代码那是啥。
2、去掉 die 之后,任意var_dump 一切正常。

  • 多多 2018-12-10

    额,可我去掉encode方法里面还是没有数据啊?

  • 多多 2018-12-10

    public static function encode($content, TcpConnection $connection)
    {

        var_dump(2222222).PHP_EOL;
        // Default http-code.
  • blogdaren 2018-12-10

    你咋玩的啊? 我拿你的代码跑的,去掉那个die后,一点问题都没有。

  • 多多 2018-12-10

    @614:我想用命令行打出上面那个字符,用curl获取游览器请求都进步到encode方法里面

  • blogdaren 2018-12-10

    提个建议:
    1、和 curl 没有什么关系,你启用了http服务,浏览器或者curl 作为不同的客户端,都能发送http请求,测试一样样。
    2、我最后能想到的就是你本地是不是开启了 opcache之类的加速模块,如果没有那基本可以断定就是你本地环境哪里还是有问题的,你给的代码我也帮你跑过了,没有什么问题。
    3、这个也真不是什么技术难题,你不用太过于纠结这个地方,建议你把同样的代码部署到另外一台机器泡一下,这也能很好的验证是不是部署环境的问题。
    4、无论怎样,我都可以非常肯定说:workerman内核里的任何一个脚本代码都是可以var_dump调试的,但是坚决禁止 die 或者 exit, 这是多进程编程模型的要求,不这么干进程就会退出,就会出现意想不到的结果。

年代过于久远,无法发表回答
🔝