Giter Site home page Giter Site logo

yurunsoft / yurunhttp Goto Github PK

View Code? Open in Web Editor NEW
254.0 13.0 56.0 553 KB

YurunHttp 是开源的 PHP HTTP 客户端,支持链式操作,简单易用。完美支持Curl、Swoole 协程。QQ群:17916227

License: MIT License

PHP 99.60% Shell 0.40%
php httplib httpclient swoole-http coroutine swoole curl guzzle

yurunhttp's Introduction

YurunHttp

Latest Version GitHub Workflow Status (branch) Php Version IMI Doc IMI License

简介

YurunHttp,支持智能识别 Curl/Swoole 场景的高性能 Http Client。

支持链式操作,简单易用。支持并发批量请求、HTTP2、WebSocket 全双工通信协议。

非常适合用于开发通用 SDK 包,不必再为 Swoole 协程兼容而头疼!

YurunHttp 的目标是做最好用的 PHP HTTP Client 开发包!

特性

  • GET/POST/PUT/DELETE/UPDATE 等请求方式
  • 浏览器级别 Cookies 管理
  • 上传及下载
  • 请求头和响应头
  • 失败重试
  • 自动重定向
  • HTTP 代理方式请求
  • SSL 证书(HTTPS)
  • 并发批量请求
  • HTTP2
  • WebSocket
  • Curl & Swoole 环境智能兼容
  • 连接池

开发手册文档:https://doc.yurunsoft.com/YurunHttp

API 文档:https://apidoc.gitee.com/yurunsoft/YurunHttp

欢迎各位加入技术支持群17916227点击加群,如有问题可以及时解答和修复。

更加欢迎各位来提交PR(码云/Github),一起完善YurunHttp,让它能够更加好用。

重大版本更新日志

每个小版本的更新日志请移步到 Release 查看

v5.0.1 支持 WebSocket 压缩及指定 Opcode

v5.0.0 支持 psr/http-message ~2.0 版本 (PHP >= 7.1)

v4.3.0 新增支持连接池

v4.2.0 重构 Swoole 处理器,并发请求性能大幅提升 (PHP 版本依赖降为 >= 5.5)

v4.1.0 实现智能识别场景,自动选择适合 Curl/Swoole 环境的处理器

v4.0.0 新增支持 Swoole 并发批量请求 (PHP >= 7.1)

v3.5.0 新增支持 Curl 并发批量请求 (PHP >= 5.5)

v3.4.0 新增支持 Http2 全双工用法

v3.3.0 新增支持 Http2 兼容用法

v3.2.0 新增支持 Swoole WebSocket 客户端

v3.1.0 引入浏览器级别 Cookies 管理

v3.0.0 新增支持 Swoole 协程

v2.0.0 黑历史,不告诉你

v1.3.1 支持 Composer

v1.0-1.3 初期版本迭代

Composer

本项目可以使用composer安装,遵循psr-4自动加载规则,在你的 composer.json 中加入下面的内容

{
    "require": {
        "yurunsoft/yurun-http": "~5.0"
    }
}

然后执行 composer update 安装。

之后你便可以使用 include "vendor/autoload.php"; 来自动加载类。(ps:不要忘了namespace)

用法

更加详细的用法请看 examples 目录中的示例代码

简单调用

<?php
use Yurun\Util\HttpRequest;

$http = new HttpRequest;

// 设置 Header 4 种方法
$http->header('aaa', 'value1')
     ->headers([
         'bbb' => 'value2',
         'ccc' => 'value3',
     ])
     ->rawHeader('ddd:value4')
     ->rawHeaders([
         'eee:value5',
         'fff:value6',
     ]);

// 请求
$response = $http->ua('YurunHttp')
                 ->get('http://www.baidu.com');

echo 'html:', PHP_EOL, $response->body();

并发批量请求

use \Yurun\Util\YurunHttp\Co\Batch;
use \Yurun\Util\HttpRequest;

$result = Batch::run([
    (new HttpRequest)->url('https://www.imiphp.com'),
    (new HttpRequest)->url('https://www.yurunsoft.com'),
]);

