Libreoffice shell_exec 在 PHP 脚本中失败
Posted
技术标签:
【中文标题】Libreoffice shell_exec 在 PHP 脚本中失败【英文标题】:Libreoffice shell_exec failed inside PHP Script 【发布时间】:2019-01-23 09:12:54 【问题描述】:我在 php 脚本中从 shell_exec 运行 libreoffice 时遇到问题。此脚本用于通过 Libreoffice 将 DOCX 转换为 html。该脚本在终端中运行良好,但在 Web 浏览器中运行良好。我也尝试将 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
【问题讨论】:
【参考方案1】:最后,我修复了它。检查 /opt/lampp/logs/error_log 后,我得到了这三行:-
/usr/lib/libreoffice/program/oosplash:/opt/lampp/lib/libstdc++.so.6: 未找到版本“GLIBCXX_3.4.18”(要求 /usr/lib/libreoffice/program/libuno_sal.so.3)
/usr/lib/libreoffice/program/oosplash:/opt/lampp/lib/libstdc++.so.6: 未找到版本“GLIBCXX_3.4.11”(需要 /usr/lib/libreoffice/program/libuno_sal.so.3)
/usr/lib/libreoffice/program/oosplash:/opt/lampp/lib/libstdc++.so.6: 未找到版本“CXXABI_1.3.9”(需要 /usr/lib/libreoffice/program/libuno_sal.so.3)
由于缺少 LD_LIBRARY_PATH 变量,LibreOffice 找不到所需的库。设置 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 浏览器中的输出:-
字符串(175)“转换/opt/lampp/htdocs/sample.docx-> /opt/lampp/htdocs/tmp/converted/sample.pdf 使用过滤器: writer_pdf_Export 覆盖: /opt/lampp/htdocs/tmp/converted//sample.pdf "
【讨论】:
以上是关于Libreoffice shell_exec 在 PHP 脚本中失败的主要内容,如果未能解决你的问题,请参考以下文章
Libreoffice shell_exec 在 PHP 脚本中失败