Это использует MPDF 8.0.5. Это может быть ошибкой. В любой точке кода после использования $ mpdf-> setSourceFile, даже после повторного изменения исходного файла или использования unset ($ mpdf) файл блокируется и не может быть отсоединен. Есть ли обходной путь?
Пример:
//$doc1 is a file path
// Create an instance of the class:
$mpdf = new \Mpdf\Mpdf();
//import document
//unlink($doc1); //permission is fine here
$pagecount = $mpdf->setSourceFile($doc1);
for ($i=1; $i < ($pagecount+1); $i++) {
$mpdf->AddPage();
$tplId = $mpdf->importPage($i);
$temp = $mpdf->UseTemplate($tplId);
}
//$pagecount = $mpdf->setSourceFile($doc2); //no effect on permission, just ties up $doc2
$output = $mpdf->Output('document.pdf',\Mpdf\Output\Destination::STRING_RETURN);
unset($mpdf);
unlink($doc1); //permission denied...
Исправил это сам. Запустите gc_collect_cycles (); после сброса.
MPDF, кажется, использует класс FPDI 2 с PHP StreamReader для чтения файлов. FPDI кажется немного неаккуратным в этом отношении, но кроме принудительного закрытия всего на выходе или требования дополнительных вызовов к классу, нет хорошего способа сделать это. Нет никакого вызова, чтобы закрыть файл никогда, поэтому вам нужно запустить сборщик мусора, так как даже если вы поместите вышеупомянутый код в функцию или сбросите экземпляр класса, поток никогда не будет освобожден. Если разработчик читает это, я бы предложил установить setSourceFile, чтобы освободить любой предыдущий источник, а затем просто отпустить и выйти, когда имя файла источника пустое.