首页
下载
文档
社区
视频
捐赠
源代码
赞助商
AOT 编译器
AI 助理
商业产品
PHP AOT 原生编译器
Swoole-Compiler 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
Coroutine::exec 执行的脚本获取不到全局 Context 数据问题
### 问题描述 使用 `Swoole\Coroutine\System::exec()` 执行另外一个 PHP 脚本,执行的 PHP 脚本里面如何获取 Context 数据? 我看了 https://wenda.swoole.com/detail?id=107188 的方法,然后参考了 https://wiki.swoole.com/wiki/version/?id=865 用 Context 的实现方法。 但是 `Swoole\Coroutine\System::exec()` 执行的脚本内部获取不了 Context 内容。 ### Swoole版本,PHP版本,以及操作系统版本信息 - Swoole 4.5.1 - PHP 7.4.1 - Debian 9 ### 相关代码 ##### 启动一个 `Swoole\Http\Server` 服务器: ```php $http->on('request', function ($request, $response) { // 这里 Context 类为上面描述中链接里面的 demo 类 Context::put('request-id', $request->header['request-id']); // 我执行 other.php 文件 Swoole\Coroutine\System::exec('php other.php'); } ``` ##### other.php 文件内容如下: ```php // 文件内用 Context 获取不到数据,Coroutine::getuid 获取到 -1 Context::get('request-id'); ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? other.php 里面可以获取到 Context 内容($request 中的 header 的某个值的内容) 实际上获取不到数据,UID 为 -1 刚开始用 Swoole,描述如有不准确我再回复补充,谢谢!
发布于6年前 · 1 次浏览 · 来自
提问
PKCS
### 问题描述 使用 `Swoole\Coroutine\System::exec()` 执行另外一个 PHP 脚本,执行的 PHP 脚本里面如何获取 Context 数据? 我看了 https://wenda.swoole.com/detail?id=107188 的方法,然后参考了 https://wiki.swoole.com/wiki/version/?id=865 用 Context 的实现方法。 但是 `Swoole\Coroutine\System::exec()` 执行的脚本内部获取不了 Context 内容。 ### Swoole版本,PHP版本,以及操作系统版本信息 - Swoole 4.5.1 - PHP 7.4.1 - Debian 9 ### 相关代码 ##### 启动一个 `Swoole\Http\Server` 服务器: ```php $http->on('request', function ($request, $response) { // 这里 Context 类为上面描述中链接里面的 demo 类 Context::put('request-id', $request->header['request-id']); // 我执行 other.php 文件 Swoole\Coroutine\System::exec('php other.php'); } ``` ##### other.php 文件内容如下: ```php // 文件内用 Context 获取不到数据,Coroutine::getuid 获取到 -1 Context::get('request-id'); ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? other.php 里面可以获取到 Context 内容($request 中的 header 的某个值的内容) 实际上获取不到数据,UID 为 -1 刚开始用 Swoole,描述如有不准确我再回复补充,谢谢!
赞
0
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
登录
后参与评论
评论
2020-05-20
Rango
通过`exec`的参数传给子进程,或者使用`proc_open`然后管道通信传递数据。
赞
1
回复
2020-05-20
PKCS
回复
Rango
如何传递参数呢?我看文档中只接收一个 $cmd 参数: `Swoole\Coroutine\System::exec(string $cmd): array;`
赞
0
回复
2020-05-20
鲁飞
回复
PKCS
这是PHP的知识了,可以使用`argv`或者`getopt()`
赞
0
回复
2020-05-20
鲁飞
exec会发生协程调度,但是这里other.php不是父子协程的关系,不能这么用。 ```php use Simps\Context; $http = new Swoole\Http\Server("0.0.0.0", 9501); $http->on('request', function ($request, $response) { Context::set('user-agent', $request->header['user-agent']); var_dump(Co::getCid()); go(function (){ $ret = Context::get('user-agent', null, Co::getPcid()); var_dump($ret); }); }); $http->start(); ``` 你要用exec执行文件并获取参数的话,可以作为command参数去传递
赞
0
回复
2020-05-23
PKCS
已解决,谢谢解答~
赞
0
回复