情况是这样的:我编写了一个后端应用程序,在某个服务器上运行。在此服务器上,有一个可以通过 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
shell,加载配置文件并从其内部再次运行脚本。结果发现脚本不断调用自身,让我相信配置文件根本没有加载。
到目前为止,这是我的尝试:
#!/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);
?>
到目前为止我还没有运气,谁能告诉我我是否在这里忘记了什么?我究竟做错了什么?我在这里忽略了什么吗?