загрузить .profile с proc_open ()

Вот ситуация: я написал приложение на задней панели, которое работает на определенном сервере. На этом сервере есть скрипт, который может быть выполнен с внешнего сервера, поверх 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 $* 

загрузка профиля и повторный вызов первого скрипта. Я хочу, чтобы этот второй скрипт исчез, я нахожу его глупым … нужен второй скрипт для запуска первого. Я знаю, что можно установить значения среды с помощью proc_open, но переписывать .profile как массив souds еще более глупо. Я также пытался proc_open оболочку 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); ?> 

Мне до сих пор не повезло, может ли кто-нибудь сказать мне, что я что-то забыл? Что я делаю не так? Я что-то забыл?

У меня нет 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