Как закрыть файл после использования $ mpdf-> setSourceFile, чтобы отменить связь исходного файла? - PullRequest
0 голосов
/ 16 апреля 2020

Это использует 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, чтобы освободить любой предыдущий источник, а затем просто отпустить и выйти, когда имя файла источника пустое.

...