状況は次のとおりです。特定のサーバーで実行されるバックエンドアプリケーションを作成しました。このサーバには、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);
?>
が、私はここで何かを忘れていた場合、これまで、誰も私を伝えることができますこれで運がなかったですか?私は間違って何をしていますか?私はここで何か見落としていますか?
本当に '.profile'から環境変数をロードする必要がありますか?つまり、これらの変数をPHPスクリプトにハードコードするだけではないのですか?どのようにPHPスクリプトの中でこれらの変数を使用していますか? – galymzhan
はい、あります。 '.profile'は100以上の変数とエイリアスを含んでいます。私のスクリプトは、環境変数に依存する2つのスクリプトを呼び出します。必要な環境変数は、処理しているデータによって異なります。私はこのデータを前処理し、それに応じて適切な変数をロードすることができましたが、それはデバッグに時間がかかります。このスクリプトは、当社のサーバーのいずれかでも実行できるはずです。ハードコーディングとは、あらゆる環境のスクリプトを書くことを意味します。それはちょうど今私が使用しているkornシェルスクリプトのアプローチを使用するよりも不器用に思えます。 –