• ベストアンサー
  • 困ってます

PHPから環境変数'PATH'が使えない

  • 質問No.8731953
  • 閲覧数633
  • ありがとう数3
  • 気になる数0
  • 回答数4
  • コメント数0

お礼率 44% (4/9)

WordPressの「WP Video Posts」というプラグインで標記の問題が発生しています。
プラグインの中で、ffmpegのインストール状況をチェックする関数が

exec("which ffmpeg",$output,$status);

を実行し、ffmpegのフルパスを取りたいらしいのですが、
このとき$status=1(異常)になって、$outputが空になります。
試しに

exec("which ffmpeg 2>&1",$output,$status);

と書いたところ、$outputに「which: no ffmpeg in ((null))」が返ってきて、
PATHが通っていないことに気づきました。
ちなみに、同じスクリプトをコンソールから叩いた場合には、
正しい結果「/usr/bin/ffmpeg」が取得できます。
Webから実行した時だけ、上手く行きません。
(Webとコンソールは同じユーザーです)

以下、サーバーの情報です。

CentOS 6.4
PHP 5.3.3
nginx 1.4.2
php-fpm
WordPress 3.9.2
WP Video Posts 3.1.5

nginxの実行ユーザー:nginx
php-fpm(PHP)の実行ユーザー:nginx


環境変数「PATH」さえ通れば、問題が解決するのではないかと思っています。
開発方法をご存知の方、ご教示ください。
宜しくお願い致します。

質問者が選んだベストアンサー

  • 回答No.4
  • ベストアンサー

ベストアンサー率 36% (594/1616)

>環境変数「PATH」さえ通れば、問題が解決するのではないか

まぁそうだと思います。おそらく単にPATHの値がきちんと設定できていないだけではないかと思います。とりあえず最低限まず、「PATH」が通っているのか確認しましょうよ。

で、なぜ自分で確認しないのでしょうか?
PATHを表示させる方法が分からないのですかね。
「echo getenv('PATH');」でも
「phpinfo();」でも何でもいいですよ。

いうまでもないことですけど、問題が起きているのはWeb上なので、
Webサーバーにtest.phpなどを配置して確認してくださいね。

話はそれからです。


で、PATHが意図せぬおかしな値になっているのではないかと思います。そのPATHの値を見れば何をミスったのかが分かる可能性が高いと思います。

たぶん既存のPATHに追加するつもりで間違えて、上書きするような記述をしたとかそういう話だと思います。
補足コメント
narism

お礼率 44% (4/9)

ご回答ありがとうございます。

> で、なぜ自分で確認しないのでしょうか?
残念ながら、getenv('path')もphpinfo()も、ご指摘のtest.php的なものを置いて確認済みです。
質問内に書いていなかったので試していないと勘違いされたのであれば、質問の書き方が悪かったかもしれません。
申し訳ありません。

環境変数「PATH」がPHP内で参照出来ない状態であることは分かっていますので、以下のことは試しました。
それでも解決できないため、質問させていただいています。
-----------------------------
・/etc/rc.d/init.d/php-fpm のスクリプト内でPATHを定義してexport(その後php-fpmを再起動)
・/etc/rc.d/init.d/nginx のスクリプト内でPATHを定義してexport(その後nginxを再起動)
・nginxの.bashrcでPATHを定義してexport(その後nginx,php-fpmを再起動)
-----------------------------

phpinfo()で見た時、_SERVER['PATH']または_ENV['PATH']の値がおかしいのではなく、
phpinfo()に_SERVER['PATH']、_ENV['PATH']そのものが存在しません。
セキュリティの設定かと思いましたが、SELinuxはDisabled、phpのsafe_modeもOFFです。

また、以下は既存のPATHを上書きしてしまったのでは?
という件に対する補足です。
別の方の補足にも書いたのですが、
「今回問題になっているPHPのプログラムは、既製のWordPressのプラグイン」です。
私が書いたものではありません。
他の環境では動作実績もあるようなので、「うっかり上書き」の可能性は極めて低いと考えています。
(本件、プラグイン作者には一応問い合わせしています)
投稿日時:2014/08/27 18:45
お礼コメント
narism

お礼率 44% (4/9)

補足を書いた後に当該プラグインのサポートフォーラムを見たところ、作者から回答が来ていました。
http://wordpress.org/support/topic/ffmpeg-not-found-1

プラグインのバグ、ということで次期バージョンで直してくれることになりました。
投稿日時:2014/08/27 19:05

その他の回答 (全3件)

  • 回答No.3

ベストアンサー率 51% (3827/7415)

まぁWEB環境から環境変数をいじるのはかなり危険だと思いますが・・・
セキュリティのしばりでputenvでもおそらくpathは変えられません。

http://php.net/manual/ja/function.putenv.php

むしろ、一度
print getenv('path');
としてどのパスが有効かを確認したうえで、
すでに通っている適当なパスに、シンボリックリンクを貼る方が現実的では?
  • 回答No.2

ベストアンサー率 51% (3827/7415)

phpはサーバー環境で動くアプリなんですから
「あればラッキー」的なwhichを使うことはない
最初からフルパス指定するだけでしょう
お礼コメント
narism

お礼率 44% (4/9)

ご回答ありがとうございます。

問題となっているのはWP用の既製プラグインの部分で、おそらく大多数の環境では動作しているものと思われます。
whichを用いでffmpegの存在判定を行っているロジックはプラグイン内に最初から記述されているコードなので、仰りたいことはよく分かるのですが、「使うのが間違い」的な話は今回種しから外れてしまいます。
投稿日時:2014/08/27 14:05
  • 回答No.1

ベストアンサー率 38% (3272/8534)

他カテゴリのカテゴリマスター
nginxユーザーのPATH設定をしていないからでしょう。
コンソールで実行した際にうまくいくのは、ログインしているユーザーのPATHが設定されているからです。

/etc/profile にPATH設定を書いておけば全ユーザーに適応されるので、簡単かもしれませんね。
補足コメント
narism

お礼率 44% (4/9)

ご回答ありがとうございます。

nginxユーザーの.bashrcにはPATHが通してあります。
そのため、コンソールからnginxユーザーで同様のスクリプトを実行すると正しく結果が返ってきます。これは質問にも記載したとおりです。

なお、/etc/rc.d/init.d/nginxと/etc/rc.d/init.d/php-fpmにも念のため
PATH=/usr/bin...()省略; export PATH
を記述していますが、それでも解決しませんでした。
投稿日時:2014/08/27 14:09
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