我通常在 linux 上的 bash 终端中获取一个 *.sh 文件,如下所示
. ./myscript.sh
在运行命令行 PHP 脚本之前,我可以使用 PHP 的 $_SERVER 超级全局访问导出的环境变量。
是否可以从 PHP 脚本本身中获取 sh 文件,然后访问它导出的变量?
我尝试了各种方法,但没有成功。我试过了
system('. ./myscript.sh')
system('sh ./myscript.sh')
exec('. ./myscript.sh')
exec('sh ./myscript.sh')
shell_exec('. ./myscript.sh')
shell_exec('sh ./myscript.sh')
使用这些,导出的 var 不会显示在 $_SERVER 中。
有什么想法吗?
您的变量不可用,因为它们存在的 shell 已退出。你需要从同一个 shell 中执行 PHP 才能获得它的变量。
编辑 myscript.sh 以在设置 vars 后启动 PHP 脚本:
export VAR1=1
export VAR2=2
php -f /path/to/script.php
或者编写另一个包装器脚本来获取您的文件,然后从同一个 shell 启动 PHP:
. ./myscript.sh
php -f /path/to/script.php
编辑:或者像这样运行脚本:
. ./myscript.sh && php -f /path/to/script.php
首先,如果你正在创建一个命令行php脚本,我不知道你会在$_SERVER数组上得到多少env变量。
您可能需要尝试使用 getenv()
函数:http://www.php.net/manual/en/function.getenv.php
另外,要获取文件,您是否尝试过这样做?
exec('source ./myscript.sh')
让我知道是否有任何帮助!
将
文件源到 shell 中,例如 bash
,需要 shell 运行,它只是读取该文件并解释它。当您从 shells 命令行运行 php
时,它会分叉一个继承环境的单独进程。当该过程结束时,它会丢弃可执行文件(包括环境)的内存占用量。
至于让PHP
执行脚本,它将做同样的事情 - 为bash
创建单独的进程(例如),并让该进程在脚本中读取,解释它,遵循它的命令,然后当它结束时,进程将随着它所做的环境更改而终止。
因此,可能的解决方案是执行以下操作。
- PHP 脚本需要确定其在文件系统中的位置。
- PHP 脚本需要确定它是否在调用它自己。
- 如果脚本没有调用自身,请运行 bash 脚本来设置环境,添加一个额外的环境变量,使其能够确定它不会再次沿着这条路走并执行它。也许使用类似
popen
的东西来触发bash
命令source
、export
、exec php
- 如果 scipt 正在调用自己,只需执行
似乎很麻烦。只需编写一个脚本来设置环境,然后启动 PHP。