5

我通常像这样在 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')

使用这些,导出的变量不会出现在 $_SERVER 中。

有任何想法吗?

4

3 回答 3

4

您的变量不可用,因为它们所在的 shell 已退出。您需要在同一个 shell 中执行 PHP 以获得它的变量。

在设置变量后编辑 myscript.sh 以启动 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
于 2012-04-24T17:32:22.627 回答
1

首先,如果您正在创建命令行 php 脚本,我不知道您将在 $_SERVER 数组上获得多少环境变量。

您可能想尝试使用该getenv()功能:http ://www.php.net/manual/en/function.getenv.php

另外,要获取您的文件,您是否尝试过这样做?:

exec('source ./myscript.sh')

让我知道这是否有帮助!

于 2012-04-24T17:33:11.890 回答
1

将文件导入 shell,例如bash,要求 shell 正在运行,它只是读取该文件并解释它。当您php从 shell 命令行运行时,它会派生一个继承环境的单独进程。当该进程结束时,它会丢弃包括环境在内的可执行文件的内存占用。

至于PHP执行脚本,它会做同样的事情 - 为bash(例如)创建单独的进程并让该进程读取脚本,解释它,遵循它的命令,然后当它结束时进程将随着它所做的环境变化而终止。

因此,一个可能的解决方案是执行以下操作。

  1. PHP 脚本需要确定其在文件系统中的位置。
  2. PHP 脚本需要确定它是否在调用它自己。
  3. 如果脚本没有调用自己,请运行 bash 脚本来设置环境,添加一个额外的环境变量以使其确定不再沿着这条路线走,并执行 itelt。也许使用类似的东西popen来触发bash命令source,,exportexec php
  4. 如果 scipt 正在调用自己,只需执行

似乎很麻烦。只需编写一个脚本来设置环境,然后启动 PHP。

于 2012-04-24T17:59:45.840 回答