swoole 服务的构造函数

在swoole的构造函数中,主要做的事情就是申请内存,然后初始化默认的属性值,以及设置用户传递的值。

static PHP_METHOD(swoole_server, __construct)
{
    zval *zserv = ZEND_THIS;
    const char *host;
    size_t host_len = 0;
    zend_long sock_type = SW_SOCK_TCP;
    zend_long serv_port = 0;
    zend_long serv_mode = SW_MODE_PROCESS;

    //为server申请空间
    swServer *serv = (swServer *) sw_malloc(sizeof (swServer));
    //server初始化
    swServer_init(serv);
    //获取参数
   end_parse_parameters(ZEND_NUM_ARGS(), "s|lll", &host, &host_len, &serv_port, &serv_mode, &sock_type)

    //base模式下reacotr和work数量都只有一个。
    if (serv_mode == SW_MODE_BASE)
    {
        serv->reactor_num = 1;
        serv->worker_num = 1;
    }
    serv->factory_mode = serv_mode;
   //增加监听端口
   swListenPort *port = swServer_add_port(serv, (enum swSocket_type) sock_type, host, serv_port);
    //实例化
    zval connection_iterator_object;
    object_init_ex(&connection_iterator_object, swoole_connection_iterator_ce);
    //修改swServer的connctions属性为connection_iterator_object
    zend_update_property(swoole_server_ce, zserv, ZEND_STRL("connections"), &connection_iterator_object);
    zval_ptr_dtor(&connection_iterator_object);

    swConnectionIterator *i = (swConnectionIterator *) ecalloc(1, sizeof(swConnectionIterator));
    i->serv = serv;
    //将对象指针储存在swoole_objects.array里。
    swoole_set_object(&connection_iterator_object, i);
    //更新对象属性
    zend_update_property_stringl(swoole_server_ce, zserv, ZEND_STRL("host"), host, host_len);
    zend_update_property_long(swoole_server_ce, zserv, ZEND_STRL("port"), (long) serv->listen_list->port);
    zend_update_property_long(swoole_server_ce, zserv, ZEND_STRL("mode"), serv->factory_mode);
    zend_update_property_long(swoole_server_ce, zserv, ZEND_STRL("type"), sock_type);
    swoole_set_object(zserv, serv);

    zval *ports = sw_malloc_zval();
    array_init(ports);
    server_port_list.zports = ports;

#ifdef HT_ALLOW_COW_VIOLATION    
    HT_ALLOW_COW_VIOLATION(Z_ARRVAL_P(ports));
#endif

    swListenPort *ls;
    LL_FOREACH(serv->listen_list, ls)
    {
        //里面会实例化swoole_server_port_ce,将端口信息,swServer赋值给这个对象。
        php_swoole_server_add_port(serv, ls);
    }

    server_port_list.primary_port = (swoole_server_port_property *) serv->listen_list->ptr;

    zend_update_property(swoole_server_ce, zserv, ZEND_STRL("ports"), ports);
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 3

大佬 学swoole源码

4年前 评论

@_杭城浪子 主要是因为swoole文档看不懂 :neutral_face:

4年前 评论

大佬,有点6

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!