PHPパスをPHPから調べる方法はありますか?【その2】

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 11K+

imamura

score 130

cron,execコマンドを実行する時に必要となる php パス の調査方法について
下記のような方法があることを教えていただきました。
https://teratail.com/questions/9827

<?php
    echo exec('which php');
?>
<?php
    //php >= 5.4
    echo PHP_BINARY;
?>

色々とテストしてみたところ、ここでのphpバージョンは、環境設定で指定されているバージョンで、現在実行されているプログラムファイルを処理しているphpバージョンとは必ずしも一致しませんでした。

例えば、xserverで「PHP5.3」で利用するようにサーバーパネルで設定。
execで別なファイルを呼び出します。

呼び出すファイルによる PHP_VERSION = php5.3.3
呼び出されたファイルによる PHP_VERSION = php4.3.9

xserverはphpのバージョンによりパスが異なります。

 PHP4     /usr/bin/php
 PHP5.1   /usr/bin/php5
 PHP5.2   /usr/bin/php5.2
 PHP5.3   /usr/bin/php5.3
 PHP5.4   /usr/bin/php5.4
 PHP5.5   /usr/bin/php5.5

実行中のphpバージョンのパスを取得できればと思うのですが、
方法はあるでしょうか?

【追記】
目的は「レンタルサーバーで設定したphpバージョンでexecを動かす」です。
利用者に調べてもらうのも良いのですが、情報がとても調べにくく、
個別(レンタルサーバーごと)に対応するのは難しい。

想定している運用は次のとおりです。
1)プログラムの利用者に設定画面にアクセスしてもらう。
2)そこで動いているphpバージョンをチェックする。
3)exec 実行時のphpパスの情報を確定・保存する。
4)exec は保存しておいたphpパスを利用して実行する。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+3

まず最初に、これはPHPスクリプトをコマンドラインから起動するケースでしょうか?(=バッチ)
それとも、WEBサーバからPHPをコールするケースでしょうか?

それによって答えが違ってきます。

execでCallする場合は、起動ユーザのPATH設定によって、参照するPHPが変わってくるからです。
WEBサーバで起動する場合は、libphp5.soのモジュールを参照することになるので起動したバージョンは取得するコマンドが存在します。

どちらでしょうかね?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/05/14 23:54

    【1】にありましたね。
    Cronなどのコマンドから呼び出しているPHPのバージョンを、ブラウザからアクセスして確認したい。と。

    これは、、、厳しい。

    というのも、ブラウザから参照するPHPはモジュール(libphp5.soとかが /etc/httpd/modules 配下にいる)だと思いますが、これはコマンドラインから参照されるPHPとは別物ですよ。
    =ブラウザ経由でバージョン確認してもライブラリ形式となったPHPのバージョンが表示されちゃいます

    なので、PHPスクリプトを作成し、execコマンドで "which php" すれば?
    と思うのですが、これだとApacheユーザのAlias/PATH設定に定義したPHPが参照されることでしょう。

    Cronで起動させるスクリプトのユーザが、Apacheユーザならバージョンは合うと思いますが多分違いますよね?

    xserver のコンパネで設定すると何が変わるのでしょうかね?
    ログインユーザの Alias だけが PHP=/usr/****/php とかだけになってませんかね?

    それだと毎回ApacheユーザのAliasを変更し、再起動しないといけないので運用が絡んで凄く面倒な取得方法になってしまいます。

    キャンセル

  • 2015/05/15 15:10

    目的と運用が明確でなかったので質問の方に追記しました。

    最初は個別に対応していたのですが、初めて聞くにようなマイナーなレンタルサーバーも多くて、これは大変だということで。
    ブラウザからのアクセスに対するphpバージョンはユーザーが管理画面から変更するのは当然なのですが、execの部分は判別できないかと思った次第です。


    ブラウザから利用されるPHPとコマンドラインから参照されるPHPは、別物なんですね。
    これは知りませんでした。

    キャンセル

+1

力技ですが、こんな感じでどうでしょうか?

<?php
$candidates = array(
    '/usr/bin/php'  ,
    '/usr/bin/php5' ,
    '/usr/bin/php5.2',
    '/usr/bin/php5.3',
    '/usr/bin/php5.4',
    '/usr/bin/php5.5'
);
foreach ($candidates as $bin) {
    if (stat($bin))    {
        $ver = `$bin -v`;
        $ver = substr($ver, 4, 5);
        if ($ver === PHP_VERSION)   {
            printf("Interpreter = %s\n", $bin);
        }
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/05/15 13:28

    なるほどファイルの存在を確認して、現在のバージョンとマッチさせる方法ですね。
    ある程度パターンがわかっている場合有効に思えます。

    キャンセル

0

phpinfo();
を実行してみてください。

PHPの設定環境が表になって表示されます。

'Configuration File (php.ini) Path'とある横に表示されているのがPHPのパスです。
私もクローンを設定するのにこの方法で設定しました。

たとえば /usr/lib  と表示されていれば、その後ろに/PHPをつけて
/usr/lib/PHP phpスクリプトのファイルパス
とすれば、phpが動作します。

試してみてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/05/15 13:44

    php.ini設定ファイルの設置場所から推測する方法ですね。
    mamp,xserver,lolipopなどを調べてみたのですがそれぞれに実行ファイルとは別にあるようです。
    /PHPをつけることで実行できるのか。まだテスト出来ていません。

    キャンセル

0

自分が借りているさくらの VPS 上では、これでも動きました。
$ cat getmypath2.php
<?php
$pid = getmypid();
$exe = readlink("/proc/$pid/exe");
printf("exe = %s\n", $exe);
$ php getmypath2.php
exe = /usr/bin/php

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/05/15 14:53

    自分のプロセスを調べて、そこからシンボリックリンク(ショートカットのようなもの?)から調べる方法ですね。

    試してみたら$exeは次のようになりました。

    xserver /usr/bin/org/php53/php-cgi
    ロリポップ /home/users/0/php-bin/hoho.jp-user/hoge.hoge.jp/php5.4/php5.4.cgi

    exec実行のテストをしてみます。

    キャンセル

  • 2015/05/15 15:43

    このケースは、Web アプリから CGI 経由で実行していますね。
    Web アプリの中から(exec で呼べる)CLI アプリを調べるのは無理です。
    なぜなら、Web アプリの実行エンジン(libphp5.so とか phpxx.cgi)と、
    CLI バイナリ( /usr/xxx/php とか php.exe)は、お互いに独立したもので、
    何の関連性もないからです。たまたま同じソースコードからビルドされ、
    まとめてパッケージとして提供されるかもしれないという程度です。

    キャンセル

  • 2015/05/15 16:13

    phpと一括りで考えていましたが別物として動いているんですね。
    レンタルサーバーによる運用でいろいろと異なりそうですね。

    キャンセル

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

  • ただいまの回答率 90.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる