最近在研究git的webhook,想以此实现代码的自动部署。其核心内容就是一个php函数shell_exec()。我找到了一个厉害的php部署工具,叫做Deployer。尽管如此,还是遇到了一个很大的坑。

首先说明一下,这里所说的环境变量,是linux服务器上执行env命令得到的环境变量,为了与apache服务器本身的环境变量区分开来,这里将前者称为系统环境变量。

apache系统环境变量

默认情况下,apache以用户www-data运行服务,系统环境变量就是宿主用户www-data的环境变量。然而,rapache在配置文件中对宿主的环境变量进行了修改。

查看系统环境变量

通过以下php代码,可以查看系统环境变量的内容(前提是关闭php安全模式),可以发现环境变量中是没有HOME的。

1
2
<?php
var_dump(shell_exec('env'));

设置系统环境变量

参考文件/etc/apache2/envvars中的一段配置:

1
2
3
4
# this won't be correct after changing uid
unset HOME
# 省略了一部分配置内容
export APACHE_RUN_USER=www-data

这段配置删除了环境变量HOME,同时配置了APACHE_RUN_USER这一项。有需要修改或者添加环境变量即可按照该格式操作。 如何找到配置文件/etc/apache2/envvars,执行命令find /etc/apache2 -type f|xargs grep APACHE_RUN_USER

解决的问题

使用deployer部署项目,配置文件没有问题。在命令行下部署成功。通过php执行部署命令时,到deploy:vendors这一步失败。开启调试模式,发现composer报错,要求设置HOME或者COMPOSER_HOME环境变量。

1
2
[RuntimeException]
The HOME or COMPOSER_HOME environment variable must be set for composer to run correctly

同时以下代码执行的结果为NULL

1
2
<?php
var_dump(shell_exec('composer'));

按照上一点设置系统环境变量后,deployer成功部署,php脚本也能正常输出内容。

apache环境变量

简单说明一下

设置变量

1
2
3
4
5
<VirtualHost *:80/>
    DocumentRoot /var/www/html
    ServerName www.domain.com
    SetEnv ENV production
</VirtualHost>

获取变量

1
2
<?php
echo $_SERVER['ENV'];

好像在配置文件中也能使用该环境变量,具体方法待查。

参考文章