提交 04080375 编写于 作者: C codinghuang

新增协程创建(三)

上级 846aca23
......@@ -20,3 +20,5 @@ PHP版本:7.3.5
[7、协程创建(二)](./docs/《PHP扩展开发》-协程-协程创建(二).md)
[8、协程创建(三)](./docs/《PHP扩展开发》-协程-协程创建(三).md)
......@@ -289,4 +289,5 @@ success!
OK,到这里,我们算是完成了协程创建接口的前期工作。
[下一篇:协程创建(二)](./《PHP扩展开发》-协程-协程创建(二).md)
\ No newline at end of file
[下一篇:协程创建(二)](./《PHP扩展开发》-协程-协程创建(二).md)
# 协程创建(三)
[上一篇文章](./《PHP扩展开发》-协程-协程创建(二).md),我们成功的实现了**把一个用户空间的函数传递给创建协程的接口**的功能。这一篇文章,我们来介绍一下如何去调用这个用户空间的函数。
我们实现的接口现在变成了:
```c++
PHP_METHOD(study_coroutine_util, create)
{
zend_fcall_info fci = empty_fcall_info;
zend_fcall_info_cache fcc = empty_fcall_info_cache;
zval result;
ZEND_PARSE_PARAMETERS_START(1, 1)
Z_PARAM_FUNC(fci, fcc)
ZEND_PARSE_PARAMETERS_END_EX(RETURN_FALSE);
fci.retval = &result;
if (zend_call_function(&fci, &fcc) != SUCCESS) {
return;
}
*return_value = result;
}
```
`PHP`脚本如下:
```PHP
<?php
Study\Coroutine::create(function() {
echo "success\n";
});
```
执行后,结果如下:
```shell
~/codeDir/cppCode/study # php test.php
success
~/codeDir/cppCode/study #
```
ok,执行成功了。所以,我们这里的核心就是`zend_fcall_info``zend_fcall_info_cache``zend_call_function`。下篇文章将会介绍这三个东西。
......@@ -246,5 +246,5 @@ Study\Coroutine::create(function() {
没报错,参数解析成功。
[下一篇:协程创建(三)](./《PHP扩展开发》-协程-协程创建(三).md)
......@@ -10,10 +10,18 @@ PHP_METHOD(study_coroutine_util, create)
{
zend_fcall_info fci = empty_fcall_info;
zend_fcall_info_cache fcc = empty_fcall_info_cache;
zval result;
ZEND_PARSE_PARAMETERS_START(1, 1)
Z_PARAM_FUNC(fci, fcc)
ZEND_PARSE_PARAMETERS_END_EX(RETURN_FALSE);
fci.retval = &result;
if (zend_call_function(&fci, &fcc) != SUCCESS) {
return;
}
*return_value = result;
}
static const zend_function_entry study_coroutine_util_methods[] =
......
<?php
Study\Coroutine::create(function() {
echo 1;
echo "success\n";
});
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册