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という名前です。これをインストールすると、ファイルを右クリックして、ソースポイントとして選択し、ソフトリンクやハードリンクを簡単に作成できます。コマンドラインでコマンドを書くよりもはるかに便利です。

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