var_dump($result[0]->getHeaders(), strlen($result[0]->body()), $result[0]->getStatusCode());

var_dump($result[1]->getHeaders(), strlen($result[1]->body()), $result[1]->getStatusCode());

只有 Swoole 并发请求会受到连接池限制,Curl 不受影响

Swoole 协程模式

<?php
use Yurun\Util\YurunHttp;
use Yurun\Util\HttpRequest;

// Swoole 处理器必须在协程中调用
go('test');

function test()
{
    $http = new HttpRequest;
    $response = $http->get('http://www.baidu.com');
    echo 'html:', PHP_EOL, $response->body();
}

连接池

在 YurunHttp 中,连接池是全局的,默认不启用。

每个不同的 hostportssl 都在不同的连接池中,举个例子,下面两个 url 对应的连接池不是同一个:

http://www.imiphp.comhost=www.imiphp.com, port=80, ssl=false

https://www.imiphp.comhost=www.imiphp.com, port=443, ssl=true

启用全局连接池:

\Yurun\Util\YurunHttp\ConnectionPool::enable();

禁用全局连接池:

\Yurun\Util\YurunHttp\ConnectionPool::disable();

写入连接池设置:

// 最大连接数=16个,连接数满等待超时时间(仅 Swoole 有效)=30s
// url 最后不要带斜杠 /
\Yurun\Util\YurunHttp\ConnectionPool::setConfig('https://imiphp.com', 16, 30);

YurunHttp 不会限制未设置的域名的连接数

特殊请求不启用连接池:

$http = new HttpRequest;
$http->connectionPool(false);

获取连接池对象及数据:

use Yurun\Util\YurunHttp\Handler\Curl\CurlHttpConnectionManager;
use Yurun\Util\YurunHttp\Handler\Swoole\SwooleHttpConnectionManager;

// 获取 Curl 连接池管理器,选择你所处环境对应的类,其实一般 Curl 不太需要连接池
// $manager = CurlHttpConnectionManager::getInstance();

// 获取 Swoole 连接池管理器,选择你所处环境对应的类
$manager = SwooleHttpConnectionManager::getInstance();

// 获取连接池对象集合
$pool = $manager->getConnectionPool('https://imiphp.com');

// 获取连接总数
$pool->getCount();

// 获取空闲连接总数
$pool->getFree();

// 获取正在使用的连接总数
$pool->getUsed();

// 获取连接池配置
$config = $pool->getConfig();

WebSocket Client

go(function(){
    $url = 'ws://127.0.0.1:1234/';
    $http = new HttpRequest;
    // 启用压缩
    // $http->websocketCompression(true);
    $client = $http->websocket($url);
    if(!$client->isConnected())
    {
        throw new \RuntimeException('Connect failed');
    }
    // 文本
    $client->send('data');
    // 二进制
    $client->send('data', \Yurun\Util\YurunHttp\WebSocket\Opcode::BINARY);
    // 更多 Opcode 预定义在:\Yurun\Util\YurunHttp\WebSocket\Opcode
    // 也支持 WebSocket 标准中的其它 Opcode
    $recv = $client->recv();
    var_dump('recv:', $recv);
    $client->close();
});

Http2 兼容用法

$http = new HttpRequest;
$http->protocolVersion = '2.0'; // 这句是关键
$response = $http->get('https://wiki.swoole.com/');

Curl、Swoole Handler 都支持 Http2,但需要注意的是编译时都需要带上启用 Http2 的参数。

查看是否支持:

Curl: php --ri curl

Swoole: php --ri swoole

Http2 全双工用法

该用法仅支持 Swoole

$uri = new Uri('https://wiki.swoole.com/');

// 客户端初始化和连接
$client = new \Yurun\Util\YurunHttp\Http2\SwooleClient($uri->getHost(), Uri::getServerPort($uri), 'https' === $uri->getScheme());
$client->connect();

// 请求构建
$httpRequest = new HttpRequest;
$request = $httpRequest->header('aaa', 'bbb')->buildRequest($uri, [
    'date'  =>  $i,
], 'POST', 'json');

