mirror of
https://git.code.sf.net/p/seeddms/code
synced 2025-02-06 23:24:57 +00:00
run command with timeout
This commit is contained in:
parent
d7223bc521
commit
1ad145ffad
|
@ -50,6 +50,39 @@ class SeedDMS_Preview_Previewer {
|
||||||
$this->width = intval($width);
|
$this->width = intval($width);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static function execWithTimeout($cmd, $timeout=2) { /* {{{ */
|
||||||
|
$descriptorspec = array(
|
||||||
|
0 => array("pipe", "r"),
|
||||||
|
1 => array("pipe", "w"),
|
||||||
|
2 => array("pipe", "w")
|
||||||
|
);
|
||||||
|
$pipes = array();
|
||||||
|
|
||||||
|
$timeout += time();
|
||||||
|
$process = proc_open($cmd, $descriptorspec, $pipes);
|
||||||
|
if (!is_resource($process)) {
|
||||||
|
throw new Exception("proc_open failed on: " . $cmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
$output = '';
|
||||||
|
do {
|
||||||
|
$timeleft = $timeout - time();
|
||||||
|
$read = array($pipes[1]);
|
||||||
|
stream_select($read, $write = NULL, $exeptions = NULL, $timeleft, NULL);
|
||||||
|
|
||||||
|
if (!empty($read)) {
|
||||||
|
$output .= fread($pipes[1], 8192);
|
||||||
|
}
|
||||||
|
} while (!feof($pipes[1]) && $timeleft > 0);
|
||||||
|
|
||||||
|
if ($timeleft <= 0) {
|
||||||
|
proc_terminate($process);
|
||||||
|
throw new Exception("command timeout on: " . $cmd);
|
||||||
|
} else {
|
||||||
|
return $output;
|
||||||
|
}
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieve the physical filename of the preview image on disk
|
* Retrieve the physical filename of the preview image on disk
|
||||||
*
|
*
|
||||||
|
@ -113,7 +146,11 @@ class SeedDMS_Preview_Previewer {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if($cmd) {
|
if($cmd) {
|
||||||
exec($cmd);
|
//exec($cmd);
|
||||||
|
try {
|
||||||
|
self::execWithTimeout($cmd);
|
||||||
|
} catch(Exception $e) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user