您的位置:首页 > 理论基础 > 计算机网络

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请求的demo

Swoole\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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  swoole reactphp http
相关文章推荐