for($i = 0; $i < 10; ++$i)
{
    go(function() use($client, $request){
        // 发送(支持在多个协程执行)
        $streamId = $client->send($request);
        var_dump('send:' . $streamId);

        // 接收(支持在多个协程执行)
        $response = $client->recv($streamId, 3);
        $content = $response->body();
        var_dump($response);
    });
}

具体用法请看 examples/http2Client.php

PSR-7 请求构建

<?php
use Yurun\Util\YurunHttp\Http\Request;
use Yurun\Util\YurunHttp;

$url = 'http://www.baidu.com';

// 构造方法定义:__construct($uri = null, array $headers = [], $body = '', $method = RequestMethod::GET, $version = '1.1', array $server = [], array $cookies = [], array $files = [])
$request = new Request($url);

// 发送请求并获取结果
$response = YurunHttp::send($request);

var_dump($response);

更多用法详见文档:https://doc.yurunsoft.com/YurunHttp

商业合作

现在使用 Swoole 的项目越来越多,使用 YurunHttp 开发的代码,可以原生兼容 php-fpm 和 Swoole 两种环境。

YurunHttp 相比 Guzzle 性能更强,功能更加强大!

现承接使用 PHP 开发相关系统、SDK 等业务,有需要的请联系 QQ: 369124067

捐赠

开源不求盈利,多少都是心意,生活不易,随缘随缘……

yurunhttp's People

Contributors

jtunggit avatar nhzex avatar sy-records avatar xiaozhuai avatar yurunsoft avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

yurunhttp's Issues

curl并发请求

curl模式下的$res->getRequest()不能拿到原来请求的头信息,cookie等等,直接返回null

swoole Version => 4.6.7 兼容

swoole Version => 4.6.7

PHP Deprecated: Swoole\Event::rshutdown(): Event::wait() in shutdown function is deprecated in Unknown on line 0

Deprecated: Swoole\Event::rshutdown(): Event::wait() in shutdown function is deprecated in Unknown on line 0

设置 http_proxy 后,构建Url地址错误

代码:

Swoole\Coroutine\run(function () {
    $httpClient = new HttpRequest();
    $httpClient->followLocation = false;

    $httpClient->proxy('192.168.10.1', '10901', 'http');
    dump($httpClient->proxy);

    $response = $httpClient->get('http://qq.com:80');

    dump($response->getError());
    dump($response->getStatusCode());
    dump($response->getHeaders());
});

捉包详情:
image

PHP Warning: http_proxy_port should not be null

Logs from Bugsnag:

