2012-03-23 7 views
3

状況は次のとおりです。特定のサーバーで実行されるバックエンドアプリケーションを作成しました。このサーバには、sshを介してフロントエンドサーバから実行できるスクリプトがあります。私のスクリプトは、必要な環境変数が正しく読み込まれているかどうかをチェックします。なぜなら、スクリプト自体に大きく依存しているからです。proc_open()で.profileをロードする

これは機能しますが、これは機能しません。接続が確立されると、もちろん./profileはロードされず、exec('source /home/user/.profile');を使用しても動作しません。スクリプトは既に実行中です。

#!/to/php/bin/php -n 
<?php 
    if (!$_SERVER['VAR_FROM_PROFILE']) 
    { 
     exec('/absolute/path/to/helperscript '.implode(' ',$argv),$r,$s); 
     if ($s !== 0) 
     { 
      die('helper script fails: '.$s); 
     } 
     exit($r[0]); 
    } 

ヘルパースクリプトはkshのスクリプトであること:

#!/path/ksh 
source /.profile 
$* 

プロファイルをロードし、そして再び最初のスクリプトを呼び出すスクリプトは次のように起動する理由です 。 私はこの2番目のスクリプトを消して欲しい、私はそれが愚かであると思う...最初のスクリプトを実行するために2番目のスクリプトが必要です。私は、proc_openで環境値を設定することは可能だが、.profileを配列として再書込みすることも可能であることを知っている。 また、proc_openシェルを試して、プロファイルを読み込んで、スクリプトをその内部から再度実行してください。スクリプトが自分自身を呼び出し続けていることが判明しただけで、プロファイルがまったく読み込まれないと私は思っています。

ここに私の試みは、これまでのところです:

#!/to/php/bin/php -n 
<?php 
    if (!$_SERVER['VAR_FROM_PROFILE'] && $argv[1] !== 'fromself') 
    { 
     $res = proc_open('ksh',array(array('pipe','r'),array('pipe','w'),array('pipe','w')),$pipes); 
     usleep(5); 
     fwrite($pipes[0],'source /home/user/.profile & '.$argv[0].' fromself'); 
     fclose($pipes[0]);//tried using fflush and a second fwrite. It failed, too 
     usleep(1); 
     echo stream_get_contents($pipes[1]); 
     fclose($pipes[1]); 
     proc_close($res); 
     exit(); 
    } 
    var_dump($_SERVER); 
?> 

が、私はここで何かを忘れていた場合、これまで、誰も私を伝えることができますこれで運がなかったですか?私は間違って何をしていますか?私はここで何か見落としていますか?

+0

本当に '.profile'から環境変数をロードする必要がありますか?つまり、これらの変数をPHPスクリプトにハードコードするだけではないのですか?どのようにPHPスクリプトの中でこれらの変数を使用していますか? – galymzhan

+1

はい、あります。 '.profile'は100以上の変数とエイリアスを含んでいます。私のスクリプトは、環境変数に依存する2つのスクリプトを呼び出します。必要な環境変数は、処理しているデータによって異なります。私はこのデータを前処理し、それに応じて適切な変数をロードすることができましたが、それはデバッグに時間がかかります。このスクリプトは、当社のサーバーのいずれかでも実行できるはずです。ハードコーディングとは、あらゆる環境のスクリプトを書くことを意味します。それはちょうど今私が使用しているkornシェルスクリプトのアプローチを使用するよりも不器用に思えます。 –

答えて

4

私にはkshがありませんが、bashで管理しています。

/home/galymzhan/.bash_profile:

export VAR_FROM_PROFILE="foobar" 

/home/galymzhan/test.php

#!/usr/bin/php -n 
<?php 
if (!isset($_SERVER['VAR_FROM_PROFILE'])) { 
    $descriptors = array(0 => array('pipe', 'r'), 1 => array('pipe', 'w')); 
    $process = proc_open('bash', $descriptors, $pipes); 
    fwrite($pipes[0], escapeshellcmd('source /home/galymzhan/.bash_profile') . "\n"); 
    fwrite($pipes[0], escapeshellcmd('/home/galymzhan/test.php') . "\n"); 
    fclose($pipes[0]); 
    echo "Output:\n"; 
    echo stream_get_contents($pipes[1]); 
    echo "\n"; 
    fclose($pipes[1]); 
    proc_close($process); 
    exit; 
} 
print "Got env var {$_SERVER['VAR_FROM_PROFILE']}\n"; 
// Useful part of the script begins 

出力私が持っている:

[[email protected] ~]$ ./test.php 
Output: 
Got env var foobar 
+0

ありがとう、私はそれが欲しかったようにこれは働いたので、同じルールはkorn snellに適用されるようです。 –

関連する問題