Herman

Herman

PHP バージョンの切り替え

一直以来私は会社で PHP を使用して開発してきましたが、特に問題はありませんでした。7.4 を使ってさまざまな要件を書いて楽しく使っていました。しかし、ある日、私は古いプロジェクトに参加して新しい機能を開発することになりました...

今は新しいプロジェクトを開発しながら、古いプロジェクトに新しい機能を追加しなければなりません。
この古いプロジェクトは PHP のバージョン 5.6 を使用しており、独自の xampp 環境を持っています。5.6 と 7.4 の違いがそれほど大きくなければまだいいのですが、実際にはかなりの違いがあります... 私はいくつかの構文に慣れてしまっていて、無意識に使っています。例えば、簡単なfn匿名関数はよく使いますが、5.6 のバージョンではサポートされていません。長い文字列のマーカーさえもサポートされていません...

これらの問題は本番前に発見することができません。統一された環境でプロジェクトを実行するのが最善です。

ここまでが問題ではありませんが、聞こえるところでは環境変数を切り替えるだけのことです。しかし、私は会社で Windows を開発環境として使用しているため、この環境変数の変更は...

言ってしまえば、Windows で環境変数を変更すると、いつ効果が現れるかは制御できません
つまり、もし私が今すぐ別のバージョンのプロジェクトで何かを変更したい場合、グローバルな環境変数を変更しても、ターミナルを再起動すればすぐに効果が現れるわけではありません。いつ環境変数がリフレッシュされるか本当にわかりません...

唯一の制御可能な手段は再起動です。しかし、私は多くの場合、再起動したくありません!バックグラウンドでスクリプトを実行しているか、他の作業をしているかもしれません。進捗を失いたくありません!

もちろん、環境変数を変更せずに直接パスを使用する方法もありますが、非常に面倒ですし、多くの設定ファイルがデフォルトで環境内の PHP を使用しているため、うまくいかないことがあります。この問題を解決する方法を考えましょう。

この問題にはすでに成熟した解決策があります。
例えば、Python では、コミュニティには仮想環境マネージャーというものがあります。私は以前から使っていました。それは miniconda と呼ばれ、Python の環境のバージョンを簡単に制御することができます。1 つのプロジェクトには 1 つの仮想環境が対応しています。
そこで、PHP にも同様のマネージャーがあるか調べてみました。しかし、最終的には使わなかった... なぜなら、チュートリアルに従って何度か試してみたけれども、うまくいかなかったから、理由がわからなかったから...

簡単に考えてみたら、理解できないエラーだけなら、理解するためのコストはわかりません。この PHPbrew というバージョン管理ツールを使うために、少なくとも 2 時間を確保して問題がどうなっているのかを理解する必要があります...
考えてみたけれど、やめました。環境変数が早く効果を発揮するために、この大きな環境マネージャーを導入するよりも、私は 20 分かけて Windows の環境変数の変更が遅い問題を簡単に解決するスクリプトを実装する方がいいです。

そこで、私は自分で PowerShell スクリプトを作成して、プロファイルに配置しました。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 にはショートカットしか知らなかったので、シンボリックリンクも存在することを考えたことはありませんでした。大学の頃、私はオペレーティングシステムの授業を学んでいるとき、シンボリックリンクはショートカットと同じだと思っていましたが、実際にはいくつかの違いがあります...

もちろん、この方法には制限があります。本物の仮想環境とは異なります。やはりグローバルを変更する必要があります。今は起動設定にphp_version php7.4という行を追加しないと、戻し忘れることがあります〜

そうそう、Windows のプラグインをおすすめします。それはLink Shell Extensionという名前です。これをインストールすると、ファイルを右クリックしてソースとして選択し、シンボリックリンクやハードリンクを簡単に作成できます。コマンドを直接ターミナルに書くよりもはるかに便利です。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。