PHP Warning Swoole\Coroutine\Http\Client::execute(): http_proxy_port should not be null
    [internal] Swoole\Coroutine\Http\Client::execute
    vendor/yurunsoft/yurun-http/src/YurunHttp/Handler/Swoole.php:296 Yurun\Util\YurunHttp\Handler\Swoole::sendDefer
    vendor/yurunsoft/yurun-http/src/YurunHttp/Handler/Swoole.php:205 Yurun\Util\YurunHttp\Handler\Swoole::send
    vendor/yurunsoft/yurun-http/src/YurunHttp.php:103 Yurun\Util\YurunHttp::send
    vendor/yurunsoft/guzzle-swoole/src/SwooleHandler.php:120 Yurun\Util\Swoole\Guzzle\SwooleHandler::__invoke
    vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php:35 GuzzleHttp\PrepareBodyMiddleware::__invoke
    vendor/guzzlehttp/guzzle/src/Middleware.php:31 GuzzleHttp\Middleware::GuzzleHttp\{closure}
    vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php:55 GuzzleHttp\RedirectMiddleware::__invoke
    vendor/guzzlehttp/guzzle/src/Middleware.php:61 GuzzleHttp\Middleware::GuzzleHttp\{closure}
    vendor/guzzlehttp/guzzle/src/HandlerStack.php:75 GuzzleHttp\HandlerStack::__invoke
    vendor/aws/aws-sdk-php/src/Credentials/EcsCredentialProvider.php:67 Aws\Credentials\EcsCredentialProvider::__invoke
    vendor/guzzlehttp/promises/src/Promise.php:204 GuzzleHttp\Promise\Promise::callHandler
    vendor/guzzlehttp/promises/src/Promise.php:169 GuzzleHttp\Promise\Promise::GuzzleHttp\Promise\{closure}
    vendor/guzzlehttp/promises/src/RejectedPromise.php:42 GuzzleHttp\Promise\RejectedPromise::GuzzleHttp\Promise\{closure}
    vendor/guzzlehttp/promises/src/TaskQueue.php:48 GuzzleHttp\Promise\TaskQueue::run
    vendor/guzzlehttp/promises/src/Promise.php:248 GuzzleHttp\Promise\Promise::invokeWaitFn
    vendor/guzzlehttp/promises/src/Promise.php:224 GuzzleHttp\Promise\Promise::waitIfPending
    vendor/guzzlehttp/promises/src/Promise.php:269 GuzzleHttp\Promise\Promise::invokeWaitList
    vendor/guzzlehttp/promises/src/Promise.php:226 GuzzleHttp\Promise\Promise::waitIfPending
    vendor/guzzlehttp/promises/src/Promise.php:62 GuzzleHttp\Promise\Promise::wait
    vendor/aws/aws-sdk-php/src/AwsClientTrait.php:58 Aws\AwsClient::execute
    vendor/aws/aws-sdk-php/src/AwsClientTrait.php:86 Aws\AwsClient::__call
    runtime/container/proxy/App_Service_S3.proxy.php:132 App\Service\S3::fetchDataVersion
    runtime/container/proxy/App_Service_S3.proxy.php:59 App\Service\S3::App\Service\{closure}
    vendor/hyperf/di/src/Aop/ProceedingJoinPoint.php:84 Hyperf\Di\Aop\ProceedingJoinPoint::processOriginalMethod
    vendor/hyperf/di/src/Aop/ProxyTrait.php:85 App\Service\S3::Hyperf\Di\Aop\{closure}
    vendor/hyperf/utils/src/Pipeline.php:104 Hyperf\Utils\Pipeline::Hyperf\Utils\{closure}
    vendor/hyperf/di/src/Aop/ProceedingJoinPoint.php:69 Hyperf\Di\Aop\ProceedingJoinPoint::process
    vendor/hyperf/cache/src/Aspect/CachePutAspect.php:56 Hyperf\Cache\Aspect\CachePutAspect::process
    vendor/hyperf/di/src/Aop/Pipeline.php:30 Hyperf\Di\Aop\Pipeline::Hyperf\Di\Aop\{closure}
    vendor/hyperf/utils/src/Pipeline.php:95 Hyperf\Utils\Pipeline::then
    vendor/hyperf/di/src/Aop/ProxyTrait.php:86 App\Service\S3::handleAround
    vendor/hyperf/di/src/Aop/ProxyTrait.php:29 App\Service\S3::__proxyCall
    runtime/container/proxy/App_Service_S3.proxy.php:60 App\Service\S3::refreshDataVersion
    app/Controller/CmsController.php:20 App\Controller\CmsController::refresh
    vendor/hyperf/http-server/src/CoreMiddleware.php:161 Hyperf\HttpServer\CoreMiddleware::handleFound
    vendor/hyperf/http-server/src/CoreMiddleware.php:113 Hyperf\HttpServer\CoreMiddleware::process
    vendor/hyperf/dispatcher/src/AbstractRequestHandler.php:64 Hyperf\Dispatcher\AbstractRequestHandler::handleRequest
    vendor/hyperf/dispatcher/src/HttpRequestHandler.php:26 Hyperf\Dispatcher\HttpRequestHandler::handle
    app/Middleware/CmsRequest.php:42 App\Middleware\CmsRequest::process
    vendor/hyperf/dispatcher/src/AbstractRequestHandler.php:64 Hyperf\Dispatcher\AbstractRequestHandler::handleRequest
    vendor/hyperf/dispatcher/src/HttpRequestHandler.php:26 Hyperf\Dispatcher\HttpRequestHandler::handle
    vendor/hyperf/validation/src/Middleware/ValidationMiddleware.php:81 Hyperf\Validation\Middleware\ValidationMiddleware::process
    vendor/hyperf/dispatcher/src/AbstractRequestHandler.php:64 Hyperf\Dispatcher\AbstractRequestHandler::handleRequest
    vendor/hyperf/dispatcher/src/HttpRequestHandler.php:26 Hyperf\Dispatcher\HttpRequestHandler::handle
    vendor/hyperf/dispatcher/src/HttpDispatcher.php:40 Hyperf\Dispatcher\HttpDispatcher::dispatch
    vendor/hyperf/http-server/src/Server.php:116 [main]

