php的异步http客户端实现
2017-06-10 00:00
211 查看
php的异步http客户端实现
我们经常需要实现php的异步http客户端php-fpm一般为同步执行。 那么我们怎样实现php的异步http客户端呢
常见的php异步客户端有两种实现
1,ReactPHP
2,swoole
以上两种php的异步http客户端解决方案均使用了事件驱动,异步执行,非阻塞IO
什么是事件驱动?所谓事件驱动,简单的说就是,你告诉我你关注什么事情,等事情发生的时候我会主动通知你,然后你再作相应的处理。这样可以就可以把你解放出来,你只关注于处理好相应事件即可。采用事件驱动有什么优势呢?相对于常见的多进程编程,能更好的利用CPU资源。
ReactPHP
发送get请求的demo<?php use React\HttpClient\Client; use React\HttpClient\Response; require __DIR__ . '/../vendor/autoload.php'; $loop = React\EventLoop\Factory::create(); $client = new React\HttpClient\Client($loop); $request = $client->request('GET', 'https://github.com/'); $request->on('response', function ($response) { $response->on('data', function ($data, $response) { // ... }); }); $request->end(); $loop->run();
发送post请求的demo
<?php use React\HttpClient\Client; use React\HttpClient\Response; require __DIR__ . '/../vendor/autoload.php'; $loop = React\EventLoop\Factory::create(); $client = new Client($loop); $data = json_encode(array('result' => 42)); $request = $client->request('POST', 'https://httpbin.org/post', array( 'Content-Type' => 'application/json', 'Content-Length' => strlen($data) )); $request->on('response', function (Response $response) { var_dump($response->getHeaders()); $response->on('data', function ($chunk) { echo $chunk; }); $response->on('end', function () { echo 'DONE' . PHP_EOL; }); }); $request->end($data); $loop->run();
swoole
发送get请求的demoSwoole\Async::dnsLookup("www.baidu.com", function ($domainName, $ip) { $cli = new swoole_http_client($ip, 80); $cli->setHeaders([ 'Host' => $domainName, "User-Agent" => 'Chrome/49.0.2587.3', 'Accept' => 'text/html,application/xhtml+xml,application/xml', 'Accept-Encoding' => 'gzip', ]); $cli->get('/index.html', function ($cli) { echo "Length: " . strlen($cli->body) . "\n"; echo $cli->body; }); });
发送post请求的demo
<?php $cli = new swoole_http_client('127.0.0.1', 80); $cli->post('/post.php', array("a" => '1234', 'b' => '456'), function ($cli) { echo "Length: " . strlen($cli->body) . "\n"; echo $cli->body; });
ReactPHP的安装方法
composer require react/http-client:^0.5
安装成功后,会在当前目录下生成一个vendor目录。下载的程序就在这个目录下。现在你就可以使用
ReactPHP写程序了
由于是纯php开发,所以部署难度和开发难度都较小
Swoole的安装方法
Swoole虽然是标准的PHP扩展,实际上与普通的扩展不同。普通的扩展只是提供一个库函数。而swoole扩展在运行后会接管PHP的控制权,进入事件循环。当IO事件发生后,swoole会自动回调指定的PHP函数。swoole项目已收录到PHP官方扩展库,可以通过PHP官方提供的pecl命令,一键下载安装swoole
pecl install swoole
通过php -m或phpinfo()来查看是否成功加载了swoole,如果没有可能是php.ini的路径不对,可以使用
php -i |grep php.ini来定位到php.ini的绝对路径。
官方文档:
swoole:https://wiki.swoole.com/wiki/page/p-http_client.html
reactphp:http://reactphp.org/http-client/
git托管地址:
swoole:https://github.com/swoole/swoole-src
reactphp:https://github.com/reactphp/http-client
相关文章推荐
- php 异步websocket客户端实现
- 实现支持文件分块多点异步上传的 Web Services 及其客户端(非Web)应用程序调用相关异步执行的 Web Method
- .Net/C#: 实现支持断点续传多线程下载的 Http Web 客户端工具类 (C# DIY HttpWebClient)
- .Net/C#: 实现支持断点续传多线程下载的 Http Web 客户端工具类
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(4):异步通讯层生成的客户端代理类、使用HTTP GET进行调用
- 用C语言实现一个简单的HTTP客户端(HTTP Client)
- 使用tar实现压缩与解压缩(原文在:http://dash.945.cn/article.php/79)
- PHP实现客户端将CSV文件导入服务器数据库中
- .Net/C#: 实现支持断点续传多线程下载的 Http Web 客户端工具类 (第2版) (C# DIY HttpWebClient)
- 实现支持断点续传多线程下载的 Http Web 客户端工具类
- asp.net 实现支持断点续传多线程下载的 Http Web 客户端工具类
- .Net/C#: 实现支持断点续传多线程下载的 Http Web 客户端工具类 (C# DIY HttpWebClient)
- 实现支持断点续传多线程下载的 Http Web 客户端工具类()
- .Net/C#: 实现支持断点续传多线程下载的 Http Web 客户端工具类 (C# DIY HttpWebClient)
- /* .Net/C#: 实现支持断点续传多线程下载的 Http Web 客户端工具类【转】
- 基于NIO实现客户端通过HTTP协议访问WEB站点
- 通过php实现支持断点续传的http proxy
- .Net/C#: 实现支持断点续传多线程下载的 Http Web 客户端工具类 (第2版) (C# DIY HttpWebClient) 收藏
- Net/C#: 实现支持断点续传多线程下载的 Http Web 客户端工具类 (转,尚未整理)
- .Net/C#: 实现支持断点续传多线程下载的 Http Web 客户端工具类 (第2版) (C# DIY HttpWebClient)