системный ($ cmd) тайм-аут в PHP - PullRequest
2 голосов
/ 12 января 2011

Я использую url2bmp.exe, чтобы поймать скриншот сайта с php.мой код, например:

<?php
$cmd = 'url2bmp.exe -url "http://www.filmgratis.tv/index.php/category/film/animazione" -format jpeg -file"C:\www\Screenshot\screenshoot.jpg" -wait 5 -notinteractive run and exit when done -removesb remove right scroll bar';
system($cmd);
?>

, но иногда у страницы сайта возникают проблемы с загрузкой, и url2bmp останавливается на этом сайте и никогда не закрывается, все еще ожидая загрузки страницы.как использовать php код завершения url2bmp.exe после запуска в течение 5 секунд, если он встретил эту ситуацию?

И еще вопрос, на сайте будут всплывающие окна с рекламой в новых окнах т.е. как остановить открытие нового т.е.окна с php?Спасибо.

1 Ответ

1 голос
/ 12 января 2011

Вы не можете установить тайм-аут, но вы можете отслеживать процесс и убивать его, если он превысил 5-секундный тайм-аут. Вот некоторый код (от здесь ) для Windows (см. здесь для Linux). $command - это команда, которую нужно выполнить, $timeout - это время, в течение которого процесс запускается (5 секунд в вашем случае), а $sleep - интервал между проверками тайм-аута (1 секунда должна подходить для вашего случая).

function PsExecute($command, $timeout = 60, $sleep = 2) { 
    // First, execute the process, get the process ID 

    $pid = PsExec($command); 

    if( $pid === false ) 
        return false; 

    $cur = 0; 
    // Second, loop for $timeout seconds checking if process is running 
    while( $cur < $timeout ) { 
        sleep($sleep); 
        $cur += $sleep; 
        // If process is no longer running, return true; 

       echo "\n ---- $cur ------ \n"; 

        if( !PsExists($pid) ) 
            return true; // Process must have exited, success! 
    } 

    // If process is still running after timeout, kill the process and return false 
    PsKill($pid); 
    return false; 
} 

function PsExec($commandJob) { 

    $command = $commandJob.' > /dev/null 2>&1 & echo $!'; 
    exec($command ,$op); 
    $pid = (int)$op[0]; 

    if($pid!="") return $pid; 

    return false; 
} 

function PsExists($pid) { 

    exec("ps ax | grep $pid 2>&1", $output); 

    while( list(,$row) = each($output) ) { 

            $row_array = explode(" ", $row); 
            $check_pid = $row_array[0]; 

            if($pid == $check_pid) { 
                    return true; 
            } 

    } 

    return false; 
} 

function PsKill($pid) { 
    exec("kill -9 $pid", $output); 
}
...