PHP中的系统($ cmd)超时

时间:2011-01-12 10:18:20

标签: php windows system cmd

我使用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代码在5秒内运行后终止url2bmp.exe?

另一个问题,该网站将在一个新的ie窗口弹出广告,如何停止用PHP打开一个新的ie窗口?感谢。

1 个答案:

答案 0 :(得分:1)

您无法设置超时,但是如果超过5秒超时,您可以监视进程并将其终止。这是Windows上的一些代码(来自here)(请参阅适用于Linux的here)。 $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); 
}