一直以来我在公司使用 PHP 开发都没什么阻碍,开开心心的用着 7.4 写着各种需求。直到有一天,我开始加入一个老项目参与新功能的开发……
现在就出现了我既要开发新项目,又要在老项目里面加新功能的情况.
这个老项目使用的 PHP 版本是 5.6, 有一套自己的 xampp 环境的那种。如果 5.6 和 7.4 差别不到就还好,问题是差别还有点大…… 有些语法我用习惯了,一直不自觉的在用,比如简单的 fn
匿名函数,我就经常在用,在 5.6 版本是不支持的。甚至长字符串标记都不支持...
这些问题不能在上线前才发现,最好还是和项目统一环境.
直到这里都还不算什么问题,听起来就是自己切换一下环境变量的事情。可惜在公司我是用的是 Windows 作为开发环境,这个环境变量的修改啊……
这么说吧,在 Windows 上修改环境变量,什么时候生效是不可控的.
也就是说假如我现在临时要跑到另一个版本不一样的项目改点东西,我改了下全局的环境变量,那不是重开一下终端就能生效了的,真不知道什么时候环境变量会开始刷新……
唯一一个能控制生效的手段是重启。但很多时候我并不想重启啊!我后台跑着脚本呢,或者干着其他事情呢,我不想丢失进度!
当然也有麻烦的办法,不改环境变量直接用路径也不是不行,就是特别麻烦,太多配置文件默认用环境里的 PHP 咯。还是想想办法解决这个问题吧.
这种问题其实也有成熟的解决方案了.
比如 Python, 社区里面有一款虚拟环境管理器,我之前一直在用,叫 miniconda, 它就可以很方便的控制 Python 环境的版本,一个项目就对应着一个虚拟环境.
所以我查了一下,PHP 自然也有类似的管理器。但我最终没有用…… 因为我照着教程走了一两遍,都失败了,原因没搞明白……
我简单思考了下,如果都是些我看不太明白的错,那搞明白的成本就不好说了,为了用上这个所谓的 PHPbrew 管理 PHP 版本,我至少要预留 2 小时去搞清楚到底怎么回事……
想了想,算了,不值得。为了让环境变量生效快点,我不得不引入一个这么大的环境管理器,还不如我自己花 20 分钟简单实现个脚本解决 Windows 改环境变量生效慢的问题.
于是我就自己手撸了一个 powershell 脚本放到我的 profile 里面,直接 php_version xxx
就能环境变量马上切换到我需要的 PHP 版本上去.
所以我到底使用了什么魔法,让环境变量立刻就生效了捏?
哈,答案可能让你失望了哈。我是绕过了这个问题.
既然环境变量生效慢,还不知道什么时候会刷新,那么最好就不要随意更改变量,就让它固定在那里吧。所以现在要解决的核心问题是:如何在不改变路径的情况下,让路径实际使用的 PHP 版本发生变化?
这个问题很简单,应该经常使用 Linux 的同学马上就想到了吧……
没错,我创建了一个叫 current
的文件夹软连接,软链接指向的是我当前 Windows 内默认的 PHP 环境。我的 Windows 环境变量就是指向的是这个 current 文件夹.
我的 powershell 脚本要做的事情,就是每当我调用这个函数,就把我的软链接删掉,指向我指定的新的位置.
function php_version {
param (
[Parameter(Mandatory=$true)]
[string]$version
)
$curr_php_path = "$env:PHP_HOME\current";
if (Test-Path $curr_php_path) {
Write-Host "Removing current PHP version"
cmd /c rmdir $curr_php_path
}
$target_php_path = "$env:PHP_HOME\$version";
if (!(Test-Path $target_php_path)) {
Write-Host "PHP version $version not found"
return
}
sudo New-Item -Path $curr_php_path -ItemType SymbolicLink -Value $target_php_path
Write-Host "PHP version $version set as current"
php --version
}
就这样,非常简单的实现了 PHP 版本切换的功能~
灵感其实来源于 Windows 的包管理器 scoop…… 它对软件版本的管理就是靠软链接,更新了之后新版本默认指向 current 就行了.
想起来以前我只知道 Windows 上有快捷方式,从来没有想过其实软硬链接都有的。大学时天真的我,在学习操作系统这门课的时候,以为软链接就是快捷方式,然而还是有不少区别的……
当然,这个方法局限性很大,跟 Python 那种真正的虚拟环境不一样。毕竟一改就是要改全局的嘛。现在我我不得不在启动配置上,都加上一条 php_version php7.4
才能避免忘记改回去的尴尬~
对了,推荐 Windows 上的一个插件,叫做 Link Shell Extension
. 安装好这个之后,右键你的文件,就可以快速选择作为源点,然后软链硬链到你想要的地方啦,比直接在终端写命令要方便直观很多.