Herman

Herman

PHP 版本切换

一直以来我在公司使用 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 . 安装好这个之后,右键你的文件,就可以快速选择作为源点,然后软链硬链到你想要的地方啦,比直接在终端写命令要方便直观很多.

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。