swoole 模块的加载

模块加载#

​ php 加载模块会统一调用 zm_startup_xxx(int type, int module_number) 函数(xxx 为模块名),在 swoole 源码中实际为 swoole.cc 的 PHP_MINIT_FUNCTION(swoole) 部分代码。

​ 在 PHP_MINIT_FUNCTION(swoole) 里主要是向 php 注册模块相关的内容,如类、函数、常量、别名。我们所需要关注的是 swoole_init(); 这个函数的调用。

void swoole_init(void)
{
    if (SwooleG.init)
    {
        return;
    }

    bzero(&SwooleG, sizeof(SwooleG));
    bzero(&SwooleWG, sizeof(SwooleWG));
    bzero(sw_error, SW_ERROR_MSG_SIZE);

    SwooleG.running = 1;
    SwooleG.init = 1;
    SwooleG.enable_coroutine = 1;

    SwooleG.log_fd = STDOUT_FILENO;
    SwooleG.write_log = swLog_put;
    SwooleG.fatal_error = swoole_fatal_error;

    SwooleG.cpu_num = SW_MAX(1, sysconf(_SC_NPROCESSORS_ONLN));
    SwooleG.pagesize = getpagesize();
    //get system uname
    uname(&SwooleG.uname);
    //random seed
    srandom(time(NULL));

    SwooleG.pid = getpid();

#ifdef SW_DEBUG
    SwooleG.log_level = 0;
    SwooleG.trace_flags = 0x7fffffff;
#else
    SwooleG.log_level = SW_LOG_INFO;
#endif

    //init global shared memory
    SwooleG.memory_pool = swMemoryGlobal_new(SW_GLOBAL_MEMORY_PAGESIZE, 1);
    if (SwooleG.memory_pool == NULL)
    {
        printf("[Core] Fatal Error: global memory allocation failure");
        exit(1);
    }

    if (swMutex_create(&SwooleG.lock, 0) < 0)
    {
        printf("[Core] mutex init failure");
        exit(1);
    }

    SwooleG.max_sockets = 1024;
    struct rlimit rlmt;
    if (getrlimit(RLIMIT_NOFILE, &rlmt) < 0)
    {
        swSysWarn("getrlimit() failed");
    }
    else
    {
        SwooleG.max_sockets = MAX((uint32_t) rlmt.rlim_cur, 1024);
        SwooleG.max_sockets = MIN((uint32_t) rlmt.rlim_cur, SW_SESSION_LIST_SIZE);
    }

    SwooleG.socket_buffer_size = SW_SOCKET_BUFFER_SIZE;
    SwooleG.socket_array = swArray_new(1024, sizeof(swSocket));
    if (!SwooleG.socket_array)
    {
        swSysWarn("[Core] Fatal Error: socekt array memory allocation failure");
        exit(1);
    }

    SwooleTG.buffer_stack = swString_new(SW_STACK_BUFFER_SIZE);
    if (SwooleTG.buffer_stack == NULL)
    {
        exit(3);
    }

    if (!SwooleG.task_tmpdir)
    {
        SwooleG.task_tmpdir = sw_strndup(SW_TASK_TMP_FILE, sizeof(SW_TASK_TMP_FILE));
        SwooleG.task_tmpdir_len = sizeof(SW_TASK_TMP_FILE);
    }

    char *tmp_dir = swoole_dirname(SwooleG.task_tmpdir);
    //create tmp dir
    if (access(tmp_dir, R_OK) < 0 && swoole_mkdir_recursive(tmp_dir) < 0)
    {
        swWarn("create task tmp dir(%s) failed", tmp_dir);
    }
    if (tmp_dir)
    {
        sw_free(tmp_dir);
    }

    //init signalfd
#ifdef HAVE_SIGNALFD
    swSignalfd_init();
    SwooleG.use_signalfd = 1;
    SwooleG.enable_signalfd = 1;
#endif
}

swoole_init() 中主要是对 SwooleG 做一个初始化的赋值操作。SwooleG 是一个本地的全局变量,记录的 swoole 的基础信息,具体可搜索 swGlobal_t。重点的初始化包括共享内存、锁、信号。接下来会依次讲解它们相关的概念以及运行过程。

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。