3

状況は次のとおりです。特定のサーバーで実行されるバックエンドアプリケーションを作成しました。このサーバーには、フロントエンドサーバーからssh経由で実行できるスクリプトがあります。次に、スクリプト自体で環境変数に大きく依存しているため、スクリプトは必要な環境変数が正しくロードされているかどうかを確認します。

これはうまくいきますが、私が望む方法ではありません。接続が確立されると、もちろん、機能しないを使用して./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);
?>

今のところ運が悪かったのですが、ここで何かを忘れているかどうか誰か教えてもらえますか?私は何が間違っているのですか?私はここで何かを見落としていますか?

4

1 に答える 1

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

私が持っている出力:

[galymzhan@dinohost ~]$ ./test.php 
Output:
Got env var foobar
于 2012-03-24T07:50:59.383 に答える