Я использую webkithtmltopdf для создания PDF-файлов & хочу перезаписать любые существующие файлы.Отладочные файлы не обновляются атомарно (возможно, проблема с броузером PDF.js)
Я не уверен, что это гарантирует атомные обновления, или если мы будем использовать другой инструмент PDF в один прекрасный день, поэтому я завернул его в некоторый PHP-код, который использует временный файл. После создания временного файла я использую функцию rename() PHP для перезаписывания фактического файла.
Я обнаружил, что временный файл & существует в том же разделе, однако при запуске моего сценария иногда я получаю сообщение типа «PDF-файл не отображается» из браузера, если я запрашиваю PDF-файл в точный момент его переписывания.
Как я могу попытаться отладить это? Я не вижу ошибок в журнале ошибок Apache. Я вижу запросы «200» и «206» в журналах доступа. Я не уверен, что я ищу на Content-Length, или как pdf.js работает вместе с сервером.
код выглядит следующим образом:
$output = sprintf(__DIR__."/pdfs/%s.pdf", $id);
$tmpOutput = $output . '.tmp';
$cmd = 'wkhtmltopdf '. escapeshellarg($url) . ' ' . escapeshellarg($tmpOutput);
exec($cmd);
chmod($tmpOutput, 0777);
rename($tmpOutput, $output);
chmod($output, 0777);
Его стоит упомянуть, я использую CHMOD, чтобы обойти тот факт, я бегу это в Gearman работника, в ведении руководителя, который был начат корнем. Если бы это была проблема разрешения, я бы ожидал ошибки, заявляя, что в журнале ошибок Apache, но нет, и я также ожидал бы код статуса 403 или тому подобное, но все, что я вижу, - 200 или 206 в журналах ,
атомарно? что это значит, как атомы и прочее? – meda
@meda как изменение переменной без изменения других потоков. –
атомно означает, что в любой момент времени любой процесс, считывающий этот путь, должен получить полностью сформированный pdf-файл. Он не должен получать пустой или частичный файл в результате чтения его в тот момент, когда он обновляется. Либо он получает старый файл, либо новый файл. –