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 脚本中失败

使用 php 返回码 77 执行系统命令

PHP协程:并发 shell_exec

协程 shell_exec 如何捕获标准错误流

有没有办法在不等待命令完成的情况下使用 shell_exec ?

PHP 中的 shell_exec()