Libreoffice shell_exec 在 PHP 脚本中失败

Libreoffice shell_exec failed inside PHP Script

我在 php 脚本中从 shell_exec 使用 运行 libreoffice 时遇到问题。此脚本用于通过 Libreoffice 将 DOCX 转换为 HTML。该脚本在终端中运行良好,但在网络浏览器中运行不佳。我也尝试将 HOME 设置为 /tmp,但根本不起作用。

<?php

$soffice_path = '/usr/sbin/soffice';
$path_with_perm_777 = '/opt/lampp/htdocs/tmp'; 
$docx_file = __DIR__ . '/sample.docx';

echo `which soffice`;
echo `whoami`;
echo shell_exec('echo ${PATH}');

$command = escapeshellcmd('export HOME="/tmp"') . " && " . escapeshellcmd($soffice_path.' --headless --convert-to pdf --outdir '. $path_with_perm_777 .'/converted/ '.$docx_file);          

var_dump( shell_exec($command) );

终端输出:-

/usr/bin/soffice
jack
${PATH}:/usr/bin/custom/:/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/lib/jvm/default/bin
string(175) "convert /opt/lampp/htdocs/sample.docx -> /opt/lampp/htdocs/tmp/converted//sample.pdf using filter : writer_pdf_Export Overwriting: /opt/lampp/htdocs/tmp/converted//sample.pdf"

在网络浏览器中输出:-

/usr/sbin/soffice
jack
/usr/sbin:/usr/bin:/sbin:/bin:/root/bin
NULL

ls -l /opt/lampp/htdocs/)的输出:

drwxrwxrwx  2 jack jack 4096 Jan 23 13:50 tmp

系统信息:

PHP 5.6.39, Manjaro Linux 18.0.2, LibreOffice 6.1.4.2

终于,我修好了。检查 /opt/lampp/logs/error_log 后,我得到了这三行:-

/usr/lib/libreoffice/program/oosplash: /opt/lampp/lib/libstdc++.so.6: version 'GLIBCXX_3.4.18' not found (required by /usr/lib/libreoffice/program/libuno_sal.so.3)

/usr/lib/libreoffice/program/oosplash: /opt/lampp/lib/libstdc++.so.6: version 'GLIBCXX_3.4.11' not found (required by /usr/lib/libreoffice/program/libuno_sal.so.3)

/usr/lib/libreoffice/program/oosplash: /opt/lampp/lib/libstdc++.so.6: version 'CXXABI_1.3.9' not found (required by /usr/lib/libreoffice/program/libuno_sal.so.3)

LibreOffice 找不到所需的库,因为缺少 LD_LIBRARY_PATH 变量。设置后 LD_LIBRARY_PATH,LibreOffice 成功将 DOCX 文档转换为 PDF 文件。

$command = escapeshellcmd('export LD_LIBRARY_PATH="/usr/lib:/usr/lib32:/usr/local/lib"') . ' && ' . escapeshellcmd('export HOME="/tmp"') . ' && ' . escapeshellcmd($soffice_path.' --headless --convert-to pdf --outdir '. $path_with_perm_777 .'/converted '.$docx_file);
var_dump( shell_exec($command) );

Web 浏览器中的输出:-

string(175) "convert /opt/lampp/htdocs/sample.docx -> /opt/lampp/htdocs/tmp/converted/sample.pdf using filter : writer_pdf_Export Overwriting: /opt/lampp/htdocs/tmp/converted//sample.pdf "