composer.json (simplified version)

{
    "require": {
        "php": "=7.4",
        "aws/aws-sdk-php": "^3.171.0",
        "bugsnag/bugsnag": "~3.25.0",
        "hyperf/*": "~2.1.0",
        "yurunsoft/guzzle-swoole": "~2.2.0"
    }
}

Pseudo Code

$client = new \Aws\S3\S3Client(
    [
        // No HTTP proxy settings here.
        'http_handler' => \GuzzleHttp\HandlerStack::create(new \Yurun\Util\Swoole\Guzzle\SwooleHandler()),
    ]
);
$client->getObject(); // This makes an HTTP call to AWS.

请求失败重试支持回调函数更好

$httpRequest->retry($retryTimes);
期望改成
$httpRequest->retry(funtion($httpClient) use(xx){}, $retryTimes);

实际使用过程,如爬虫抓取,需要修改header信息来避免失败。如果可以,最好是可以定制失败重试的条件。目前的retry是针对500这种代码,显得用处不大。

[BUG] http 304 响应会导致错误的重定向处理

[Argument 1 passed to Yurun\Util\YurunHttp\Http\Psr7\Request::withUri() must implement interface Psr\Http\Message\UriInterface, null given, called in /home/vagrant/code/project/vendor/yurunsoft/yurun-http/src/YurunHttp/Handler/Swoole.php on line 307
#class: TypeError
#0 /home/vagrant/code/project/vendor/yurunsoft/yurun-http/src/YurunHttp/Handler/Swoole.php(307): Yurun\Util\YurunHttp\Http\Psr7\Request->withUri(NULL)
#1 /home/vagrant/code/project/vendor/yurunsoft/yurun-http/src/YurunHttp/Handler/Swoole.php(189): Yurun\Util\YurunHttp\Handler\Swoole->recvDefer(Object(Yurun\Util\YurunHttp\Http\Request))
#2 /home/vagrant/code/project/vendor/yurunsoft/yurun-http/src/YurunHttp.php(97): Yurun\Util\YurunHttp\Handler\Swoole->send(Object(Yurun\Util\YurunHttp\Http\Request))
#3 /home/vagrant/code/project/vendor/yurunsoft/yurun-http/src/HttpRequest.php(756): Yurun\Util\YurunHttp::send(Object(Yurun\Util\YurunHttp\Http\Request), Object(Yurun\Util\YurunHttp\Handler\Swoole))
#4 /home/vagrant/code/project/vendor/yurunsoft/yurun-http/src/HttpRequest.php(795): Yurun\Util\HttpRequest->send('http://devimage...', Array, 'GET')
#5 /home/vagrant/code/project/App/HttpController/Auth.php(231): Yurun\Util\HttpRequest->get('http://devimage...')
#6 /home/vagrant/code/project/App/HttpController/Auth.php(182): App\HttpController\Auth->handleM3u8('iphone/samples/...', Array)
#7 /home/vagrant/code/project/vendor/easyswoole/http/src/AbstractInterface/Controller.php(115): App\HttpController\Auth->index()
#8 /home/vagrant/code/project/vendor/easyswoole/http/src/Dispatcher.php(182): EasySwoole\Http\AbstractInterface\Controller->__hook('index', Object(EasySwoole\Http\Request), Object(EasySwoole\Http\Response))
#9 /home/vagrant/code/project/vendor/easyswoole/http/src/Dispatcher.php(137): EasySwoole\Http\Dispatcher->controllerHandler(Object(EasySwoole\Http\Request), Object(EasySwoole\Http\Response), '/Auth')
#10 /home/vagrant/code/project/vendor/easyswoole/easyswoole/src/Core.php(255): EasySwoole\Http\Dispatcher->dispatch(Object(EasySwoole\Http\Request), Object(EasySwoole\Http\Response))

if(!$isWebSocket && $statusCode >= 300 && $statusCode < 400 && $request->getAttribute(Attributes::FOLLOW_LOCATION, true))
{
if(++$redirectCount <= ($maxRedirects = $request->getAttribute(Attributes::MAX_REDIRECTS, 10)))
{
// 自己实现重定向
$uri = $this->parseRedirectLocation($this->result->getHeaderLine('location'), $request->getUri());
if(in_array($statusCode, [301, 302, 303]))
{
$method = 'GET';
}
else
{
$method = $request->getMethod();
}
return $this->send($request->withMethod($method)->withUri($uri)->withAttribute(Attributes::PRIVATE_REDIRECT_COUNT, $redirectCount));
}
else
{
$this->result = $this->result->withErrno(-1)
->withError(sprintf('Maximum (%s) redirects followed', $maxRedirects));
return false;
}
}

http code 的定义:
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status

location 只有 301、302、303、307、308 才会存在
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Location

大哥,有几个疑问,麻烦有空时回复一下

问题1:这个YurunHttp支持php5.6吗?我看里面有写>=php7.1,到了php5.6环境下可能直接报语法错了。
问题2:我想用的是curl并发,可以这样写吗?

$result = Batch::run([
            'k1'  => (new HttpRequest)->url('https://gm.apptj.net:/HostLocMJJ/https://www.imiphp.com'),
            'k2'  => (new HttpRequest)->url('https://gm.apptj.net:/HostLocMJJ/https://www.yurunsoft.com'),
]);
foreach($result as $key => $v) {//这里的key就是k1, k2
      var_dump($key, $v);
}

Uncaught InvalidArgumentException: uri

URL : http://www.31dj.com/

PHP Fatal error: Uncaught InvalidArgumentException: uri http:// parse error in /www/wwwroot/imi.qq.com/app/vendor/yurunsoft/yurun-http/src/YurunHttp/Http/Psr7/Uri.php:78
Stack trace:
#0 /www/wwwroot/imi.qq.com/app/vendor/yurunsoft/yurun-http/src/YurunHttp/Handler/Swoole/SwooleHttpConnectionPool.php(59): Yurun\Util\YurunHttp\Http\Psr7\Uri->__construct()
#1 /www/wwwroot/imi.qq.com/app/vendor/yurunsoft/yurun-http/src/YurunHttp/Handler/Swoole/SwooleHttpConnectionPool.php(82): Yurun\Util\YurunHttp\Handler\Swoole\SwooleHttpConnectionPool->createConnection()
#2 /www/wwwroot/imi.qq.com/app/vendor/yurunsoft/yurun-http/src/YurunHttp/Handler/Swoole/SwooleHttpConnectionManager.php(86): Yurun\Util\YurunHttp\Handler\Swoole\SwooleHttpConnectionPool->getConnection()
#3 /www/wwwroot/imi.qq.com/app/vendor/yurunsoft/yurun-http/src/YurunHttp/Handler/Swoole.php(264): Yurun\Util\YurunHttp\Handler\Swoole\SwooleHttpConnectionManager->getConnection()
#4 /www/wwwroot/imi.qq.com/app/vendor/yurunsoft/yurun-http/src/YurunHttp/Handler/Swoole.php(418): Yur in /www/wwwroot/imi.qq.com/app/vendor/yurunsoft/yurun-http/src/YurunHttp/Http/Psr7/Uri.php on line 78

请求构建代码:
$http = \Yurun\Util\HttpRequest::newSession(); $http->retry(3); $http->followLocation = true; $http->maxRedirects = 5; $http->timeout(30000); $http->headers($header); $response = $http->get($url); $html = $response->body();

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.