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

このQ&Aのポイント
  • WordPressのプラグインでffmpegのフルパスが取得できない問題が発生。
  • Webから実行するとパスが通っていないことが判明。
  • 環境変数「PATH」を通すことで問題が解決する可能性がある。
回答を見る
  • ベストアンサー

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

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」さえ通れば、問題が解決するのではないかと思っています。 開発方法をご存知の方、ご教示ください。 宜しくお願い致します。

  • PHP
  • 回答数4
  • ありがとう数3

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

  • ベストアンサー
  • pringlez
  • ベストアンサー率36% (598/1630)
回答No.4

>環境変数「PATH」さえ通れば、問題が解決するのではないか まぁそうだと思います。おそらく単にPATHの値がきちんと設定できていないだけではないかと思います。とりあえず最低限まず、「PATH」が通っているのか確認しましょうよ。 で、なぜ自分で確認しないのでしょうか? PATHを表示させる方法が分からないのですかね。 「echo getenv('PATH');」でも 「phpinfo();」でも何でもいいですよ。 いうまでもないことですけど、問題が起きているのはWeb上なので、 Webサーバーにtest.phpなどを配置して確認してくださいね。 話はそれからです。 で、PATHが意図せぬおかしな値になっているのではないかと思います。そのPATHの値を見れば何をミスったのかが分かる可能性が高いと思います。 たぶん既存のPATHに追加するつもりで間違えて、上書きするような記述をしたとかそういう話だと思います。

narism
質問者

お礼

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

narism
質問者

補足

ご回答ありがとうございます。 > で、なぜ自分で確認しないのでしょうか? 残念ながら、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のプラグイン」です。 私が書いたものではありません。 他の環境では動作実績もあるようなので、「うっかり上書き」の可能性は極めて低いと考えています。 (本件、プラグイン作者には一応問い合わせしています)

その他の回答 (3)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

まぁWEB環境から環境変数をいじるのはかなり危険だと思いますが・・・ セキュリティのしばりでputenvでもおそらくpathは変えられません。 http://php.net/manual/ja/function.putenv.php むしろ、一度 print getenv('path'); としてどのパスが有効かを確認したうえで、 すでに通っている適当なパスに、シンボリックリンクを貼る方が現実的では?

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

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

narism
質問者

お礼

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

  • t_ohta
  • ベストアンサー率38% (5061/13227)
回答No.1

nginxユーザーのPATH設定をしていないからでしょう。 コンソールで実行した際にうまくいくのは、ログインしているユーザーのPATHが設定されているからです。 /etc/profile にPATH設定を書いておけば全ユーザーに適応されるので、簡単かもしれませんね。

narism
質問者

補足

ご回答ありがとうございます。 nginxユーザーの.bashrcにはPATHが通してあります。 そのため、コンソールからnginxユーザーで同様のスクリプトを実行すると正しく結果が返ってきます。これは質問にも記載したとおりです。 なお、/etc/rc.d/init.d/nginxと/etc/rc.d/init.d/php-fpmにも念のため PATH=/usr/bin...()省略; export PATH を記述していますが、それでも解決しませんでした。

