Invoker

EasySwoole为了让框架支持函数超时处理和swoole1.x与2.x,封装了一个Invoker。

实现代码

namespace EasySwoole\Core\Component;


use EasySwoole\Core\Swoole\ServerManager;
use \Swoole\Process;
use \Swoole\Coroutine;

class Invoker
{
    /*
     *  Async::set([
          'enable_signalfd' => false,
       ]);
     */
    public static function exec(callable $callable,$timeOut = 100 * 1000,...$params)
    {
        pcntl_async_signals(true);
        pcntl_signal(SIGALRM, function () {
            Process::alarm(-1);
            throw new \RuntimeException('func timeout');
        });
        try
        {
            Process::alarm($timeOut);
            $ret = self::callUserFunc($callable,...$params);
            Process::alarm(-1);
            return $ret;
        }
        catch(\Throwable $throwable)
        {
            throw $throwable;
        }
    }


    public static function callUserFunc(callable $callable,...$params)
    {
        if(ServerManager::getInstance()->isCoroutine()){
            return Coroutine::call_user_func($callable,...$params);
        }else{
            return call_user_func($callable,...$params);
        }
    }

    public static function callUserFuncArray(callable $callable,array $params)
    {
        if(ServerManager::getInstance()->isCoroutine()){
            return Coroutine::call_user_func_array($callable,$params);
        }else{
            return call_user_func_array($callable,$params);
        }
    }
}

使用实例

限制函数执行时间

try{
    \EasySwoole\Core\Component\Invoker::exec(function (){
        sleep(2);
    });
}catch (Throwable $throwable){
    echo $throwable->getMessage();
}

results matching ""

    No results matching ""