http-client options参数问题

adminx

请求发出后等待响应的超时时间,timeout如何设置不超时,也就是一直等待?

'timeout' => 30, // 请求发出后等待响应的超时时间

<?php
require __DIR__ . '/vendor/autoload.php';
use Workerman\Worker;
$worker = new Worker();
$worker->onWorkerStart = function(){
    $options = [
        'max_conn_per_addr' => 128, // 每个域名最多维持多少并发连接
        'keepalive_timeout' => 15,  // 连接多长时间不通讯就关闭
        'connect_timeout'   => 30,  // 连接超时时间
        'timeout'           => 30,  // 请求发出后等待响应的超时时间
    ];
    $http = new Workerman\Http\Client($options);

    $http->get('http://example.com/', function($response){
        var_dump($response->getStatusCode());
        echo $response->getBody();
    }, function($exception){
        echo $exception;
    });
};
Worker::runAll();
501 4 0
4个回答

Gin

不设置的话 默认是 30s

  • adminx 2024-05-27

    如果想要一直不超时,需要怎么设置?

  • Gin 2024-05-27

    为什么有这种需求, 那这个请求不就一直busy状态了么

  • adminx 2024-05-27

    谢谢啊,是这样的大哥,国外的第三方数据源,正常来说第三方数据源会提供websocket连接,然后服务端和第三方建立长连接,但是这个第三方没有websocket,只有stream流连接,会实时的推送报价数据,我想拿到这个实时的报价数据,然后处理一下,再转发给前端对应的连接对象,这个是上次提问的问题。https://www.workerman.net/q/12568

  • adminx 2024-05-27

    我把代码及截图贴出来了,如果不能设置不超时,那我估计只能设置一个很大的数值了,如:18600秒。之前的方案是使用GuzzleHttp stream流请求不停的存到redis,然后再time定时不停的从redis中取,这样会有延迟,后来改成的这个方案。

adminx
<?php
use Workerman\Connection\TcpConnection;
use Workerman\Http\Client;
use Workerman\Protocols\Http\Chunk;
use Workerman\Protocols\Http\Request;
use Workerman\Protocols\Http\Response;
use Workerman\Worker;

require 'vendor/autoload.php';

$worker = new Worker("websocket://127.0.0.1:2001");
$worker->count = 1;

$worker->onWorkerStart = function (Worker $worker) {
    $headers = [
        'Content-Type' => 'application/json',
        'Authorization' => 'Bearer 5dc864e9879fe3f7a6d33621fda8283f-f524c......',
        'Accept-Datetime-Format' => 'UNIX'
    ];

    // 外汇和金属在一起,共89个
    $instruments = ['EUR_USD', 'USD_JPY', 'GBP_USD', 'AUD_USD', 'USD_CAD', 'USD_CHF', 'NZD_USD', 'EUR_GBP', 'EUR_AUD', 'EUR_CAD', 'EUR_CHF', 'EUR_JPY', 'EUR_NZD', 'GBP_JPY', 'GBP_AUD', 'GBP_CAD', 'GBP_CHF', 'GBP_HKD', 'GBP_NZD', 'GBP_SGD', 'GBP_ZAR', 'GBP_PLN', 'EUR_HUF', 'USD_HKD', 'USD_TRY', 'USD_SEK', 'USD_CNH', 'USD_SGD', 'USD_NOK', 'USD_HUF', 'USD_DKK', 'USD_CZK', 'USD_ZAR', 'USD_PLN', 'USD_THB', 'EUR_ZAR', 'EUR_HKD', 'EUR_DKK', 'EUR_CZK', 'EUR_SEK', 'EUR_PLN', 'EUR_NOK', 'EUR_TRY', 'EUR_SGD', 'USD_MXN', 'SGD_JPY', 'NZD_CHF', 'CHF_JPY', 'CAD_JPY', 'NZD_JPY', 'CAD_HKD', 'AUD_CAD', 'TRY_JPY', 'ZAR_JPY', 'AUD_HKD', 'SGD_CHF', 'AUD_SGD', 'CHF_ZAR', 'NZD_HKD', 'NZD_SGD', 'HKD_JPY', 'NZD_CAD', 'AUD_NZD', 'CAD_SGD', 'AUD_CHF', 'AUD_JPY', 'CAD_CHF', 'CHF_HKD', 'XAU_USD', 'XAU_EUR', 'XAU_GBP', 'XAU_JPY', 'XAU_CAD', 'XAU_AUD', 'XAU_CHF', 'XAU_NZD', 'XAU_HKD', 'XAU_SGD', 'XAU_XAG', 'XAG_USD', 'XAG_EUR', 'XAG_GBP', 'XAG_JPY', 'XAG_CAD', 'XAG_AUD', 'XAG_CHF', 'XAG_NZD', 'XAG_HKD', 'XAG_SGD'];

    $http = new Client();
    $http->request('这里是一个国外的流连接地址,这里是一个国外的流连接地址,这里是一个国外的流连接地址/pricing/stream', [
        'method' => 'GET',
        'data' => [
            'instruments' => implode(',', $instruments)
        ],
        'headers' => $headers,
        'progress' => function ($buffer) {
            $res = json_decode($buffer, true);

            if ($res && $res['type'] == 'HEARTBEAT') {
                var_dump($res);
            }
        },
        'success' => function ($response) {
            var_dump(new Chunk(''));
        },
        'error' => function ($exception) {
            echo $exception;
        }
    ]);
};

// 运行worker
Worker::runAll();

截图

  • 暂无评论
adminx

  • 暂无评论
Gin

把 Workerman\Http\ConnectionPool中的 tryToCreateConnectionCheckTimer 注释掉 试试
截图

  • adminx 2024-05-27

    我试下,谢谢

  • 北月 2024-05-27

    直接改 package 的源码不太好吧,新建 ClientConnectionPool 这两个类,重写 Client 类的 __construct 方法 和 ConnectionPool 类的 tryToCreateConnectionCheckTimer 方法比较靠谱。

  • Gin 2024-05-27

    先试试, 可用的话, 当然得复制出来一份, 哈哈

×
🔝