LibreOfficeをphpのexecで実行したらエラーになった話

LibreOfficeは、docxファイルやエクセルファイルをpdfに変換してくれるソフトウェアです。

さっそくLibreOfficeをインストールしてphpから実行したところ、pdfへの変換ができずにエラーに遭遇。コマンドラインから直接叩くと問題なく変換されるので、インストールの失敗ということはなさそう。

LibreOfficeが返すエラーステータス”77″は「permissionエラー」とのことなので、LibreOfficeの実行コマンド周りの権限を見直しても状況は変わらず。

色々調べていると、天下のstak overflowでやっと原因を発見!

[stack overflow] php libreoffice shell_exec not working

Most likely the user that LibreOffice is ran as, does not have a writeable home directory so LibreOffice fails to create it’s config directory and then it cannot create it’s config files and then fails to load Java, because it cannot write the default config. A bit silly I know.

LibreOfficeはpdfへの変換時に「実行ユーザのホームディレクトリ配下にディレクトリを作成し、設定ファイルを生成」するようです。なので、ホームディレクトリがない場合やホームディレクトリへのアクセス権限がない場合にはエラーとなるそう。

原因がわかったので、幾つか解決策をまとめてみました。

解決策1 – 実行時に”export HOME=/tmp;”を追加する

stack overflowで紹介されていた方法です。

LibreOfficeのコマンドを実行する前に、Linuxの/tmpをホームディレクトリとして指定します。

exec('export HOME=/tmp; libreoffice  ... ');

こうすることで、/tmpにLibreOfficeの設定ファイルが書き込まれるようになり、LibreOfficeが正しく動作するようになります。

解決策2 – apacheユーザーのホームディレクトリにlibreofficeディレクトリを作成する

こちらの記事を参照させていただきました。

LibreofficeをPHP(Apache)経由で利用すると発生するエラーへの対処方法

私の環境でもphpをApacheで動かしておりました。まずはapacheのホームディレクトリを確認します。

$ less /etc/passwd
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin

“/usr/share/httpd”ですね。”libreoffice”という名前のディレクトリを作ればよいとのことなので、以下のコマンドでディレクトリを作成します。

$ mkdir /usr/share/httpd/libreoffice
$ chown -R apache:apache /usr/share/httpd/libreoffice

これで問題なくLibreOfficeを動かすことができました。

解決策3 – Apacheの実行権限を一般ユーザーに変更する

そもそもデフォルト設定がapacheユーザーでApacheを動かしてましたので、一般ユーザーでApacheを動かしてみます。

所有者・所有グループを作成

$ groupadd -g 800 mygroup
$ useradd -u 800 -g 800 myuser
$ passwd xxxxxx

httpd.confの変更

Apacheの設定ファイル(httpd.conf)のUserとGroupを先ほど作ったユーザーに書き換えます。

$ vim /etc/httpd/conf/httpd.conf

User myuser
Group mygroup

Apacheを再起動すると、LibreOfficeがphpからでも動くようになりました。解決策2と同じで、ホームディレクトリにLibreOfficeの設定ファイルが書き込めるようになったからですね。

Related Posts