美文网首页我爱编程
一个简单swoole http server 生成的opcode

一个简单swoole http server 生成的opcode

作者: zhaoxianqiang | 来源:发表于2018-04-09 16:24 被阅读0次

    swoole http server 简单程序生成的opcode

    代码如下

    <?php
    $http = new swoole_http_server("0.0.0.0", 8080);
    $http->set(array(    
        'worker_num' => 1
    ));
    $http->on('request', function ($request, $response) {
        //var_dump($request->get, $request->post);
        $response->header("Connection: close","Content-Type", "text/html; charset=utf-8");
        $response->end("<h1>Hello Swoole. #".rand(1000, 9999)."</h1>");
    });
    $http->on('close', function ($serv, $fd) {
        echo "Client: Close{$fd}.\n";
    });
    $http->start();
    

    查看opcode

    php -dvld.active=1 swoole_http_server.php
    

    当然 dvld 扩展需要提前安装

    Finding entry points
    Branch analysis from position: 0
    Jump found. (Code = 62) Position 1 = -2
    filename:       /home/svn/php-traning/swoole_http_server.php
    function name:  (null)
    number of ops:  21
    compiled vars:  !0 = $http
    line     #* E I O op                           fetch          ext  return  operands
    -------------------------------------------------------------------------------------
       2     0  E >   NEW                                              $1      :-5                    //new swoole_http_server
             1        SEND_VAL_EX                                              '0.0.0.0'        //参数1
             2        SEND_VAL_EX                                              8080            //参数2
             3        DO_FCALL                                      0                                 //swoole_http_server类初始化?
             4        ASSIGN                                                   !0, $1                  // $http 赋值
       3     5        INIT_METHOD_CALL                                         !0, 'set'  //调用set 函数
       4     6        SEND_VAL_EX                                              <array>
             7        DO_FCALL                                      0
       6     8        INIT_METHOD_CALL                                         !0, 'on'
             9        SEND_VAL_EX                                              'request'
            10        DECLARE_LAMBDA_FUNCTION                                  '%00%7Bclosure%7D%2Fhome%2Fsvn%2Fphp-traning%2Fswoole_http_server.php0x7f162b299167'                    //匿名函数
      10    11        SEND_VAL_EX                                              ~5
            12        DO_FCALL                                      0
      11    13        INIT_METHOD_CALL                                         !0, 'on'
            14        SEND_VAL_EX                                              'close'
            15        DECLARE_LAMBDA_FUNCTION                                  '%00%7Bclosure%7D%2Fhome%2Fsvn%2Fphp-traning%2Fswoole_http_server.php0x7f162b2991b8'
      13    16        SEND_VAL_EX                                              ~7
            17        DO_FCALL                                      0
      14    18        INIT_METHOD_CALL                                         !0, 'start'
            19        DO_FCALL                                      0
      15    20      > RETURN                                                   1
    //下面是 http->on('request'  的匿名函数的opcode 
    branch: #  0; line:     2-   15; sop:     0; eop:    20; out1:  -2
    path #1: 0,
    Function %00%7Bclosure%7D%2Fhome%2Fsvn%2Fphp-traning%2Fswoole_http_server.php0x7f162b299167:
    Finding entry points
    Branch analysis from position: 0
    Jump found. (Code = 62) Position 1 = -2
    filename:       /home/svn/php-traning/swoole_http_server.php
    function name:  {closure}
    number of ops:  17
    compiled vars:  !0 = $request, !1 = $response
    line     #* E I O op                           fetch          ext  return  operands
    -------------------------------------------------------------------------------------
       6     0  E >   RECV                                             !0                          //接受参数 
             1        RECV                                             !1
       8     2        INIT_METHOD_CALL                                         !1, 'header'    
             3        SEND_VAL_EX                                              'Connection%3A+close'
             4        SEND_VAL_EX                                              'Content-Type'
             5        SEND_VAL_EX                                              'text%2Fhtml%3B+charset%3Dutf-8'
             6        DO_FCALL                                      0
       9     7        INIT_METHOD_CALL                                         !1, 'end'
             8        INIT_FCALL                                               'rand'          //调用 内部函数 rand
             9        SEND_VAL                                                 1000          //给rand 传递参数
            10        SEND_VAL                                                 9999          //给rand 传递参数
            11        DO_ICALL                                         $3
            12        CONCAT                                           ~4      '%3Ch1%3EHello+Swoole.+%23', $3
            13        CONCAT                                           ~5      ~4, '%3C%2Fh1%3E'
            14        SEND_VAL_EX                                              ~5
            15        DO_FCALL                                      0
      10    16      > RETURN                                                   null
    
    branch: #  0; line:     6-   10; sop:     0; eop:    16; out1:  -2
    path #1: 0,
    End of function %00%7Bclosure%7D%2Fhome%2Fsvn%2Fphp-traning%2Fswoole_http_server.php0x7f162b299167
    
    //下面是 $http->on('close'  的匿名函数的opcode
    Function %00%7Bclosure%7D%2Fhome%2Fsvn%2Fphp-traning%2Fswoole_http_server.php0x7f162b2991b8:
    Finding entry points
    Branch analysis from position: 0
    Jump found. (Code = 62) Position 1 = -2
    filename:       /home/svn/php-traning/swoole_http_server.php
    function name:  {closure}
    number of ops:  7
    compiled vars:  !0 = $serv, !1 = $fd
    line     #* E I O op                           fetch          ext  return  operands
    -------------------------------------------------------------------------------------
      11     0  E >   RECV                                             !0
             1        RECV                                             !1
      12     2        ROPE_INIT                                     3  ~3      'Client%3A+Close'   //ROPE_INIT指令在官网没有查到,类似字符串拼接
             3        ROPE_ADD                                      1  ~3      ~3, !1
             4        ROPE_END                                      2  ~2      ~3, '.%0A'
             5        ECHO                                                     ~2
      13     6      > RETURN                                                   null
    
    branch: #  0; line:    11-   13; sop:     0; eop:     6; out1:  -2
    path #1: 0,
    End of function %00%7Bclosure%7D%2Fhome%2Fsvn%2Fphp-traning%2Fswoole_http_server.php0x7f162b2991b8
    

    php版本:php7.2.2
    参照:http://php.net/manual/zh/internals2.opcodes.php

    相关文章

      网友评论

        本文标题:一个简单swoole http server 生成的opcode

        本文链接:https://www.haomeiwen.com/subject/cymihftx.html