Mix-PHP-V2-实例AliCloud-短信协程池异步发送守护程序

前些时间我们发布了 Mix PHP V2 实例:协程池异步邮件发送守护程序 范例,这一次我们提供一个使用大厂 SDK 通过 Swoole Hook 协程化来并行执行短信发生任务,本文是一个代码简单、IO性能极其强大的范例。 请先升级到 mix-framework >= v2.0.5。本范例依然使用消息队列的方式接收短信发送任务,消息中间件使用: redis生产者通常框架中使用 Redis 会安装一个类库来使用,本例使用原生代码,便于理解。// 连接$redis = new \Redis();if (!$redis->connect('127.0.0.1', 6379)) { throw new \Exception('Redis connect failed.');}$redis->auth('');$redis->select(0);// 投递任务for($i = 0; $i < 3; $i++){ $data = [ 'phone' => '***', 'templateCode' => 'SMS_***', 'templateParam' => ['code' => 123456], ]; $redis->lpush('queue:sms', serialize($data));}消费者使用的是 ali 云的短信服务,查看官方 PHP SDK 文档 ,使用的库为: composer require alibabacloud/client通过查看该库的 composer 依赖文件,我们得知该库基于 guzzlehttp 开发,因为 Mix PHP 提供了无需修改代码就可 Hook Guzzle 库可在协程中使用的工具 Mix PHP V2 生态:让 Guzzle 支持 Swoole 的 Hook 协程,所以能基本确定该库可在 Swoole 协程中使用。 ...

May 24, 2019 · 3 min · jiezi

Mix-PHP-V2-生态让-Guzzle-支持-Swoole-的-Hook-协程

Guzzle 是一个非常流行的 PHP 的 HTTP 客户端,现在各大厂的 SDK 也都开始基于 Guzzle 开发,因为 Swoole 只支持 PHP Stream 的协程 Hook ,而 Guzzle 默认是使用 cURL 扩展的,所以 Mix PHP 开发了 Guzzle Hook,能在不修改源码的情况下让 Guzzle 协程化。 Githubhttps://github.com/mix-php/guzzle-hook安装使用 Composer 安装: composer require mix/guzzle-hook在项目的 composer.json 文件中增加 extra 配置项,如下: "extra": { "include_files": [ "vendor/mix/guzzle-hook/src/functions_include.php" ]}使用直接使用 Guzzle 开发无需做任何特殊的代码处理,直接根据 Guzzle 文档使用: // Mix PHP 中是 xgo ,原生 swoole 是 gogo(function () { $client = new GuzzleHttp\Client(); $res = $client->request('GET', 'https://api.github.com/user', [ 'auth' => ['user', 'pass'], ]); echo $res->getStatusCode();});第三方 SDK 依赖 Guzzle比如: ...

May 6, 2019 · 1 min · jiezi

【项目推荐】Guzzle - 简单易用的 PHP HTTP 客户端

Guzzle 介绍Guzzle 是一款简单、易用的 PHP HTTP 客户端。它可以快速的集成到 WEB 项目中,帮助我们非常方便的发送 HTTP 请求。Guzzle 特点接口简单支持使用 curl,PHP streams,sockets等各种方式。支持同步和异步请求遵循 PSR7 规范,可以集成其他的符合 psr7 规范的类库,自定义处理逻辑安装使用 composer 安装,非常方便composer require –prefer-dist guzzlehttp/guzzle快速入门1.初始化客户端use GuzzleHttp\Client;options = [ ‘base_uri’ => ‘http://guzzle.testhttp.com’, ‘connect_timeout’ => 1, ’timeout’ => 3,];$client = new Client($options);2.发送body请求$client->request(‘POST’, ‘/post’, [‘body’ => ’this is post body’]);3.发送表单请求$client->request(‘POST’, ‘/post’, [ ‘form_params’ => [ ‘user_id’ => 1, ‘user_name’ => ‘hello world!’ ]]);4.json 请求$client->request(‘POST’, ‘/post’, [‘json’ => [‘data’ => ‘hello world!’]]);5.使用cookie$params = [‘json’ => [‘data’ => ‘hello world!’]];$cookieJar = CookieJar::fromArray([‘cookieName’ => ’testCookie’], ‘guzzle.testhttp.com’);$param[‘cookies’] = $cookieJar;$client->request(‘POST’, ‘/post’, $params);6.multipart$client->request(‘POST’, ‘/post’, [ ‘multipart’ => [ [ ’name’ => ‘baz’, ‘contents’ => fopen(’/path/to/file’, ‘r’) ], [ ’name’ => ‘qux’, ‘contents’ => fopen(’/path/to/file’, ‘r’), ‘filename’ => ‘custom_filename.txt’ ], ]]);7.异步请求use Psr\Http\Message\ResponseInterface;use GuzzleHttp\Exception\RequestException;$promise = $client->requestAsync(‘POST’, ‘/post’, [‘json’ => [‘data’ => ‘hello world!’]]);$promise->then( function (ResponseInterface $res) { echo $res->getStatusCode() . “\n”; }, function (RequestException $e) { echo $e->getMessage() . “\n”; echo $e->getRequest()->getMethod(); });8.并发请求use GuzzleHttp\Client;use GuzzleHttp\Promise;$client = new Client([‘base_uri’ => ‘http://guzzle.testhttp.com/’]);// Initiate each request but do not block$promises = [ ‘a’ => $client->requestAsync(‘POST’, ‘/post’, [‘json’ => [‘data’ => ‘hello test1!’]]), ‘b’ => $client->requestAsync(‘POST’, ‘/post’, [‘json’ => [‘data’ => ‘hello test2!’]]), ‘b’ => $client->requestAsync(‘POST’, ‘/post’, [‘json’ => [‘data’ => ‘hello test3!’]]),];// Wait on all of the requests to complete.$results = Promise\unwrap($promises);// You can access each result using the key provided to the unwrap// function.echo $results[‘a’]->getBody()->getContents(); // body 也有实现 __toString()调用getContents() echo $results[‘b’]->getHeader(‘Content-Length’);附录项目地址官方文档中文文档 ...

April 16, 2019 · 2 min · jiezi