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

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