Skip to content

Latest commit

 

History

History
119 lines (86 loc) · 2.72 KB

《PHP扩展开发》-协程-sleep(一).md

File metadata and controls

119 lines (86 loc) · 2.72 KB

sleep(一)

这篇文章,我们来实现一下我们协程的sleep接口。在文件study_coroutine_util.cc中,我们先定义一下我们的接口参数:

ZEND_BEGIN_ARG_INFO_EX(arginfo_study_coroutine_sleep, 0, 0, 1)
    ZEND_ARG_INFO(0, seconds)
ZEND_END_ARG_INFO()

根据命名我们知道,我们希望这个sleep接口接收的单位是秒。(但是我们可以定时的精度是毫秒级别的,即可以传入0.1这样的参数)

然后我们实现一下我们的接口:

PHP_METHOD(study_coroutine_util, sleep)
{
    double seconds;
    
    ZEND_PARSE_PARAMETERS_START(1, 1)
        Z_PARAM_DOUBLE(seconds)
    ZEND_PARSE_PARAMETERS_END_EX(RETURN_FALSE);

    if (UNEXPECTED(seconds < 0.001))
    {
        php_error_docref(NULL, E_WARNING, "Timer must be greater than or equal to 0.001");
        RETURN_FALSE;
    }

    PHPCoroutine::sleep(seconds);
    RETURN_TRUE;
}

其中

if (UNEXPECTED(seconds < 0.001))
{
    php_error_docref(NULL, E_WARNING, "Timer must be greater than or equal to 0.001");
  	RETURN_FALSE;
}

就是说,我们定时的最小时间不可以小于0.001。(注意,在编程的过程中,尽可能的不要使用诸如0.001这样的魔数,一般,我们会定义一个宏,来替换掉0.001

然后,我们调用

PHPCoroutine::sleep(seconds);

接着,我们在study_coroutine.h文件里面的类PHPCoroutine里面声明一下这个方法:

public:
    static int sleep(double seconds);

然后,我们在study_coroutine.cc里面进行实现:

int PHPCoroutine::sleep(double seconds)
{
    std::cout << seconds << endl;
    return 0;
}

目前,我们只是简单的输出PHP脚本传递过来的参数。

实现协程的sleep

定义完了sleep接口之后,我们需要注册一下:

static const zend_function_entry study_coroutine_util_methods[] =
{
// 省略了其他之前注册的方法
    PHP_ME(study_coroutine_util, sleep, arginfo_study_coroutine_sleep, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
    PHP_FE_END
};

然后,我们重新编译、安装扩展:

~/codeDir/cppCode/study # make clean && make && make install

然后编写测试脚本:

<?php

SCo::sleep(1);
SCo::sleep(0.1);
SCo::sleep(0.001);
SCo::sleep(0.0001);

执行结果如下:

~/codeDir/cppCode/study # php test.php 
1
0.1
0.001

Warning: Study\Coroutine::sleep(): Timer must be greater than or equal to 0.001 in /root/codeDir/cppCode/study/test.php on line 6
~/codeDir/cppCode/study # 

OK,测试成功。

接下来的文章,我将会继续带着大家去实现PHPCoroutine::sleep

下一篇:sleep(二)