質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

2回答

2326閲覧

PHPの外部実行と、ターミナルでの実行結果の違いについて

allll

総合スコア42

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2017/02/17 06:45

編集2017/02/17 13:29

CentOSで、WebアクセスしたPHPの外部実行と
ターミナルでコマンドを実行したときの挙動が違い困っております。
コマンドはターミナルで正しく動作することを確認しているものです。

【内容】
LibreOfficeでExcelからPDF変換をコマンドで行っていますが
表題の通り、生成したPDFのフォントに差分があり調査しています。

straceで出力させたところ、PHP外部実行時だけ

open("/dev/tty", O_RDWR|O_NONBLOCK) = -1 ENXIO (No such device or address)
ioctl(0, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, 0x7ffe8ae6e8a0) = -1 ENOTTY (Inappropriate ioctl for device)
connect(3, {sa_family=AF_LOCAL, sun_path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)

といったエラーが発生しています。

PHPの実行記述は下記になります。

PHP

1$outdir = __DIR__ . '/output'; 2 3$command = "libreoffice --headless --convert-to pdf:calc_pdf_Export --outdir $outdir $outdir/test.xlsx"; 4 5echo shell_exec('export HOME=/tmp &&' . $command);

どこかに差分があるのだと思いますが
PHP実行時に、どのような対処を行えば上記のエラーが出ないのか
分からずにおります。

ご存知の方いらっしゃいましたら教えて頂けると幸いです。

<実行環境>
・Cent OS 7.2
・PHP 5.6.30
・Apache 2.4.6

よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

PHPの実行

これはapache経由で実行しているのでしょうか?

LibreOfficeが/dev/ttyをopenしているようなのでapache経由での実行時は質問記載のエラーが出ると思います。
Webサーバー経由でLibreOffice の場合、非表示モード(--invisibleを指定)で起動しAPIで制御するのが王道なのかもしれません。(PHP用のAPIはないかも・・・)

(help.libreoffice.org)LibreOffice ソフトウェアをパラメーターを指定して起動する

open("/dev/tty", O_RDWR|O_NONBLOCK) = -1 ENXIO (No such device or address)

(http://archive.linux.or.jp)6.3 制御端末 /dev/tty
ターミナルで実行した場合は、実行しているターミナルが/dev/ttyにアタッチされます。
LibreOfficeをapahce経由で実行している場合、ターミナルから実行していないので/dev/ttyにアタッチされていません。
よってNo such device or addressになります。

ioctl(0, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, 0x7ffe8ae6e8a0) = -1 ENOTTY (Inappropriate ioctl for device)

これもエラーメッセージがENOTTYなのでTTYデバイスがらみのエラーでLibreOfficeをapache経由で実行している場合、ターミナルから実行していないのでこのエラーになっている。

投稿2017/02/17 07:37

編集2017/02/17 07:51
Y.H.

総合スコア7914

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

allll

2017/02/17 13:38

ご回答頂き、ありがとうございます。 お察しの通り、apacheでPHPを実行しております。 ターミナルから実行した場合だけが/dev/ttyを使うのですね。 TTY絡みとPDF生成の差分が、どう関係あるのかをもう少し調べてみます。 エラーの意味が分かり助かりました。ありがとうございます。
Y.H.

2017/02/19 11:14

>ターミナルから実行した場合だけが/dev/ttyを使うのですね。 「/dev/ttyを使う」というよりターミナルから実行した場合のみ/dev/ttyが存在するって感じです。
guest

0

実行ユーザーとパーミッションの問題が大きいのでは?
基本的にコマンドをつらつら並べるのではなくシェルスクリプトに
まとめてそれをsudoなどかまして実行すれば同じような環境になると思います

投稿2017/02/17 06:55

yambejp

総合スコア114777

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

allll

2017/02/17 13:28

ご回答頂き、ありがとうございます。 visudoで権限を変更し、sudo libreofficeで実行をしましたが結果は同じでした…。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問