if (\System::which('convert') === false) {
$arErrors[] = '"convert" (imagemagick) is not installed';
}
+ if (\System::which('timeout') === false) {
+ $arErrors[] = '"timeout" (GNU coreutils) is not installed';
+ }
error_reporting($old);
if (count($arErrors)) {
if ($format == 'jpg') {
$format = 'jpeg';
}
+ $maxWaitTime = 30;//seconds
$serverNumber = $this->getServerNumber($options);
$tmpPath = $img->getPath() . '-tmp';
. ' --url=' . escapeshellarg($options->values['url'])
. ' --out-format=' . escapeshellarg($format)
. ' --out=' . escapeshellarg($tmpPath)
- . ' --max-wait=10000'
+ . ' --max-wait=' . (($maxWaitTime - 1) * 1000)
. ' --min-width=' . $options->values['bwidth'];
if ($options->values['bheight'] !== null) {
$cmd .= ' --min-height=' . $options->values['bheight'];
. ' -e /dev/stdout'
. ' --server-args="-screen 0, 1024x768x24"'
. ' --server-num=' . $serverNumber;
- Executor::run($xvfbcmd . ' ' . $cmd);
+ //cutycapt hangs sometimes - https://sourceforge.net/p/cutycapt/bugs/8/
+ // we kill it if it does not exit itself
+ Executor::runForSomeTime($xvfbcmd . ' ' . $cmd, $maxWaitTime);
$this->resize($tmpPath, $img, $options);
}
throw new \Exception('Error running cutycapt', $exitcode);
}
}
+
+ /**
+ * Let the command run for some time. Kill it if it did not exit itself.
+ *
+ * We use the GNU coreutils "timeout" utility instead of the pcntl
+ * extension since pcntl is disabled on mod_php.
+ *
+ * @param string $cmd Full command including parameters and options
+ *
+ * @return void
+ * @throws \Exception When the exit code is not 0
+ */
+ public static function runForSomeTime($cmd, $seconds)
+ {
+ return static::run(
+ 'timeout --signal=9 ' . $seconds . 's ' . $cmd
+ );
+ }
}
?>