php-cp启动过程分析

一、pool_server_create('/etc/pool.ini')
1.1 判断sapi_module.name是否等于'cli',如果不等于直接退出,因为本程序只能运行在命令行模式下.
1.2 将入参'/etc/pool.ini'保存在char *config_file里.
1.3 cpGetConfig('/etc/pool.ini'),通过call_user_function_ex(),调用PHP函数parse_ini_file(),解析配置文件.

二、cpServer_init(zval array *conf, '/etc/pool.ini')
2.1 struct CPGC是保存配置的结构,为它填充默认值.
2.2 cpListen()函数,创建socket连接,并将其bind在127.0.0.1:CPGC.port.
2.3 cp_create_mmap_dir()函数,umask(0)相当于chmod 777,不锁定文件;mkdir('/var/run/cp/', 0777),创建了一个目录以备后用.
2.4 typedef struct _cpShareMemory {
        int size;                //sizeof(cpServerGS)
        char mmap_name[100];    //var/run/cp/cp_server_mmap_file
        void *mem;                //2.6会赋予地址
    } cpShareMemory;
2.5 open(cpShareMemory->mmap_name, O_RDWR | O_CREAT, 0777)来创建一个文件.
2.6 cp_mmap_calloc_with_file(cpShareMemory),主要分两步:open(cpShareMemory->mmap_name, O_RDWR)先打开文件,获得fd;mmap(NULL, cpShareMemory->size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)将该文件映射到内存,并且声明此内存是共享的.
2.7 处理配置文件array.
2.8 创建线程锁.

三、cpServer_create()
3.1 cpLog_init('/tmp/php_cp_err.log');两步操作,第一步打开文件获得fd,第二部setvbuf设置fd的缓冲区位置和大小.
3.2 cp_mmap_calloc(),通过mmap+MAP_SHARED+MAP_ANONYMOUS,创建一段共享的不映射文件的内存区域.并将地址赋予CPGS->reactor_threads.
3.3 同上创建一段内存区域,并将地址赋予CPGS->ping_workers.
3.4 CPGS->running = 1

四、cpServer_start(sock)
4.1 daemon(0, 0)来实现守护进程.当nochdir为0时,当前目录变为根目录;当noclose为零时,标准输入、标准输出和错误输出重导向为/dev/null,也就是不输出任何信息.
4.2 CPGS->master_pid = getpid().
4.3 初始进程是master,fork了一个manager,(理论上manager应该fork一堆worker,然而没有)
4.4 cpWorker_manager_loop(),设置了一堆信号量handler,然后用wait()函数阻塞自己,监视子进程有没有挂掉.
4.5 cpReactor_start(sock),reactor是master的继续,共3步,第一步,将master pid写入/var/run/php_connection_pool.pid;第二步,开一个新线程执行cpReactor_thread_loop();第三步,用epoll方式,监听2.2步产生的socket端口,如果有连接进来,触发cpServer_master_onAccept().
4.6 cpReactor_thread_loop(),会通过epoll的方式触发cpReactor_client_receive,cpReactor_client_release,cpReactor_client_close三个函数.
4.7 cpServer_master_onAccept(),会通过epoll add的方式继续监控新的连接.

转载于:https://my.oschina.net/u/3474060/blog/1537367

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值