首页
下载
文档
社区
视频
捐赠
源代码
赞助商
AOT 编译器
AI 助理
商业产品
PHP AOT 原生编译器
Swoole-Compiler 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
swoole 使用task 调用composer安装的阿里云短信sdk, 提示找不到函数
### 问题描述 使用swoole启动tp5.1之后,用composer安装了阿里的短信的sdk,并封装了一个类用来发短信。之后在tp5.1的控制器中使用swoole的task调用短信类,但是报缺少阿里sdk中的一个函数,但是如果我直接在控制器里面调用写短信的类,就不会报这个错,哪位大神能给小弟解释一下为什么,感激不尽 ### Swoole版本,PHP版本,以及操作系统版本信息 swoole4.5.2 php7.4.8 操作系统:manjaro ### 相关代码 ##### 控制器调用task ```php public function loginSms() { $phone = request()->get('phone', ''); if (!$phone) { return Util::response('FAIL', '请填写手机号', []); } $server = $_POST['http_server']; $data = [ 'action'=>'sendLoginSms', 'data' => [ 'phone' => $phone ] ]; $server->task($data); // (new Task())->sendLoginSms(['phone'=>'13200001234']); return Util::response('OK', '发送成功', []); } ``` ##### task调用的函数 ```php public function sendLoginSms($data) { $result = Sms::send($data['phone']); return $result; } ``` ##### send 方法 ```php public static function send(string $phone, string $content = ''):bool { $code = self::getNum();// 生成验证码 AlibabaCloud::accessKeyClient('<accessKeyId>', '<accessSecret>') ->regionId('cn-hangzhou') ->asDefaultClient(); try { $result = AlibabaCloud::rpc() ->product('Dysmsapi') // ->scheme('https') // https | http ->version('2017-05-25') ->action('SendSms') ->method('POST') ->host('dysmsapi.aliyuncs.com') ->options([ 'query' => [ 'RegionId' => "cn-hangzhou", 'PhoneNumbers' => $phone, 'SignName' => static::$signName, 'TemplateCode' => static::$templateCode, 'TemplateParam' => "{\"code\":".$code."}", // 模板参数 'SmsUpExtendCode' => "sss", 'OutId' => "sss", ], ]) ->request()->toArray(); if ($result['Message'] === 'OK') { RedisClient::getInstacne()->set(config('sms.prefix').$phone, $code); return true; } else { RedisClient::getInstacne()->set(config('sms.prefix').'13200001234', '123456'); print_r($result); return false; } } catch (ClientException $e) { throw new \Exception($e->getErrorMessage() . PHP_EOL); } catch (ServerException $e) { throw new \Exception($e->getErrorMessage() . PHP_EOL); } } ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? 错误信息:PHP Fatal error: Uncaught Error: Call to undefined function AlibabaCloud\Client\envNotEmpty() in /d/www/tp5.1/vendor/alibabacloud/client/src/Credentials/Providers/CredentialsProvider.php:149
发布于6年前 · 2 次浏览 · 来自
提问
wmingren
### 问题描述 使用swoole启动tp5.1之后,用composer安装了阿里的短信的sdk,并封装了一个类用来发短信。之后在tp5.1的控制器中使用swoole的task调用短信类,但是报缺少阿里sdk中的一个函数,但是如果我直接在控制器里面调用写短信的类,就不会报这个错,哪位大神能给小弟解释一下为什么,感激不尽 ### Swoole版本,PHP版本,以及操作系统版本信息 swoole4.5.2 php7.4.8 操作系统:manjaro ### 相关代码 ##### 控制器调用task ```php public function loginSms() { $phone = request()->get('phone', ''); if (!$phone) { return Util::response('FAIL', '请填写手机号', []); } $server = $_POST['http_server']; $data = [ 'action'=>'sendLoginSms', 'data' => [ 'phone' => $phone ] ]; $server->task($data); // (new Task())->sendLoginSms(['phone'=>'13200001234']); return Util::response('OK', '发送成功', []); } ``` ##### task调用的函数 ```php public function sendLoginSms($data) { $result = Sms::send($data['phone']); return $result; } ``` ##### send 方法 ```php public static function send(string $phone, string $content = ''):bool { $code = self::getNum();// 生成验证码 AlibabaCloud::accessKeyClient('<accessKeyId>', '<accessSecret>') ->regionId('cn-hangzhou') ->asDefaultClient(); try { $result = AlibabaCloud::rpc() ->product('Dysmsapi') // ->scheme('https') // https | http ->version('2017-05-25') ->action('SendSms') ->method('POST') ->host('dysmsapi.aliyuncs.com') ->options([ 'query' => [ 'RegionId' => "cn-hangzhou", 'PhoneNumbers' => $phone, 'SignName' => static::$signName, 'TemplateCode' => static::$templateCode, 'TemplateParam' => "{\"code\":".$code."}", // 模板参数 'SmsUpExtendCode' => "sss", 'OutId' => "sss", ], ]) ->request()->toArray(); if ($result['Message'] === 'OK') { RedisClient::getInstacne()->set(config('sms.prefix').$phone, $code); return true; } else { RedisClient::getInstacne()->set(config('sms.prefix').'13200001234', '123456'); print_r($result); return false; } } catch (ClientException $e) { throw new \Exception($e->getErrorMessage() . PHP_EOL); } catch (ServerException $e) { throw new \Exception($e->getErrorMessage() . PHP_EOL); } } ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? 错误信息:PHP Fatal error: Uncaught Error: Call to undefined function AlibabaCloud\Client\envNotEmpty() in /d/www/tp5.1/vendor/alibabacloud/client/src/Credentials/Providers/CredentialsProvider.php:149
赞
0
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
登录
后参与评论
评论
2020-07-29
wmingren
而且我在task之前打印get_declared_functions()是有这个函数的,task里面打印发现只剩下系统函数了,tp里面的函数也都没有了
赞
0
回复
2020-07-29
鲁飞
``` $server = $_POST['http_server']; ``` 你这什么写法? 错误信息是类库里的方法不存在,自己检查下吧。
赞
0
回复
2020-07-29
wmingren
回复
鲁飞
这个是我为了在Tp5的控制器里能够用task,把$http放进$_POST里面了。类肯定存在的,我在Tp5的控制器里调用就有,但是用task异步调用就报这个错了
赞
0
回复