PHP 8용 WordPress 사이트를 준비하는 방법
게시 됨: 2022-07-06워드프레스 사이트에는 PHP가 필요하며 PHP가 발전함에 따라 워드프레스도 이를 따라갔습니다. 가장 최근에는 PHP 7.4가 WordPress VIP 플랫폼의 기본 PHP 버전이 되었습니다. 그러나 PHP 7.4의 보안 지원이 2022년 11월에 종료됨에 따라 강력한 보안을 유지하려면 WordPress 사이트를 업그레이드해야 합니다. 이러한 이유로 WordPress VIP 플랫폼은 모든 고객 애플리케이션을 PHP 8.0에서 실행하도록 이동할 것입니다.
다음은 변경 사항에 대한 설명이며 고객과 다른 플랫폼에서 WordPress를 사용하는 다른 사람들이 준비할 수 있는 단계입니다.
목차
- PHP 8.0 이야기
- 새로운 기능
- PHP 및 WordPress 커뮤니티 전반에 걸친 지원 확대
- PHP 8.0 호환성 문제를 찾는 방법
- PHPCompatibility 표준과 함께 PHP_CodeSniffer 사용
- PHP 8.0에서 PHP 치명적인 오류인 알려진 PHP 경고 해결
- 자동화된 테스트 만들기
- PHPStan/시편 또는 다른 정적 분석 도구 사용
- WordPress VIP에서 PHP 8.0을 시작하는 방법
- 로컬에서 애플리케이션 실행
- pull 요청 시 VIP 코드 분석 봇 확인
- WordPress VIP 애플리케이션에서 PHP 8 활성화
- 사전 예방적 도움 활용
- PHP 8.1은 어떻습니까?
PHP 8.0 이야기
2020년 11월에 출시된 PHP 8.0은 버그에 대한 새로운 코드(및 더 짧은 코드)의 복원력을 높이는 몇 가지 개선 사항과 기능을 제공했습니다.
대부분의 개발자는 PHP 8.0에서 상당한 이점을 발견할 것입니다. 그러나 주요 버전으로서 몇 가지 주요 변경 사항이 포함되어 있습니다. 이것은 예를 들어 PHP 7.3에서 PHP 7.4로의 변경보다 PHP 7.4에서 PHP 8.0으로의 전환을 어렵게 만듭니다. 특히 핵심 PHP에는 49개의 주요 변경 사항이 있었고 코드가 의존할 수 있는 라이브러리 및 확장을 포함하여 PHP 8 전체에 걸쳐 169개가 있었습니다.
좋은 소식은 조직이 PHP 8.0으로 이동하면 2023년 11월까지 핵심 PHP 프로젝트에서 보안 지원을 받게 된다는 것입니다. 그 날짜 이후에는 조직에서 훨씬 더 작은 변경이 필요한 마이너 릴리스인 PHP 8.1로 업그레이드해야 합니다.
새로운 기능
PHP 8.0은 1) 극단적인 경우와 불일치를 수정하여 PHP를 보다 견고하고 예측 가능한 스크립팅 언어로 만들고 2) 언어를 전반적으로 개선하기 위한 새로운 기능을 제공하도록 설계되었습니다. 여기에는 다음과 같은 몇 가지 새로운 구문이 포함됩니다.
- 통합 유형,
static
및mixed
유형,Stringable
인터페이스, 숫자 처리 변경과 같이 엄격한 유형의 코드를 더 쉽게 작성할 수 있습니다. - 예를 들어 nullsafe 연산자, 생성자 속성 승격,
match
연산자 및 캡처하지 않는 캐치와 같이 유지 관리해야 하는 코드의 양을 줄입니다. - 객체에
::class
허용, 매개변수 목록의 후행 쉼표,str_contains()
,str_starts_with()
및str_ends_with()
함수, throw 표현식, 속성과 같은 코드를 단순화합니다.
여기에는 명명된 매개변수도 포함됩니다. 그러나 WordPress 코어는 이 기능과의 호환성을 주장하지 않습니다. 따라서 명명된 매개변수를 사용하여 고유한 사용자 정의 함수를 호출할 수 있지만 WordPress 함수를 호출하면 안 됩니다. 매개변수 이름이 향후 경고 없이 변경될 수 있기 때문입니다.
PHP 및 WordPress 커뮤니티 전반에 걸친 지원 확대
새 구문이 포함된 새 버전의 PHP가 출시될 때마다 PHP 및 WordPress 커뮤니티 전체에서 새 구문이 지원되는 데 시간이 걸립니다.
PHP 개발자 도구
Composer, PHPUnit, PHP_CodeSniffer, PHPStan, Xdebug 및 다양한 IDE와 같은 PHP 개발 도구는 모두 새 버전의 PHP의 새 구문을 인식해야 합니다. PHP가 지속적으로 개발되고 있지만 새 버전에 대한 전체 생태계를 사용할 수 있기까지 지연 시간이 있을 수 있습니다. 그러나 사전에 제공되는 alpha , beta 및 릴리스 후보 릴리스를 기반으로 개발 작업이 진행되었기 때문에 최종 릴리스가 준비될 때까지 도구를 사용할 수 있는 경우가 많습니다. 이러한 모든 도구와 그 이상은 이제 PHP 8.0을 지원하므로 PHP 코드 개발 및 특히 WordPress 개발에 적합합니다.
워드프레스 코어
다음으로 WordPress 코어는 PHP 8.0을 지원해야 합니다. WordPress 프로젝트는 새 버전의 PHP가 출시될 때까지 오랫동안 호환성을 유지해 왔습니다. Make WP에서 잘 작성된 이 게시물에 따르면 WordPress는 2020년 12월 WordPress 5.6 릴리스 이후 PHP 8.0과 "베타 호환성"을 유지했습니다. "베타 호환성"은 무엇을 의미합니까? 이는 WordPress가 PHP 8.0에서 제대로 실행될 수 있음을 의미하지만 WordPress 코어 파일에서 엄격한 유형을 선언하거나 WordPress 핵심 기능과 함께 명명된 매개변수를 사용하는 것과 같은 기능은 지원되지 않습니다.
워드프레스 VIP 플랫폼
WordPress VIP 플랫폼은 2022년 5월부터 PHP 8.0(및 PHP 8.1)을 지원했으며, 여기에는 플랫폼이 엔터프라이즈 요구 사항을 충족할 수 있도록 하는 플러그인 및 기능이 포함됩니다.
타사 플러그인
WordPress에는 수만 개의 플러그인이 있으며 PHP 8.0에 대한 지원 수준은 매우 다양합니다. 예를 들어 플러그인에서 새로 예약된 단어를 계속 사용하거나 PHP 기본 함수에 전달되는 매개변수가 현재 예상되는 유형이 아닐 수 있습니다. 따라서 타사 플러그인은 PHP 8.0과의 비호환성이 애플리케이션에 영향을 줄 수 있는 영역 중 하나일 수 있습니다.
아래에서 이러한 비호환성을 확인하는 방법을 배울 수 있습니다. 옵션에는 업스트림 개인/팀에게 수정 작업을 수행하고 새 릴리스를 만들도록 요청하거나, 당사의 주요 파트너 중 하나와 같은 사내 개발 팀 또는 에이전시가 플러그인을 분기하고 스스로 수정하도록 하는 것이 포함됩니다.
커스텀 플러그인
WordPress VIP 플랫폼의 거의 모든 고객은 하나 이상의 사용자 정의 플러그인을 사용합니다. 타사 플러그인과 마찬가지로 호환성도 확인해야 합니다. 원래 개발자에게 발견된 문제를 해결하도록 요청하는 것이 일반적으로 최선의 조치입니다.
타사 또는 사용자 정의 테마
플러그인이 호환성 문제의 가장 가능성 있는 원인이지만 타사 및 사용자 정의 테마도 PHP 8.0과 호환되어야 한다는 점을 잊지 마십시오. 플러그인 코드 호환성을 확인하는 동일한 접근 방식이 테마 코드에도 적용됩니다.
PHP 8.0 호환성 문제를 찾는 방법
개발 팀이 호환성 문제를 결정하기 위해 코드를 검토하는 데 사용할 수 있는 네 가지 주요 접근 방식이 있습니다.
- PHPCompatibility 표준과 함께 PHP_CodeSniffer를 사용하십시오.
- PHP 8.0에서 PHP 치명적인 오류인 알려진 PHP 경고를 해결합니다.
- 자동화된 테스트를 만듭니다.
- PHPStan/시편 또는 다른 정적 분석 도구를 사용하십시오.
PHPCompatibility 표준과 함께 PHP_CodeSniffer 사용
PHP_CodeSniffer(PHPCS)는 PHP 파일을 토큰화하고 정의된 코딩 표준 세트의 위반을 감지합니다. WordPress 코딩 표준용 패키지와 자체 VIP 코딩 표준(고객이 사용하도록 권장함)이 있습니다.
PHPCompatibility 및 PHPCompatibilityWP라는 패키지도 있으며 이러한 표준은 PHP 버전 간 호환성을 위해 코드베이스를 분석합니다.
결과는 도구 기능과 준비 상태에 따라 달라지므로 버전 10이 릴리스될 때까지 PHPCompatibility의 develop
분기를 사용하는 것이 필수적입니다. 버전 10에는 PHP 8.0(및 PHP 8.1) 호환성과 관련된 스니프가 포함됩니다. develop
분기를 사용하도록 구성을 설정하는 방법에 대한 지침은 문서를 참조하십시오. 버전 10이 출시되면 해당 버전을 대신 사용할 수 있습니다.
PHPCompatbilityWP 패키지는 PHPCompatibility 패키지 위에 빌드되지만 WordPress 코어 자체에 포함된 이전 버전과의 호환성 항목에 대한 몇 가지 검사를 해제합니다.
PHPCS 및 PHPCompatibility/PHPCompatibilityWP를 설정하면 다음 검사를 실행할 수 있습니다.
phpcs --standard=PHPCompatibilityWP --severity=1 --runtime-set testVersion 8.0- --extensions=php <path-to-code>
<path-to-code>
는 소규모로 시작하려는 경우 단일 사용자 지정 또는 타사 플러그인 또는 테마일 수 있고 조사 및 해결이 필요한 모든 위반을 확인하려는 경우 전체 저장소일 수 있습니다.
스캔 단계는 가능한 모든 PHP 버전 호환성 문제(예: 잘못된 런타임 값 유형)를 감지하지는 않지만 구문과 관련된 가장 일반적인 문제를 식별하는 데 도움이 됩니다.
PHP 8.0에서 PHP 치명적인 오류인 알려진 PHP 경고 해결
PHP 8.0에서는 경고가 치명적인 오류 및 TypeError 예외가 되는 재분류된 엔진 경고가 표시되었습니다(일부 알림은 경고가 됨). PHP 7.4에서 찾아야 할 PHP 경고 텍스트는 다음과 같습니다.
-
Attempt to assign property '*' of non-object
-
Attempt to modify property '*' of non-object
-
Attempt to increment/decrement property '*' of non-object
-
Creating default object from empty value
-
Cannot use a scalar value as an array
-
Cannot add element to the array as the next element is already occupied
-
Cannot unset offset in a non-array variable
-
Only arrays and Traversables can be unpacked
-
Invalid argument supplied for foreach()
-
Illegal offset type
-
Illegal offset type in isset or empty
-
Illegal offset type in unset
-
Cannot assign an empty string to a string offset
-
Division by zero
-
Use of undefined constant *
이러한 경고를 수정하는 것은 애플리케이션이 PHP 8.0과 호환되도록 하는 데 필수적입니다.
참고: PHP 7.4에서는 경고가 아닌 다른 치명적인 오류가 PHP 8.0에서 있습니다. 예는 다음과 같습니다.
- private 메소드는 생성자를 제외하고 final로 선언될 수 없습니다.
- 매직 메서드에 대한 잘못된 서명입니다.
- 추상 특성 메서드 서명 유효성 검사
- 부모 클래스와 함께
parent::
사용. - 호환되지 않는 오버로드된 메서드 서명(Liskov 대체 원리)
이러한 알려진 변경 사항을 해결하는 것이 좋은 출발점입니다. TypeError는 엄격한 유형 검사가 선언되지 않은 경우에도 유효하지 않은 매개변수 유형이 전달되는 경우와 같이 모든 내부 PHP 함수에 대해 일관되게 발생합니다.
또한 @
연산자는 PHP 8.0에서 더 이상 치명적인 오류를 침묵시키지 않습니다.
당연히 애플리케이션은 이상적으로는 오류, 경고 및 알림을 생성하지 않아야 합니다. 당신은 당신이 찾은 모든 것을 해결하는 것이 좋습니다. 8.x에서 일부 PHP 경고는 PHP 9.0에서 치명적인 오류가 될 수 있습니다. 예를 들어, 잠재적으로 PHP 8.x에서 잘못된 논리가 발생할 수 있습니다. 이러한 문제와 개발 중에 "발견을 피하는" 문제를 수정하기 위해 출시 전후에 개발 시간에 구축하는 것이 모범 사례입니다. 또한 사이트 안정성과 관련 기능에 대한 허용 기준을 정확하게 충족하는 능력에 대한 투자입니다.
자동화된 테스트 만들기
자동화된 테스트에는 다양한 유형이 있지만 여기서는 다음을 의미합니다.
- 단위 테스트 - 모든 WordPress 정의 함수 또는 클래스를 모방하고 테스트를 실행하는 데 사용할 수 있는 데이터베이스 인스턴스가 필요하지 않습니다.
- 통합 테스트 - WordPress를 로드하고 실제 테스트 데이터베이스를 사용합니다.
이 주제는 너무 커서 여기에서 잘 다루지 않지만 고려해야 할 몇 가지 사항이 있습니다.
- 결과는 테스트 스위트의 완성도에 따라 다릅니다. 테스트가 많지 않으면 호환성을 보장하는 데 필요한 범위가 부족합니다.
- 엄격한 주장을 사용하십시오. 예를 들어
assertEquals()
를 사용하면 느슨한 비교가 수행되는 반면assertSame()
은 유형도 확인합니다. - 엄격한 코드 적용 범위를 사용합니다. PHPUnit 구성 파일에
beStrictAboutCoversAnnotations=”true”
및forceCoversAnnotations=”true”
를 추가한 다음@covers
주석을 사용하여 테스트 전체에서 정확한 국제 코드 적용 수준을 찾습니다. - 가장 엄격함 관련 문제가 발생하는 곳이므로 행복한 (예상 입력을 기반으로 한 동작) 및 불행한 (예기치 않은 입력을 기반으로 한 동작) 경로를 테스트하여 예상된 방식으로 기능이 실패하는지 확인합니다.
- PHP 8.0에서 테스트를 실행합니다. 통합(WordPress) 테스트의 경우 2021년에 PHP 8.0을 지원하는 PHPUnit의 이후 버전을 사용하여 잠금 해제된 WordPress 핵심 테스트 제품군이 변경되었습니다. 이것은 PHPUnit Polyfills, Brain Monkey 및 Mockery 지원, WordPress 기능에 대한 추가 기능 스텁, 콘텐츠 생성을 위한 팩토리 메소드와 같은 모든 WP 기본 테스트 유틸리티에 대한 액세스를 포함하는 WP 테스트 유틸리티 패키지에서 지원됩니다.
- 수정을 시도하기 전에 테스트를 작성하여 호환성 변경이 성공했는지 더 확신할 수 있습니다.
PHPStan/시편 또는 다른 정적 분석 도구 사용
PHPCS는 일부 비호환성을 포착하지만 PHPCS가 포착하도록 설계되지 않은 일부 런타임 변경 사항이 있습니다. 놓칠 수 있는 한 가지 예는 네이티브 PHP 함수가 매개변수로 전달할 수 있는 유형이 더 엄격하다는 것입니다.
여기에서 PHPStan, 시편 또는 다른 정적 분석 도구와 같은 도구가 도움이 될 수 있습니다. 그러나 가장 효과적이려면 코드베이스에서 엄격한 유형(코드의 매개변수 및 반환 유형)을 사용하거나 올바르게 문서화해야 합니다(DocBlocks의 @param
및 @return
라인).
이러한 도구에는 일반적으로 가장 낮은 수준의 문제를 먼저 수정한 다음 점진적으로 도구를 추가로 통합하여 코드베이스의 품질을 개선할 수 있는 규칙 수준이 있습니다.
phpstan-wordpress 및 psalm-plugin-wordpress와 같은 확장을 통해 WordPress 핵심 코드 유형에 대한 지식을 추가할 수 있습니다.
구성되면 각 실행은 예기치 않은 유형을 함수에 전달하는 위치를 강조 표시하므로 치명적인 TypeError 예외가 발생할 수 있습니다. 이들 각각을 수정해야 합니다.
많은 경우에 try-catch 블록이나 유형 변환을 사용하여 TypeError 예외를 억제할 수 있습니다. 그러나 그렇게 하지 않는 것이 좋습니다. 근본 원인을 수정하면 코드가 더 강해지고 깨지기 쉬우며 오류가 발생하기 쉬우며 장기적으로는 거의 항상 성과를 거둘 것입니다.
WordPress VIP에서 PHP 8.0을 시작하는 방법
로컬에서 애플리케이션 실행
응용 프로그램의 인스턴스를 로컬에서 실행하는 것은 호환성 문제를 감지하고 수정할 수 있는 합리적인 첫 번째 단계입니다. 모든 로컬 개발 환경을 사용할 수 있지만 WordPress VIP 플랫폼과 최상의 패리티를 보장하려면 VIP 로컬 개발 환경을 권장합니다. vip dev-env create --php=8.0
(VIP-CLI 2.9.5 이상) 명령을 실행한 다음 나머지 설치 마법사를 완료하면 애플리케이션이 PHP 8.0과 함께 로컬로 실행됩니다.
pull 요청 시 VIP 코드 분석 봇 확인
wpcomvip 조직의 리포지토리에 대한 풀 요청을 살펴보면 PHPCS, PHP 린팅 및 SVG 린팅에 대한 피드백을 제공하는 VIP 코드 분석 봇을 볼 수 있습니다.
PHP Linting 단계에서 봇은 리포지토리가 배포되는 애플리케이션에 사용되는 모든 버전의 PHP로 PHP 코드를 Lint합니다. 해당 버전이 PHP 7.4인 경우 향후 전환에 대비하여 이제 PHP 8.0도 자동으로 린트됩니다.
WordPress VIP 애플리케이션에서 PHP 8 활성화
로컬에서 최대한 많이 확인하고 수정했으면 WordPress VIP 애플리케이션에서 PHP 8.0을 활성화할 차례입니다. 가장 낮은 환경에서 시작하여 프로덕션 환경으로 이동하기 전에 모든 것이 잘 보이는지(vip-cli를 통한 PHP 로그 또는 VIP 대시보드의 상태 로그 포함) 확인하십시오.
환경에서 PHP 8.0을 활성화하려면 Zendesk 티켓을 열어 활성화하려는 애플리케이션과 환경을 알려주십시오.
티켓을 열지 않고도 PHP 버전을 변경할 수 있도록 VIP 대시보드에 새로운 기능을 곧 출시할 예정입니다. 항상 로비에서 최신 정보를 확인하십시오.
사전 예방적 도움 활용
Premier 고객을 위한 계정 팀은 이미 고객에게 연락하여 고객을 지원할 수 있는 방법을 논의하고 있습니다. PHPCS에서 결과를 보내고 이러한 검사를 자체적으로 실행하는 방법에 대한 지침을 제공합니다. 치명적인 오류가 될 PHP 경고도 강조 표시되어 비호환성 해결에 앞장서게 됩니다.
PHP 8.1은 어떻습니까?
WordPress VIP 플랫폼은 PHP 8.1도 지원합니다. PHP 7.4와 8.0 사이보다 PHP 8.0과 PHP 8.1 사이에 변경 사항이 적습니다. 즉, 해결해야 할 비호환성이 더 적어야 합니다.
PHP 8.1:
- 2023년 11월까지 PHP 핵심 개발자의 적극적인 지원, 2024년 11월까지 보안 지원이 있습니다.
- PHP 8.0보다 초당 더 많은 요청을 처리할 수 있습니다.
- WordPress 5.9 이상에서 "베타 호환성" 지원이 있습니다. 즉, PHP 9를 준비하는 데 사용 중단 알림이 있지만 WordPress 코어의 동작에는 영향을 미치지 않습니다.
엄격한 형식의 코드를 사용하고 자동화된 테스트를 추가하는 것과 같이 PHP 8.0에 필요한 유용한 변경 사항은 PHP 8.1 롤아웃과 WordPress 6.1, 6.2, 6.3 및 그 이후 버전의 업그레이드와 모든 기능 릴리스에 도움이 됩니다. QA 프로세스는 종종 병목 현상이 발생하므로 우리가 설명한 도구와 접근 방식 중 일부를 사용하면 수동 작업을 줄이고 이러한 변경 사항을 배포할 때 더 많은 확신을 가질 수 있습니다.
고객이 PHP 8.0에 대해 궁금한 점이 있으면 티켓을 열어주세요.