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 . 安裝好這個之後,右鍵你的文件,就可以快速選擇作為源點,然後軟鏈硬鏈到你想要的地方啦,比直接在終端寫命令要方便直觀很多.

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。