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 协议》,转载必须注明作者和本文链接
大佬 学swoole源码
@_杭城浪子 主要是因为swoole文档看不懂 :neutral_face:
大佬,有点6