Вот ситуация: я написал внутреннее приложение, которое работает на определенном сервере. На этом сервере есть сценарий, который можно выполнить с внешнего сервера через 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 в виде массива будет еще глупее.
Я также попытался 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);
?>
Мне пока не повезло, может кто-нибудь сказать мне, если я что-то здесь забыл? Что я делаю неправильно? Я что-то здесь пропускаю?