티스토리 뷰

맥에서 PHP 개발을 하다 보면 프로젝트마다 요구 버전이 달라서 곤란할 때가 있다. 레거시 프로젝트는 PHP 7.x를 요구하는데 신규 프로젝트는 8.3을 쓰는 식이다.

이 글은 원래 인텔 맥 시절에 brew-php-switcher로 PHP 7.1을 설치하던 방법을 정리한 것이었다. 지금은 상황이 많이 달라져서 당시 방법과 현재 방법을 나눠서 정리한다.


당시 방법 (인텔 맥, Homebrew 구버전)

# PHP 스위쳐 설치
$ brew install brew-php-switcher

# 옵션 설치
$ brew install openldap libiconv

# 구버전 저장소(tap) 추가
$ brew tap exolnet/homebrew-deprecated

# php7.1 설치
$ brew install php@7.1

# 버전 전환
$ brew-php-switcher 5.6
$ brew-php-switcher 7.0

당시에는 이걸로 잘 됐다. 그런데 지금 이 명령을 그대로 실행하면 대부분 실패한다.

지금은 왜 안 되나

  • Homebrew 경로가 바뀌었다. 애플 실리콘 맥은 /usr/local이 아니라 /opt/homebrew를 쓴다. 경로를 하드코딩한 스크립트는 동작하지 않는다.
  • PHP 7.x는 공식 지원이 끝났다. 7.4조차 2022년 11월에 보안 지원이 종료됐다. homebrew/core에서 빠졌고, exolnet/homebrew-deprecated 같은 비공식 tap도 관리가 중단되거나 애플 실리콘 빌드를 제공하지 않는 경우가 많다.
  • 구버전 PHP는 arm64 바이너리가 없다. 소스 빌드를 시도해도 최신 macOS SDK와 충돌해서 실패하는 경우가 흔하다.

현재 권장 방법 1: shivammathur/php tap

여러 PHP 버전을 병행해서 쓰려면 지금은 이 tap이 사실상 표준이다. 애플 실리콘 빌드를 제공하고, 구버전도 상당 기간 유지해준다.

brew tap shivammathur/php

# 원하는 버전 설치
brew install shivammathur/php/php@8.3
brew install shivammathur/php/php@8.1

# 전환
brew unlink php && brew link --overwrite --force php@8.1
php -v

전환 명령이 길어서 셸 함수로 만들어두면 편하다.

# ~/.zshrc
phpv() {
  brew unlink php@8.1 php@8.2 php@8.3 2>/dev/null
  brew link --overwrite --force php@$1
  php -v
}

# 사용
$ phpv 8.1

현재 권장 방법 2: 프로젝트별 자동 전환 (PHP Monitor / phpenv)

버전을 수동으로 바꾸는 건 결국 잊어버린다. 프로젝트 디렉터리에 들어가면 자동으로 맞춰지는 방식이 훨씬 낫다.

  • PHP Monitor: 맥 메뉴바 앱. 클릭 한 번으로 버전 전환이 되고, Valet 연동과 프로젝트별 자동 감지를 지원한다. GUI를 선호하면 이쪽.
  • phpenv: rbenv 방식. .php-version 파일을 프로젝트 루트에 두면 해당 디렉터리에서 자동 적용된다. CLI 중심이면 이쪽.

현재 권장 방법 3: 아예 Docker로 격리

솔직히 레거시 PHP를 만져야 한다면 이게 가장 현실적이다. 호스트 맥에 구버전을 설치하려고 씨름하는 것보다 컨테이너 안에서 도는 게 낫다.

# docker-compose.yml
services:
  app:
    image: php:7.4-fpm
    volumes:
      - .:/var/www/html
    working_dir: /var/www/html

장점이 명확하다.

  • 호스트 환경을 오염시키지 않는다
  • 팀원 전원이 완전히 동일한 버전과 확장을 쓴다
  • 운영 서버와 같은 이미지를 쓸 수 있다
  • 애플 실리콘에서도 platform: linux/amd64 로 구버전 이미지를 돌릴 수 있다

EOL 버전을 로컬에 직접 설치하는 건 보안 측면에서도 권장되지 않는다. 지원이 끝난 PHP는 취약점이 나와도 패치가 안 나온다.

그래서 어떻게 할까

상황 선택
현행 버전(8.1~8.4) 여러 개 병행 shivammathur/php + PHP Monitor
EOL 버전(7.x 이하) 유지보수 Docker
프로젝트마다 자동 전환 phpenv + .php-version

정리

  • brew-php-switcher + exolnet/homebrew-deprecated 조합은 지금은 대부분 동작하지 않는다
  • 애플 실리콘 Homebrew 경로는 /opt/homebrew
  • 현행 버전 병행은 shivammathur/php tap
  • EOL 버전은 로컬 설치보다 Docker 격리가 낫다
  • 수동 전환은 결국 잊어버린다. PHP Monitor나 phpenv로 자동화할 것
댓글


최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday