国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

關(guān)于Crontab結(jié)合http-client使用疑問

jiaruo

問題描述

需要3秒請求一次 API接口,不管3秒內(nèi)是否請求到,必須在上一次請求的3秒后再次發(fā)出請求。

理想結(jié)果

第1次請求--------2024-06-03 01:32:28
第2次請求--------2024-06-03 01:32:31
第3次請求--------2024-06-03 01:32:34
第4次請求--------2024-06-03 01:32:37
。
。
。

為此你搜索到了哪些方案及不適用的原因

目前使用的是Crontab結(jié)合異步請求。
疑問:請問大佬們,這種方案會出現(xiàn)什么異常,如:連接過多或者跑滿內(nèi)存等問題?

代碼1如下

<?php
use Workerman\Worker;
require __DIR__ . '/vendor/autoload.php';

use Workerman\Crontab\Crontab;
$worker = new Worker();

// 設(shè)置時區(qū),避免運行結(jié)果與預期不一致
date_default_timezone_set('PRC');

$worker->onWorkerStart = function () {
    // 每分鐘的第1秒執(zhí)行.
    $http = new Workerman\Http\Client();

    new Crontab('*/3 * * * * *', function() use ($http){
        $http->request('http://www.wtbis.cn', [
            'method' => 'POST',
            'version' => '1.1',
            'headers' => ['content-type' => 'application/json','Connection' => 'keep-alive'],
            'data' => json_encode(['detail' => true]),
            'success' => function ($response) {
                $result = $response->getBody();
                $result = json_decode($response->getBody(),true);
                    echo date('Y-m-d H:i:s')."\n";
            },
            'error' => function ($exception) {
                echo $exception;
            }
        ]);
    });
};

Worker::runAll();

代碼2如下

<?php
use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';

//發(fā)送請求
function request($http)
{

    $http->request('http://www.wtbis.cn/', [
            'method' => 'POST',
            'version' => '1.1',
            'headers' => ['content-type' => 'application/json','Connection' => 'keep-alive'],
            'data' => json_encode(['detail' => true]),
            'success' => function ($response) {
                $result = $response->getBody();
                $result = json_decode($response->getBody(),true);
            },
            'error' => function ($exception) {
                echo $exception;
            }
        ]);
}

$task = new Worker();
// 開啟多少個進程運行定時任務,注意業(yè)務是否在多進程有并發(fā)問題
$task->count = 1;
$task->onWorkerStart = function(Worker $task)
{
    $http = new Workerman\Http\Client();
    Timer::add(3, 'request',[$http],true);
};

// 運行worker
Worker::runAll();
743 2 1
2個回答

小Z先生

那你不應該使用定時器 應該使用Timer::add() persistent參數(shù)傳false;

$worker->onWorkerStart = function () {

    $cb = function()use(&$cb){
     $http = new Workerman\Http\Client();
     $http->request('http://www.wtbis.cn', [
            'method' => 'POST',
            'version' => '1.1',
            'headers' => ['content-type' => 'application/json','Connection' => 'keep-alive'],
            'data' => json_encode(['detail' => true]),
            'success' => function ($response) {
                $result = $response->getBody();
                $result = json_decode($response->getBody(),true);
                    echo date('Y-m-d H:i:s')."\n";

                Timer::add(3,$cb,[],false);
            },
            'error' => function ($exception) {
                echo $exception;
                Timer::add(3,$cb,[],false);
            }
        ]);
    }
    $cb();
};

Worker::runAll();

我是這樣想的,你可以嘗試一下是否能夠滿足需求,我并沒有實際使用過這種方式
這段代碼的意思就是請求后3s后再次執(zhí)行$cb方法,persistent-false表示定時器不循環(huán)執(zhí)行,就是執(zhí)行一次的意思

  • jiaruo 2024-06-03

    如果按照這樣說,請求成功后才會Timer::add,如果請求返回結(jié)果為2秒,加上定時器的3秒 那么第一次請求和第二次請求就是5秒了

  • 小Z先生 2024-06-03

    這個你可以自己進行計算的嘛 比如開始獲取一下$start = time() 然后請求后獲取一下time()-$start

    if(time()-$start >=3){
        Timer::add(0.001,$cb,[],false); //直接執(zhí)行下一次
    }else{
        Timer::add(3-(time()-$start),$cb,[],false); //執(zhí)行下一次
    }
  • jiaruo 2024-06-03

    這樣還是不能保證3秒執(zhí)行,如果請求時間超過5秒了就嘎了

  • 小Z先生 2024-06-03

    如果一定的3s執(zhí)行 那就不管http請求唄 反正Workerman\Http\Client本來就是異步的
    你就Timer::add(3,$cb) 發(fā)送一個請求就完了 不管請求執(zhí)行了幾秒

  • jiaruo 2024-06-03

    OK 好的 我嘗試一下 感謝

  • 小Z先生 2024-06-03

    那其實你現(xiàn)在的邏輯并沒問題,就是3s發(fā)送一次請求嘛 Workerman\Http\Client是異步的 又不管時間,我理解錯了題意思,我以為是請求后才能在發(fā)送下一個請求

  • jiaruo 2024-06-03

    麻煩幫我看下代碼2是否有問題,目前測試執(zhí)行效果和代碼1是一致

Jonas

這里為啥不直接Timer::add(3, fn),然后fn去異步處理

  • jiaruo 2024-06-03

    使用定時器結(jié)合http-client嗎?或者說我現(xiàn)在的方案是有什么問題

  • Jonas 2024-06-03

    沒看出有啥問題,但要是我的話就選方案二了,在webman里面有Timer了就直接用了

  • jiaruo 2024-06-03

    好來哥。我聽你的

年代過于久遠,無法發(fā)表回答
??