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 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

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