我有一个问题,当我使用LibreOffice(soffice.exe)同时转换2个docx文件时,LibreOffice会挂起。同时转换xslx(Excel)文件时不会发生这种情况。
我的代码:
exec("C:/LibreOfficePortable/App/libreoffice/program/soffice.exe -headless -convert-to pdf:writer_pdf_Export -outdir C:\convertTest\ C:\convertTest\l06.docx");
和
exec("C:/LibreOfficePortable/App/libreoffice/program/soffice.exe -headless -convert-to pdf:writer_pdf_Export -outdir C:\convertTest\ C:\convertTest\l07.docx");
我已经做了一些挖掘,我认为这可能是因为LibreOffice生成的临时文件在同时转换2个docx文件时具有相同的名称,因此它会失控。这只是一个假设。
我需要修复或替代LibreOffice。
感谢。
答案 0 :(得分:0)
不要同时转换两个文件。
我过去所做的是让PHP脚本将文件放在轮询目录中。编写一个daemon(可能是一个简单的shell脚本或更复杂的东西,如Java),它会轮询该目录以查找传入的作业,当它看到作业时,它会一次一个地将它们提供给LibreOffice,并将结果发送到输出目录。
同时,PHP脚本在输出目录中等待结果。
另一种选择是将文件用作lock。 PHP脚本将在运行作业之前创建一个0字节的文件。如果该文件已存在,请在使用LibreOffice进行转换之前等待它消失,因为另一个作业可能正在运行。转换后,删除该文件,以便下一个作业可以运行。
根据链接:
PHP提供了基于文件的锁定以及pthreads扩展中的Mutex类。
根据我的经验,使用锁定文件是一个脆弱的设置,因为如果一个作业出错,一切都会被卡住。但是,Java守护程序可以使用线程编程,这样如果出现问题,它仍然可以继续运行。
LibreOffice主要用于用户交互。我相信有一些基于命令行的工具可用于进行此类转换,但我没有任何经验。