public static function fixPDF($pdf, $out)
{
- return self::_getFile(['operation' => 'fixpdf',
- 'pdf' => $pdf,
- 'out' => $out], 0, false, true);
+ return static::lock($pdf, 'fix', function () use ($pdf, $out) {
+ if (file_exists($out) && filesize($out) > 0 && filemtime($out) >= filemtime($pdf)) {
+ return $out;
+ }
+
+ return self::_getFile(['operation' => 'fixpdf',
+ 'pdf' => $pdf,
+ 'out' => $out], 0, false, true);
+ });
+ }
+
+ public static function lock($pdf, $operation, $callback)
+ {
+ $lockFile = $pdf . '.' . $operation . '.lock';
+ while (file_exists($lockFile) && filemtime($lockFile) > time() - 3600) {
+ sleep(30);
+ }
+ touch($lockFile);
+ $res = $callback();
+ unlink($lockFile);
+ return $res;
}
public static function cutPDF($pdf, $mode, $out)
{
$fixed = $this->getPDFSource('fixed');
$original = $this->getPDFSource('original');
- if (!file_exists($fixed) || filesize($fixed) === 0 || filemtime($fixed) < filemtime($original)) {
+
Farm::fixPDF($original, $fixed);
- }
+
return $fixed;
}