Вход Регистрация
Файл: vendor/phpunit/php-invoker/src/Invoker.php
Строк: 94
<?php declare(strict_types=1);
/*
 * This file is part of phpunit/php-invoker.
 *
 * (c) Sebastian Bergmann <sebastian@phpunit.de>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
namespace SebastianBergmannInvoker;

use const 
SIGALRM;
use function 
call_user_func_array;
use function 
function_exists;
use function 
pcntl_alarm;
use function 
pcntl_async_signals;
use function 
pcntl_signal;
use function 
sprintf;
use 
Throwable;

final class 
Invoker
{
    
/**
     * @var int
     */
    
private $timeout;

    
/**
     * @throws Throwable
     */
    
public function invoke(callable $callable, array $argumentsint $timeout)
    {
        if (!
$this->canInvokeWithTimeout()) {
            throw new 
ProcessControlExtensionNotLoadedException(
                
'The pcntl (process control) extension for PHP is required'
            
);
        }

        
pcntl_signal(
            
SIGALRM,
            function (): 
void {
                throw new 
TimeoutException(
                    
sprintf(
                        
'Execution aborted after %d second%s',
                        
$this->timeout,
                        
$this->timeout === '' 's'
                    
)
                );
            },
            
true
        
);

        
$this->timeout $timeout;

        
pcntl_async_signals(true);
        
pcntl_alarm($timeout);

        try {
            return 
call_user_func_array($callable$arguments);
        } finally {
            
pcntl_alarm(0);
        }
    }

    public function 
canInvokeWithTimeout(): bool
    
{
        return 
function_exists('pcntl_signal') && function_exists('pcntl_async_signals') && function_exists('pcntl_alarm');
    }
}
Онлайн: 0
Реклама