Kører LibreOffice soffice.exe på Windows fra PHP exec () fast

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har problemer med at konvertere Word-dokumenter til PDF ved hjælp af soffice.exe i LibreOffice 5.4.6 - kører på Windows Server 2012 R2 via IIS.


Efter at have ændret biblioteket til den relevante LibreOffice-programkatalog i PHP (chdir), er kommandoen, jeg kalder i PHP, følgende:


$cmd = "soffice.exe --headless -convert-to pdf -outdir ".sys\_get\_temp\_dir()." ".$workingdoc;
exec($cmd);


Hvor $ workingdoc er den fulde sti til .docx Word-filen.


sys\_get\_temp\_dir () på mit system oversætter til C: \ Windows \ Temp


Hvis jeg ekko $ cmd-variablen til en browser, så kopierer du denne udgave til en cmd.exe-kommandoprompt interaktivt på serveren, bliver en PDF produceret uden problem.


For eksempel kan en ekko ud $ cmd, som jeg kopierer-indsæt i en cmd.exe-prompte være:


soffice.exe --headless -convert-to pdf -outdir C:WindowsTEMP C:WindowsTemppdD125.docx


Dog kører denne $ cmd-variabel fra PHP via exec () i samme brugerkontekst som det, jeg interaktivt initierede cmd.exe fra, bare hænger. Jeg kan se soffice.exe i Task Manager med RAM forbrug svinger mellem 10-20MB. I min C: \ Windows \ Temp-mappe får jeg desuden flere tomme mapper kontinuerligt oprettet hvert sekund, mens soffice.exe stadig kører, alle med et navn i formatet lu * .tmp


For eksempel er en af ​​de mange mapper, der bliver produceret, lu1124fq1pud.tmp


PDF'en bliver ikke oprettet, og den eneste måde, hvorpå PHP-scriptet kan afslutte og stoppe mapperne lu , der oprettes (udover PHP timeouts), er at tvinge opgaven soffice.exe i Task Manager.


Så hvorfor virker kommandoen soffice.exe, når den bliver kaldt fra cmd.exe, men ikke via PHP, selvom de via begge metoder lanceres i samme brugerkontekst?

Bedste reference