関連するQ&A

  • Webデザイナー向けLinuxユーザ権限について

    外部のWebデザイナー(Wordpressのサイトを構築していただく方)向けのLinuxユーザに、自社のWordpressの操作(/var/www/wordpress配下でファイル書き込み、ファイル追加、削除)が行える権限を与えたいと考えています。 この場合、操作用のlinuxユーザはnginxグループに所属させて、/var/www/wordpress配下のパーミッションに、nginxグループに書き込み権限を加えれば良いと思うのですが、一般的?には、こういったWebデザイナー向けにはどのような権限を持たせたユーザを渡せば良いのでしょうか。 ディレクトリの中の操作以外には、nginxのサービス再起動などができるようにvisudoで以下権限を与えています。 user001 ALL=(ALL) /usr/sbin/nginx,/usr/bin/mysql,/usr/sbin/php-fpm ■ディレクトリのパーミッション # ls -la /var/www/wordpress drwxr-xr-x 5 nginx nginx 4096 Jan 22 14:44 . drwxr-xr-x 7 root root 4096 Jan 22 14:39 .. -rw-r--r-- 1 nginx nginx 418 Sep 25 2013 index.php -rw-r--r-- 1 nginx nginx 19930 Apr 10 2014 license.txt -rw-r--r-- 1 nginx nginx 10164 Dec 19 18:50 readme.html -rw-r--r-- 1 nginx nginx 3204 Dec 19 18:50 readme-ja.html -rw-r--r-- 1 nginx nginx 4951 Aug 21 02:30 wp-activate.php drwxr-xr-x 9 nginx nginx 4096 Dec 19 18:49 wp-admin -rw-r--r-- 1 nginx nginx 271 Jan 9 2012 wp-blog-header.php -rw-r--r-- 1 nginx nginx 5008 Nov 27 05:17 wp-comments-post.php -rw-rw-rw- 1 nginx nginx 3997 Jan 22 14:44 wp-config.php -rw-r--r-- 1 nginx nginx 3727 Dec 19 18:50 wp-config-sample.php drwxr-xr-x 6 nginx nginx 4096 Jan 22 14:45 wp-content -rw-r--r-- 1 nginx nginx 2956 May 13 2014 wp-cron.php drwxr-xr-x 12 nginx nginx 4096 Dec 19 18:49 wp-includes -rw-r--r-- 1 nginx nginx 2380 Oct 25 2013 wp-links-opml.php -rw-r--r-- 1 nginx nginx 2714 Jul 8 2014 wp-load.php -rw-r--r-- 1 nginx nginx 33435 Dec 17 07:19 wp-login.php -rw-r--r-- 1 nginx nginx 8252 Jul 17 2014 wp-mail.php -rw-r--r-- 1 nginx nginx 11115 Jul 18 2014 wp-settings.php -rw-r--r-- 1 nginx nginx 25152 Dec 1 06:23 wp-signup.php -rw-r--r-- 1 nginx nginx 4035 Dec 1 06:23 wp-trackback.php -rw-r--r-- 1 nginx nginx 3032 Feb 10 2014 xmlrpc.php

  • phpからImageMagickの使い方

    phpからexecでImageMagickを使いたいと思っています。ためしにjpgからgifに変換できればと思っています。 exec("/usr/bin/convert IMG_0.jpg a.gif",$output); var_dump($output); という感じでテストしています。 ファイルのパスが間違ってるのかとも思うんですが、うまくいきません。 画像ファイルのパスはexecを実行するphpファイルからの相対パスでよいのでしょうか? -versionは成功しているようです。 exec("/usr/bin/convert -version",$output); array(3) { [0]=> string(68) "Version: ImageMagick 6.4.3 2009-04-10 Q16 http://www.imagemagick.org" [1]=> string(57) "Copyright: Copyright (C) 1999-2008 ImageMagick Studio LLC" [2]=> string(0) "" }

    • ベストアンサー
    • PHP
  • wordpressが表示されない原因は?

    非常に困っております。 html文書にwordpressを組み込もうと思っています。 その前提として、httpd.confには AddType application/x-httpd-php .php .html が記述されてあります。 以下が問題のソースです。 <?php require('絶対パス(省略)/wp-blog-header.php'); ?> <?php echo '<?xml version="1.0" encoding="UTF-8"?>'; ?> <?php query_posts('showposts=1');?> <?php if(have_posts()):while(have_posts()):the_post(); ?> ~~~内容(省略)~~~~ <?php endwhile;endif; ?> <?php wp_reset_query()?> これをアップすると、ページは表示されますが、記事部分が表示されません。 ソースを見ると、 <?php require('絶対パス(省略)/wp-blog-header.php'); ?> <?xml version="1.0" encoding="UTF-8"?> ←★変わった部分 <?php query_posts('showposts=1');?> <?php if(have_posts()):while(have_posts()):the_post(); ?> ~~~内容(省略)~~~~ <?php endwhile;endif; ?> <?php wp_reset_query()?> となっています。 wp-blog-header.phpへの絶対パスに間違いは無く、 また、 <?php echo '<?xml version="1.0" encoding="UTF-8"?>'; ?> が <?xml version="1.0" encoding="UTF-8"?>となっていることから、 php命令文は解釈されている(動いている)と思われます。 ということは、wordpressを組み込むソースが悪いと思うのですが、 何が悪いのか全く分かりません。 絶対パスが間違っていれば、エラー表示になる(ページが表示されるはずない)と思うのですが、 サーバーによっては絶対パスが間違っていても、エラーが表示されなかったりするのでしょうか? ちなみに、wp-blog-header.phpは別ドメインで動かすので“絶対パス”指定は必然設定です。 wordpress熟練者の皆様、どうか力を貸してください。 よろしくお願いします。

  • PHPからexecを使ってGnuPGを実行できない

    GnuPGをPHPからexec関数を使って実行しようとしていますが、exec関数がエラーになって GnuPGが実行されません。 ただしexec関数に渡すコマンドをコマンドラインから直接打ち込むと正常に実行されます。 具体的には $cmd = "/usr/local/bin/gpg --always-trust --batch --no-secmem-warning -e -a -r ユーザー名 ファイル名のフルパス"; $ret = exec( $cmd, $output, $ret_val ); ここで$retにFALSEが、$ret_valには2が返ってきます。 $cmdのコマンドをコマンドラインから実行すると正常に実行されます。 環境 Apache/1.3.27 (Unix) (Red-Hat/Linux) GnuGP 1.4.6 PHP Version 4.3.11(セーフモードはOff) 以上、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHP

    PHPで移動させるのが失敗してます。どうしてですか? /* テンポラリのクーロンの設定をして本番のクーロンに設定をする $cmd = "/usr/bin/sudo chown root:root ".TEMP_PATH; exec($cmd, $output, $return); $cmd = "/usr/bin/sudo cp -f ".CRON_DAILY_ESTAB." ".CRON_DAILY_ESTAB.".bak"; exec($cmd, $output, $return); $cmd = "/usr/bin/sudo mv -f ".TEMP_PATH." ".CRON_DAILY_ESTAB; exec($cmd, $output, $return);

    • ベストアンサー
    • PHP
  • wordpressのURL変更について

    http://0000.com/wpをhttp://0000.comに変更をしようと思いました。 まず設定画面からサイトの名前をhttp://0000.com/wpからhttp://0000.comに変更し、 index.phpをFTPから抜き <?php /** * Front to the WordPress application. This file doesn't do anything, but loads * wp-blog-header.php which does and tells WordPress to load the theme. * * @package WordPress */ /** * Tells WordPress to load the WordPress theme and output it. * * @var bool */ define('WP_USE_THEMES', true); /** Loads the WordPress Environment and Template */ require('./wp-blog-header.php'); ?> の↓を変更。 /** Loads the WordPress Environment and Template */ require('./wordpress/wp-blog-header.php'); ?> その後一つ上の層にindex.phpをあげたのですがサイトにアクセスすると、 Warning: require(./wordpress/wp-blog-header.php) [function.require]: failed to open stream: No such file or directory in /home/sites/heteml/users113/0/1/f/01f-boy/web/pimp/index.php on line 17 Warning: require(./wordpress/wp-blog-header.php) [function.require]: failed to open stream: No such file or directory in /home/sites/heteml/users113/0/1/f/01f-boy/web/pimp/index.php on line 17 Fatal error: require() [function.require]: Failed opening required './wordpress/wp-blog-header.php' (include_path='.:/usr/local/php5/php') in /home/sites/heteml/users113/0/1/f/01f-boy/web/pimp/index.php on line 17 と出てきてサイトが表示されません 。 wp-blog-header.phpがなにかあるのかと思い開けると下記のコードが書いてありました。 <?php /** * Loads the WordPress environment and template. * * @package WordPress */ if ( !isset($wp_did_header) ) { $wp_did_header = true; require_once( dirname(__FILE__) . '/wp-load.php' ); wp(); require_once( ABSPATH . WPINC . '/template-loader.php' ); } ?> しかし自分はphpがよくわからないためどこを変更すればhttp://0000.comでサイトが見れるのかわかりません。 教えてください。

    • ベストアンサー
    • PHP
  • PHP

    <?php $tmpfname = tempnam("/var/tmp", "auto_pbxrestart"); $cmd = "/usr/bin/sudo chown 777 ".TEMP_PATH; exec($cmd, $output, $return); $cmd = "/usr/bin/sudo chown apache::apache ".TEMP_PATH: exec($cmd, $output, $return); $handle = fopen($tmpfname, "w") if ($handle == false) { $status = '01'; print "debug02err"; } /* 実際にクーロンに書き込みする(「* *」は月日なので今回は設定対象にならない)* $cron_config = $arr['opt'] . $arr['nminute'] . " " . $arr['nhour'] . " * * " .$arr['days'] . " root /usr/local/sbin/auto_pbxrestart.pl"; fwrite($fpt , $cron_config); fclose($fpt); /* テンポラリのクーロンの設定をして本番のクーロンに設定をする */ print "debug04=".$cmd.":".$return."<br>"; $cmd = "/usr/bin/sudo cp -f " . CRON_DAILY_ESTAB . " " . CRON_DAILY_ESTAB . ".bak"; exec($cmd, $output, $return); $cmd = "/usr/bin/sudo cp -f " . TEMP_PATH . " " . CRON_DAILY_ESTAB; exec($cmd, $output, $return); unlink($tmpfname); print "debug05 = ".$cmd.":".$return."<br>"; /* 正常終了 */ ?>

    • ベストアンサー
    • PHP
  • Wordpressのpage.phpについて

    初めまして。 既にあるサイトをWordpressに移行しようと考えております。 色々調べ、固定ページ(小さな店のサイトの為ほとんどが固定ページです)は、page.php(もしくはpage.phpを基にしたabout.php等)で設定するという事はわかったのですが。 page.phpの内容は、極端に言えば <?php if (have_posts()) : while (have_posts()) : the_post(); ?> <?php the_content('<p class="serif">Read the rest of this page &amp;raquo;</p>'); ?> <?php endwhile; endif; ?> だけ書いておき、あとはページ作成の時に、現在あるhtmlタグを貼り付けるだけ という感じで問題ないのでしょうか? (もちろん、画像パスは書き換えるとして) Wordpressに関しては初心者の為わからない事だらけですので、詳しい方ご教授ください。

    • 締切済み
    • PHP
  • WordPressを複数インストールしたい

    質問させていただきます。 すでにWordPressをインストールしておりますが もう一つ、インストールしようと思ったのですが うまくいきません。 (1)WordPressのサイトから3.1.1をダウンロードしました。 http://ja.wordpress.org/ (2)フォルダ名を変えて(フォルダ名:wp2)サーバーにアップロードしました。 (3)フォルダのアクセス権を755に設定しました。 (4)アップロードしたところにアクセスしたら <?php /** * Front to the WordPress application. This file doesn't do anything, but loads * wp-blog-header.php which does and tells WordPress to load the theme. * * @package WordPress */ /** * Tells WordPress to load the WordPress theme and output it. * * @var bool */ define('WP_USE_THEMES', true); /** Loads the WordPress Environment and Template */ require('./wp-blog-header.php'); ?> とでてきます。 どうすれば良いでしょうか。 よろしければ、アドバイスお願い致します。

  • 特定のHPだけ見れない

    特定の(1つの)HPが見れなくなりました。 キャッシュで開くと見れるみたいですが、 普通にクリックしても見れません。 昨日までは普通に見れたのに…なぜでしょうか? 具体的に言うと、そのHPに行こうとすると、 以下のような英語文字が出てきます。 (画面は白い)↓ * Front to the WordPress application. This file doesn't do anything, but loads * wp-blog-header.php which does and tells WordPress to load the theme. * * @package WordPress */ /** * Tells WordPress to load the WordPress theme and output it. * * @var bool */ define('WP_USE_THEMES', true); /** Loads the WordPress Environment and Template */ require('wp/wp-blog-header.php'); ?> 検索のやつで英訳してみたのですが… WordPressアプリケーションに面していてください。 このファイルは何もしないで、テーマをロードするためにWordPressをして、言う* wp-ブログ-header.phpをロードします。 * * @package WordPress */ /** * WordPressテーマをロードして、それを出力するようにWordPressに言います。 * * @var bool */ 定めてください(『WP_USE_THEMES』(本当の)); /WordPress EnvironmentとTemplate */が必要とする(『wp/wp-blog-header.php』)** Loads; ?> 2.* WordPressアプリケーションに面していてください。 このファイルは何もしないで、テーマをロードするためにWordPressをして、言う* wp-ブログ-header.phpをロードします。 * * @package WordPress */ /** * WordPressテーマをロードして、それを出力するようにWordPressに言います。 * * @var bool */ 定めてください(『WP_USE_THEMES』(本当の)); ちょっとよくわかりません。PCが苦手というのもあって。 どうすれば見れるようになりますか? 他のHPやサイトは普通に見れます。 詳しい方、どうかお願いします。 Windows7、CORE i 5 東芝dynabook TX/77MBL です。