- PR -

PHP〜コマンド実行〜返り値取得について

1
投稿者投稿内容
常連さん
会議室デビュー日: 2004/04/06
投稿数: 38
お住まい・勤務地: 大阪
投稿日時: 2004-10-14 18:26
こんばんわ。国と申します。

今どうしても出来ないことがあり困ってます。
詳しい方、助言を頂けませんでしょうか。

やりたいことは以下の通りです。

1・WEB(PHP)からコマンドを実行
2・コマンドの返り値を取得
3・処理を分ける

exec("hogehoge.mod a=1 B=2",$ret);
if(ereg("hoge",$ret){
処理1
}else{
処理2
}

という簡単なことなのですが、返り値の取得は出来ております。

何に困っているかというと
コマンドで実行するモジュールがapacheの環境変数を読み取って
処理を変える仕組みとなっているのですが、できません。。
($_SERVER['QUERY_STRING']に特定のパラメータがあった場合
ある場合と無い場合では異なる返り値を返すという仕組みです)

Perlなら出来るのですがPHPでできません。

どうやら$_SERVER['QUERY_STRING']がきちんと渡ってないと思うのですが、
思い当たる解決方法ありますでしょうか。

なお、このモジュールはいじれません。
このまま使うしかないですし、バグは絶対にありません。

もし、何か気になることありましたら教えて頂きたく思います。
宜しくお願い致します。

---環境---
RedHatEntES3.0
Apache2
PHP4.3
常連さん
会議室デビュー日: 2004/04/06
投稿数: 38
お住まい・勤務地: 大阪
投稿日時: 2004-10-14 18:58
補足です。

>($_SERVER['QUERY_STRING']に特定のパラメータがあった場合
>ある場合と無い場合では異なる返り値を返すという仕組みです)

特定のパラメータがきちんと渡っていないらしく、
ある場合も無い場合と同様の値を返します。


がるがる
ぬし
会議室デビュー日: 2002/04/12
投稿数: 873
投稿日時: 2004-10-14 19:33
どもです。がると申します。
んっと…ちと厳しい発言ではあるのですが。

とりあえず、テストプログラムを作ってご自身で検証されて
みてはいかがでしょうか?
そうすれば、もう少し傷害の切り分けも可能だと思うのですが。
常連さん
会議室デビュー日: 2004/04/06
投稿数: 38
お住まい・勤務地: 大阪
投稿日時: 2004-10-14 21:16
がるさん
レスありがとうございます。

>とりあえず、テストプログラムを作ってご自身で検証されて
>みてはいかがでしょうか?

説明不足で申し訳ありません。
以下の様にテストプログラムを作って試していました。

-----jyusin.php(755)-----
#!/usr/local/bin/php -q
<?php
echo "<{$_SERVER['QUERY_STRING']}>";
?>
-----

-----soushin.php-----
<?php
//コマンドを実行&戻り値取得
exec("/usr/local/bin/php /ファイルへのパス/jyusin.php",$ret);
foreach($ret as $tmp)$P.=$tmp;

echo "送[{$_SERVER['QUERY_STRING']}]<br>\n";
echo "受[{$P}]";
?>
-----

コマンドラインからjyusin.phpを実行し動作することを確認しました。
ブラウザ上から
http://hoge.com/soushin.php?a=1&b=2&c=3
でsoushin.phpへアクセスした結果は以下の通りです。

-----
送[a=1&b=1&c=1]
受[<>]
-----
戻ってきてません。

しかし、実際に使うモジュールが、
どういう方法で'QUERY_STRING'を取得しているのかは分かりませんので、
これでテストになっているのか分かりませんが。。

できると思って試行錯誤してますが、煮詰まってます。。
色々やってみます。
あゆかわ
会議室デビュー日: 2004/01/30
投稿数: 7
投稿日時: 2004-10-14 22:25
http://www.php.net/manual/ja/language.variables.predefined.php
に書いてありますが、$_SERVERなどの変数はPHPをコマンドラインから実行したときには使えないのかもしれませんよ。
(というか、$_SERVER自体、Webサーバーからいただく情報をメインに格納しているはずなので、コマンドラインから$_SERVERはまず使えないのだと思います。)

execで実行するのはまさにコマンドラインからの実行に相当するので、このテストプログラムのjyushin.phpでは$_SERVERは使えないのでは。

解決したいなら、コマンドライン引数の形でわたしてやるのが確実だと思います。

_________________
-----------------------------------------
Fedoraに乗り換えました。
http://www.lyricfathom.com/mt/linux/

[ メッセージ編集済み 編集者: あゆかわ 編集日時 2004-10-14 22:28 ]
常連さん
会議室デビュー日: 2004/04/06
投稿数: 38
お住まい・勤務地: 大阪
投稿日時: 2004-10-14 23:53
あゆかわさん
レス有難うございます。

>execで実行するのはまさにコマンドラインからの実行に相当するので、
>このテストプログラムのjyushin.phpでは$_SERVERは使えないのでは。

見てみました。そのようですね。。(汗
意味ないですね(w

>解決したいなら、コマンドライン引数の形でわたしてやるのが確実だと思います。

「コマンド QUERY_STRING」の様な形でしょうか。
モジュールはQUERY_STRINGを取得&判別して処理を行います。
仕様は変更できませんのでこれに合わす必要があります。
助言頂きましたのに申し訳ございません。

実際にPerlで呼び出すと'QUERY_STRING'を判別した戻り値を取得出来ます。
(ブラウザ〜Perlスクリプトでモジュール実行〜'QUERY_STRING'により異なる戻り値取得)
PHPで同じように実行すると'QUERY_STRING'がなんであろうと同じ戻り値になります。。

もしかしてPHPでは出来ないのでしょうか。。

あら
常連さん
会議室デビュー日: 2004/03/27
投稿数: 24
投稿日時: 2004-10-15 11:29
こんにちは「あら」と言います。

推測ですが、$_ENVとかコマンドラインへ渡される環境変数が
あるかもしれないので、そっちに追加してコマンド実行してみるとか。

PHPだけで無理そうなら、
ラッパーの、$_SERVER['QUERY_STRING']受け取るシェルプログラム
作って、その中で環境変数にセットしてから目的のプログラムを
呼び出すとか



常連さん
会議室デビュー日: 2004/04/06
投稿数: 38
お住まい・勤務地: 大阪
投稿日時: 2004-10-15 15:44
あらさん
レス有難う御座います。

ご指摘の様に、以下の方法で解決致しました。

>推測ですが、$_ENVとかコマンドラインへ渡される環境変数が
>あるかもしれないので、そっちに追加してコマンド実行してみるとか

コマンド実行の前にputenvで環境変数を設定すると
うまくモジュールに渡り動作致しました。

-----soushin.php-----
<?php
//環境変数を設定
putenv("QUERY_STRING={$_SERVER['QUERY_STRING']}");
//コマンドを実行&戻り値取得
exec("/モジュールへのパス",$ret);

〜省略〜

?>
-----

がるさん、あゆかわさん、あらさん
レス有難う御座いました。

勉強になりました。


[ メッセージ編集済み 編集者: 国 編集日時 2004-10-19 11:20 ]
1

スキルアップ/キャリアアップ(JOB@IT)