Giter Club home page Giter Club logo

yurunhttp's Issues

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

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

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

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

问题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();

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

curl并发请求

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

[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

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.

设置 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

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.