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 "
我在 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 "