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

\Workerman\Lib\Timer 不起作用

秀才

請問

我把一個\Workerman\Lib\Timer放在start_gateway.php中執(zhí)行,每兩秒執(zhí)行一次,每次執(zhí)行首先記錄一段文字到文本文件。

當我以 php start.php start 的方式運行的時候是沒有問題的。
但當我以php start.php start -d 的方式運行的時候好像計時器并沒有運行起來。

start_gateway.php代碼如下

<?php 
/**
 * This file is part of workerman.
 *
 * Licensed under The MIT License
 * For full copyright and license information, please see the MIT-LICENSE.txt
 * Redistributions of files must retain the above copyright notice.
 *
 * @author walkor<walkor@workerman.net>
 * @copyright walkor<walkor@workerman.net>
 * @link http://www.wtbis.cn/
 * @license http://www.opensource.org/licenses/mit-license.php MIT License
 */
use \Workerman\Worker;
use \Workerman\WebServer;
use \GatewayWorker\Gateway;
use \GatewayWorker\BusinessWorker;
use \Workerman\Autoloader;
use \TySoft\Qian;
use \TySoft\Pushlist;
use \TySoft\Queue;
use \TySoft\Log;

use \Workerman\Lib\Timer;

// 自動加載類
require_once __DIR__ . '/../../Workerman/Autoloader.php';
Autoloader::setRootPath(__DIR__);

$gateway = new Gateway("Websocket://0.0.0.0:8400");
$gateway->name = 'EdisonWeb';
$gateway->count = 4;
$gateway->lanIp = '127.0.0.1';
$gateway->startPort = 2900;
$gateway->registerAddress = '127.0.0.1:1238';
$gateway->pingInterval = 10;
$gateway->pingNotResponseLimit = 2;
$gateway->pingData = '{"type":"ping"}';

$gateway = new Gateway("Text://0.0.0.0:8200");
$gateway->name = 'EdisonText';
$gateway->count = 4;
$gateway->lanIp = '127.0.0.1';
$gateway->startPort = 2800;
$gateway->registerAddress = '127.0.0.1:1238';
$gateway->pingInterval = 10;
$gateway->pingNotResponseLimit = 2;
$gateway->pingData = '{"type":"ping"}';

Timer::add(2, function(){
    $keys=Queue::smembers('Queue');
    $lasttime=time()-7200;
    Log::log('進入計時器循環(huán)');
    foreach ($keys as $value) {
        if(Queue::get($value.':addtime')<$lasttime){
            Log::log('需要清除:'.$value);
            $searchinfo=json_decode(Queue::get($value.':info'),true);
            $searchid=$searchinfo;
            $unrecommand_coaches=Queue::sdiff($value.':pushcoache',$value.':recommandcoache');
            Pushlist::clearSearch($value,$searchid);
            $callback="http://zhaosheng.maxiucai.com/api/Search/changeSearchstatus?searchid=".$searchid."&status=cancel";
            Log::log('訪問地址:'.$callback);
            $response=file_get_contents($callback);
            Log::log('返回內(nèi)容:'.$response);
        }
    }
});

if(!defined('GLOBAL_START'))
{
    Worker::runAll();
}

Log.php代碼如下

<?php
namespace TySoft;
class Log{
  public static function log($str){
    echo $str."\n";
    file_put_contents('Edison.log', date('Y-m-j G:i:s').$str."\n",FILE_APPEND);
  }
}
5557 6 0
6個回答

walkor 打賞

業(yè)務邏輯都要在onXXX回調(diào)中運行的(手冊中有強調(diào)過),換句話說定時器不能在Worker::runAll();執(zhí)行前運行,因為Worker::runAll();執(zhí)行前運行的代碼都是屬于主進程的,主進程不能有業(yè)務代碼,主進程的業(yè)務代碼會被子進程繼承,導致與預期結(jié)果不符。你的例子中可以放到onWorkerStart中運行定時器,建議放到start_businessworker.php中$businessworker->onWorkerStart回調(diào)中。

  • 暫無評論
秀才

我用您給的方法確實可以了,但是還有個小問題就是 bussinessWorker進程有4個,但是我只需要一個進程執(zhí)行這段代碼。也就是說我的計時器里的代碼兩秒執(zhí)行一次就可以了,在這里執(zhí)行了四次。有些冗余了。

  • 暫無評論
walkor 打賞

可以判斷下worker->id,只在特定ID進程中添加定時器。這部分手冊中有,例如
onWorkerStart里面
if($businessworker->id===0){
Timer::add....
}

或者另外一個方法,專門new一個count為1的Worker進程做定時任務

  • 暫無評論
秀才

看來我真得重新好好看看手冊了。。。

  • 暫無評論
秀才

新開了一個count為1的進程做定時任務,問題圓滿解決!?。「兄xwalkor大神。

  • 暫無評論
walkor 打賞

不客氣

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