4단계로 PHP 8.x로 전환하기 – Juliette Reinders Folmer와의 인터뷰
게시 됨: 2023-03-04WordPress 사이트, 플러그인 또는 테마를 새 버전의 PHP로 업그레이드하는 것은 정기적으로 반복되는 작업입니다. 하지만 이를 가능한 한 효율적으로 수행하려면 어떻게 해야 할까요? 당신이 아무것도 간과하지 않을 것이라는 것을 어떻게 압니까? 이에 대한 로드맵이 있습니까?
이 기사에서는 이러한 질문(및 기타)을 해결하고 로드맵을 포함하여 WordPress 사이트, 플러그인 또는 테마를 PHP 8.x로 원활하게 전환하는 데 필요한 사항을 살펴봅니다.
우리는 PHP 전문가 Juliette Reinders Folmer와 진행한 인터뷰를 기반으로 이 작업을 수행할 것입니다. 일상 생활의 대부분을 프로그래밍과 그 주변의 모든 것에 할애하고 있으며 주로 WordPress를 포함한 오픈 소스 프로젝트에 집중하고 있습니다.
전환을 원활하게 할 준비가 되셨습니까? 단계별 계획이 궁금하십니까? 그럼 바로 들어가보겠습니다!
PHP 8.x — 변경 사항
변경 사항에 대한 개요는 아래 문서를 참조하세요.
- PHP 8.0 및 PHP 8.1 릴리스 정보
- PHP 8.0 및 PHP 8.1 마이그레이션 가이드
- WordPress 및 PHP 8.0 및 현재 상태
- PHP 8.0 및 PHP 8.1의 새로운 기능
이 기사를 읽고 나면 PHP 8.x에서 변경된 사항과 문제 없이 PHP 프로젝트를 실행하기 위해 수행해야 할 작업에 대해 완전히 업데이트됩니다.
시작하는 가장 좋은 방법이 무엇인지 확신이 서지 않더라도 문제 없습니다. Juliette와의 대화에서 이에 대해 자세히 논의했으며 이 기사에서 PHP 8.x로 전환하는 방법을 최대한 자세히 설명합니다.
또한 모든 WordPress 사이트, 애플리케이션 및 데이터베이스에 대한 당사의 독점 제어판인 MyKinsta에서 다양한 작업을 수행하는 방법을 정보 상자에서 설명합니다.
PHP 8.x로 전환: 시작하는 방법
PHP 8.x로 전환하는 것은 간단하게 들리며 기술적으로도 그렇습니다. 많은 호스트는 관리자 패널에서 웹사이트에 사용할 PHP 버전을 지정할 수 있습니다. Kinsta에서는 MyKinsta 대시보드에서 클릭 한 번으로 PHP 버전을 전환할 수 있습니다.
하지만 그 전에 확인해야 할 몇 가지 사항이 있습니다. 지식과 경험 수준에 따라 다음을 권장합니다.
- PHP에 대한 지식이 많지 않고 표준 테마와 플러그인으로 자체 WordPress 사이트를 구축한 경우 개발자나 대행사를 고용하여 사이트가 PHP 8.x에서 실행하기에 적합한지 조사하십시오. 이에 대해 도움을 줄 수 있는 제3자를 찾고 계십니까? 그런 다음 귀하를 지원할 수 있는 신뢰할 수 있는 여러 회사가 나열된 파트너 페이지를 살펴보십시오.
- 귀하의 WordPress 사이트가 외부 당사자, 개발자 또는 에이전시에 의해 구축된 경우 그들에게 연락하여 귀하의 사이트가 PHP 8.x에서 실행될 수 있는지 문의하십시오.
- 예를 들어 자체 사용자 정의 테마 또는 자체 개발 플러그인을 사용하여 WordPress 사이트를 구축한 경우 아래 로드맵이 있습니다.
귀하의 사이트가 처음 두 범주 중 하나에 해당하는 경우 기사의 나머지 부분을 읽어 보시기 바랍니다. 하지만 귀하의 사이트에서 PHP 8 호환성 테스트를 직접 시작하는 것은 권장하지 않습니다. 전문가에게 맡기십시오.
무엇을 선택하든 라이브 사이트를 PHP 8로 전환하고 "작동하는지 확인"하지 않는 것이 좋습니다. 귀하의 사이트가 어떻게 보일지 궁금하고 PHP 8에서 실행되는 것을 보고 싶습니까? 그런 다음 스테이징 환경 내에서 테스트를 시작합니다. 좋은 호스트를 사용하면 스테이징 환경을 쉽게 설정할 수 있습니다.
스테이징 환경에서 PHP 8.x를 활성화하고 이 업데이트가 사이트에서 제대로 작동하는지 확인할 수 있습니다. 사이트의 로컬 복사본으로 작업하는 것도 가능합니다. 무료 DevKinsta 개발 도구를 사용하면 MyKinsta 대시보드에서 사이트를 쉽게 가져온 다음 PHP 버전을 8.0 또는 8.1로 변경할 수 있습니다.
스테이징 환경에서 문제가 발견되지 않는다고 해서 반드시 실제로 문제가 없다는 의미는 아닙니다. 아래 로드맵에서 그 이유를 알 수 있습니다.
PHP 8.x 호환성 테스트: 로드맵
테스팅: 좋은 소프트웨어의 키워드. 테마, 플러그인, WordPress 코어와 같은 WordPress 웹사이트 및 해당 구성 요소의 경우에도 테스트는 원하지 않는 일이 발생하지 않도록 하는 수단입니다.
소프트웨어 개발 프로젝트는 주로 테스트로 구성됩니다. 이 기사에서는 PHP 8.x로 원활하게 전환하는 데 도움이 되는 테스트를 구체적으로 살펴봅니다. DevOps 도구에 대한 기사에서 사용할 수 있는 도구 모음이 있는 섹션을 찾을 수 있습니다.
이 블로그 게시물에서는 다음 유형의 테스트에 대해 설명합니다.
수행할 수 있는 다양한 유형의 테스트를 자세히 살펴보겠습니다.
정적 분석(또는 정적 테스트)
PHP 개발자로서 취할 수 있는 첫 번째 단계는 다양한 도구를 사용하여 코드의 정적 분석을 수행하는 것입니다. 정적 분석은 코드를 실행하지 않고 소프트웨어를 분석하는 프로세스입니다. 정적 분석을 통해 오류 감지, PHP 8.x 호환성 문제 감지, 코딩 표준(예: WordPress 코딩 표준) 적용, 코드 수정 및 정리까지 가능합니다.
정적 분석을 위한 도구
다음과 같은 다양한 도구를 사용하여 정적 분석을 수행할 수 있습니다.
- PHP호환성
- 찬송가
- PHPStan
작성 당시 모든 PHP 8.1 검사가 최신 PHPCompatibility 릴리스에서 지원되는 것은 아닙니다. PHP 8.1 검사는 개발 릴리스에 있을 수 있으므로 PHPCompatibility를 사용하여 프로젝트를 분석하고 어떤 오류/권장 사항이 있는지 확인할 때 (현재로서는) 해당 검사를 사용해야 합니다.
PHP 8.1 검사는 곧 새로운 주요 버전으로 출시될 예정입니다. 이에 대한 최신 정보를 받고 싶고 GitHub 계정이 있는 경우 PHPCompatibility의 GitHub 리포지토리를 열고 Watch -> Custom -> Releases 로 이동하여 새 버전이 출시될 때 알림을 받도록 선택할 수 있습니다.
PHP의 특정 버전(또는 버전 범위)에 대한 호환성만 테스트하는 PHPCompatibility는 설정하기 쉽습니다. PHPCompatibility 내에서 testVersion(예: 8.0+(8.0 이상))을 실행하면 최상의 결과를 얻을 수 있습니다.
더 이상 사용되지 않거나 삭제된 함수, 함수 매개변수의 기본값 변경, 괄호 없이 concat을 사용할지 여부, 함수 이름으로 match를 사용할지 여부(PHP 8.0부터 예약되었으므로) 등을 살펴봐야 합니다.
Psalm 및 PHPStan은 좋은 추가 기능이며 변수 유형과 관련된 추가 검사를 수행하여 도움을 줄 수 있습니다. 이러한 도구의 단점은 PHP 8.0 및 8.1에 대한 보고서를 가져오는 데 많은 구성이 필요하다는 것입니다. 성공하더라도 많은 오 탐지를 예상할 수 있습니다. False Positive는 정적 분석의 한계로 인해 잘못 제공된 알림입니다.
이 두 도구의 결과를 올바르게 해석하려면 건전한 지식이 필요하지만 해당 지식은 PHPCompatibility가 찾을 수 없는 추가 비호환성을 식별하는 데 도움이 될 수 있습니다. 이에 대해 자세히 알아보려면 Psalm 및 PHPStan에 대한 설명서를 참조하십시오.
요약:
- PHPCompatibility, Psalm, PHPStan으로 정적 분석 수행
- 모든 합법적인 문제 해결
단위 테스트
프로세스의 다음 단계는 단위 테스트입니다. 단위 테스트는 코드 조각을 개별적으로 테스트하는 방법입니다. 단위 테스트에서는 각 단위에 대해 특정 대상 테스트가 개발됩니다. 여기에는 다양한 시나리오를 통한 실행이 포함됩니다. 바람직하게는 각 시나리오는 다른 것과 별도로 테스트되어 테스트가 서로 독립적입니다.
물론 단위 테스트만으로는 충분하지 않습니다. 또한 실행해야 합니다. 단위 테스트는 Jenkins, GitHub Actions 또는 Travis와 같은 CI(연속 통합) 도구를 사용하여 가장 잘 자동화됩니다.
여러 버전의 PHP 지원
플러그인 빌더로서 여러 PHP 버전을 지원하려면 CI의 테스트가 지원하는 모든 PHP 버전에 대해 실행되는지 확인하십시오.
물론 최신 버전만 지원할 수도 있으며 선택은 전적으로 사용자에게 달려 있습니다.
여러 버전의 PHP로 테스트하려면 PHP 버전에 따라 여러 PHPUnit 버전을 사용해야 합니다. PHPUnit은 테스트 작성 방법에 영향을 미치는 몇 가지 변경 사항을 수년에 걸쳐 도입했기 때문에 이 부분은 까다로울 수 있습니다.
이 문제를 해결하기 위해 PHPUnit Polyfills(Juliette 작성 및 Yoast 후원)를 사용할 수 있습니다. 이를 통해 PHPUnit 9에서 공식적으로 지원되지 않는 테스트를 작성할 수 있습니다(따라서 PHP 8.x에서 실행할 수 있음). 그런 다음 Polyfill을 사용하면 PHPUnit 4.x~9.x 및 PHP 5.4~PHP 8.1(현재)에서 테스트가 작동합니다.[/notice]
이제 테스트를 실행했으므로 다음 단계는 테스트에서 발견된 문제가 수정되었는지 확인하는 것입니다.
코드 커버리지
이러한 테스트를 실행하는 것이 버전 간 비호환성을 찾는 가장 신뢰할 수 있는 방법입니다.
이때 테스트의 코드 범위 에 주의를 기울이십시오.
- 함수 A가 있고 이에 대한 테스트를 작성했으며 함수 A가 함수 논리의 일부로 함수 B, C 및 D를 호출한다고 가정합니다.
- 함수 A에 대한 테스트는 함수 A의 논리를 테스트하기 위해 작성되었지만 테스트 중에 함수 B, C 및 D도 호출합니다. 함수 B, C, D의 경우 일반적으로 "행복한 경로"(모든 것이 잘 되는 상황)만 테스트하므로 해당 함수의 코드(일부)는 기능 A를 테스트하는 동안 실행됩니다.
- 각 테스트에 대해 특별히 테스트 중인 코드를 표시합니다. 각 테스트에 @covers를 부여하여 이를 수행합니다. 이렇게 하면 코드 적용 범위 계산에서 B, C 및 D가 "계산"되지 않으므로 테스트에서 적용되는 코드 부분을 확인할 수 있습니다.
종종 개발자는 "행복한 길"을 위해 때로는 무의식적으로 작성하고 테스트합니다. 이러한 경우 예상치 못한 데이터가 함수에 전달될 때 어떤 일이 발생하는지 테스트하는 것도 필요합니다. 예상 값/유형만으로는 테스트가 충분하지 않습니다 .
위 인용문의 두 번째 부분은 아마도 첫 번째 부분보다 훨씬 더 중요할 때 종종 잊혀집니다. 잘못된 유형을 전달하면 어떻게 되나요? 오류 메시지가 표시됩니까? 아니면 함수가 정상적으로 계속되는 변수 캐스트입니까? 예상치 못한 값이 함수에 전달되면 어떻게 될까요?
예상치 못한 변수, 유형 및 값으로 함수를 테스트해야 합니다. 그래야만 테스트를 통해 새 PHP 버전에서 발생할 수 있는 문제를 찾을 수 있습니다.
점점 더 엄격해지는 PHP
PHP는 동적 속성과 같은 것뿐만 아니라 PHP 고유의 함수에 대한 "유형"을 처리하는 방법에서 더욱 정확해지고 있습니다(엄격해짐). 이러한 변경 사항은 일반적으로 개발자가 오류 없는 코드(오류가 적은 코드)를 제공하도록 돕기 위한 것입니다. 그러나 이것은 PHP의 "오래된" 교리를 기반으로 작성된 기존 코드에 대한 상당한 업그레이드 장애물을 제시할 수 있습니다.
PHP에서 더 유용한 오류 메시지에 대한 이러한 드라이브 때문에 기존 코드를 새 PHP 버전에 적합하게 만드는 데 점점 더 많은 시간이 걸린다는 것을 알 수 있습니다. PHP 5.6에서 작동하는 코드를 PHP 7.0에 적합하게 만드는 것은 코드를 PHP 8.1에 적합하도록 업그레이드하는 것과 비교할 때 대부분의 경우 시간이 매우 짧습니다. 그리고 그것은 PHP 7.0이 "주요" 릴리스인 반면 PHP 8.1은 "부"라는 사실에도 불구하고 그렇습니다.
많은 경우에 테스트는 여전히 새 버전을 지원하기 위해 수정해야 할 사항을 결정하는 유일한 신뢰할 수 있는 방법입니다.
다음과 같은 다양한 도구를 사용하여 단위 테스트가 가능합니다.
- PHP단위
- 조롱
- 베하트,
- 스토리 플레이어
이러한 도구 중 다수는 PHPUnit을 기반으로 하거나 PHPUnit과 함께 구축됩니다.
궁극적으로 어떤 도구를 사용하는지는 중요하지 않습니다. 가장 중요한 것은 테스트하고 새 PHP 버전에서 테스트를 실행하는 것입니다. 이 단계는 때때로 매우 까다로울 수 있지만 다행스럽게도 앞에서 언급했듯이 PHPUnit Polyfills와 같은 도구가 있습니다.
통합 테스팅
통합 테스트는 정적 분석 및 단위 테스트 후에 수행할 다음 단계입니다. 통합 테스트는 실제 상황이 단순한 "코드 단위"보다 더 큰 맥락에서 테스트되는 곳입니다. 여기에는 활성(테스트) 데이터베이스를 사용한 테스트 또는 외부 API를 사용한 테스트가 포함되며 두 가지 예만 제공됩니다.
따라서 WordPress 컨텍스트에서 플러그인 또는 테마의 코드를 테스트하고 실제 버전을 사용하는 것은 정의상 통합 테스트입니다.
WP Test Utils(Juliette가 작성하고 Yoast가 후원)는 통합 테스트를 위한 훌륭한 도구입니다. WP Test Utils는 WordPress가 Brainmonkey 및 Mockery를 사용하여 "모의" 통합 및 단위 테스트를 작성하는 도구를 제공합니다. 일반적으로 사용되는 WordPress 기능은 "가짜"이므로 WordPress 코드가 아닌 자신의 코드를 테스트합니다.
WordPress와의 통합 테스트는 WordPress 및 WordPress의 테스트 제품군과의 통합을 포함하기 때문에 까다로운 이야기입니다. 플러그인 또는 테마가 지원하는 WordPress 버전에 따라 다른 PHP 버전에서 테스트를 실행하려면 WordPress 자체에서 지원하는 PHPUnit 버전을 고려해야 합니다.
예를 들어 WordPress 5.6 ~ 5.8은 PHP 5.6 ~ PHP 8.0을 테스트하기 위해 PHPUnit 5 ~ 7을 사용하지만 WordPress 5.9부터 WordPress 자체도 더 광범위한 지원을 위해 PHPUnit Polyfills를 사용합니다. WP Test Utils는 이러한 모든 차이점을 극복하기 위한 다리 역할을 합니다.
WordPress 5.9 이상을 포함하여 여러 버전의 WordPress에 대해 통합 테스트를 실행하는 방법에 대해 자세히 알고 싶으십니까? 그런 다음 WordPress 웹 사이트에서 이에 대해 읽으십시오.
수동 테스트
이제 단위 테스트 및 통합 테스트를 거쳐 발견한 모든 문제를 수정했으므로 수동 테스트를 수행할 차례입니다. 귀하의 사이트가 실행 중이고 자체 코드가 작동하지만 플러그인 A, B 및 C도 사용하고 있습니다. 이러한 플러그인이 호환되는지 알고 계십니까?
예를 들어 플러그인 작성자에게 이를 확인하고 플러그인이 PHP 8.x와 호환되는지 확인하십시오. 물론 문제는 플러그인을 테스트한 방법입니다. 종종 대답은 다음과 같습니다. 플러그인의 기능은 일반적으로 다른 활성 플러그인 없이 워드프레스와 함께 단독으로 테스트되었습니다. 그리고 이러한 테스트 내에서 다른 플러그인이 사용되더라도 귀하 가 사용하는 모든 플러그인이 테스트의 일부가 아닐 가능성이 있으므로 이러한 호환성 설명을 약간만 고려하십시오.
예를 들어 3개의 플러그인(A, B 및 C)이 있는 WordPress 사이트입니다. 예를 들어 플러그인 B가 필터를 통해 잘못된 변수 유형을 반환할 가능성이 있으며, 동일한 필터를 사용하는 플러그인 C는 작업을 원합니다. 그러면 유형이 더 이상 예상한 것이 아니므로 치명적인 오류가 발생할 수 있습니다. 그런 다음 플러그인 C가 오류 메시지의 원인으로 간주되지만 플러그인 B는 실제 위반자입니다.
플러그인 상호 운용성-비호환성은 단독으로 테스트할 때 발견할 수 없습니다. 활성화된 플러그인이 많을수록 문제가 발생할 가능성이 높아집니다. 예를 들어 실제 웹 사이트에서 스테이징 환경(오류 로깅이 활성화된 상태)으로 페이지 요청을 전달하여 실제로 무엇이 잘못되었는지 발견하는 것은 매우 유용할 것입니다.
이러한 유형의 문제로 인해 사이트 소유자는 일반적으로 플러그인 C가 문제의 원인이 아닐지라도 마지막으로 실행된 코드(이 경우 플러그인 C에서)에 오류가 있다는 메시지만 볼 수 있습니다.
대부분의 경우 수작업이 많이 필요하며 이러한 문제를 감지하고 해결하려면 적당한 양의 팔꿈치 기름이 필요합니다. 종단 간 테스트를 사용하여 자동화 할 수 있지만 WordPress에서는 이러한 일이 많이 발생하지 않습니다.
활용 플러그인에 대한 테스트 가용성
개발자 및 개발 팀의 경우: 테스트가 가능한 경우에만 코드를 승인하십시오. 이렇게 하면 수동 테스트가 덜 필요하므로 많은 시간을 절약할 수 있습니다.
상용 플러그인이나 테마를 구매하려면 테스트 전략에 대해 질문하십시오. 그렇게 하면 WordPress 커뮤니티의 개발자/개발팀 사이에서 총체적으로 인지도를 높여 의제에서 더 높은 수준의 테스트를 수행하고 우리 모두에게 이익이 됩니다.
테스트는 실제로는 비용을 절감하는데도 부당하게 비용으로 간주되는 경우가 많습니다. 테스트를 작성하는 데 필요한 추가 투자는 훨씬 적은 버그 보고서와 버그 수정에 소요되는 시간의 형태로 보상됩니다. 또한 자동화된 소프트웨어 테스트를 통해 확장 및 수정을 더 빠르게 수행할 수 있습니다. 테스트를 통해 기존 기능이 계속 작동하는지 신속하게 확인할 수 있기 때문입니다.
WordPress 호스트와 PHP 8.x의 역할
일반 사이트 소유자의 경우 호스트의 안내가 매우 바람직합니다. 다음을 고려하세요:
- WordPress Core, 플러그인 및/또는 테마가 (경우에 따라) PHP 교차 버전과 호환되지 않는다는 고객을 위한 문서 및 업데이트
- 테스트 옵션(예: 스테이징 환경 작업)
- 오류 보고 및 지원 문의 방법
이것은 또한 사이트 소유자가 문제가 발생할 때 호스트에게 도움을 요청하는 경우가 많기 때문에 웹 호스트에게도 도움이 됩니다. PHP 8.0 또는 8.1로 전환하는 경우 잠재적인 문제에 대한 책임은 사이트 소유자에게 있으며 전환을 위해 소유자가 적절하게 준비해야 하는 정보가 많을수록 좋습니다.
고객이 PHP 8.0 또는 8.1을 웹 호스트로 사용할 수 있도록 하는 것도 중요하지만 그렇게 함으로써 문제가 표면화될 수 있음을 고객이 인식할 수 있도록 해야 합니다. 실제 버전과 다른 버전으로 스테이징 환경에서 사이트를 테스트하는 것이 좋습니다. (PHP 버전 선택은 기본적으로 Kinsta에서 가능합니다.)
WordPress의 최소 PHP 버전
현재 모든 웹사이트의 15% 이상이 PHP 버전 7.0 이하를 사용하고 있습니다. 이것은 공식 WordPress 통계에서 볼 수 있습니다. 전체 WordPress 사이트의 약 83%가 현재 PHP 버전 7.4 이하를 사용합니다. 7.4 이하 버전은 현재 PHP에서 더 이상 지원되지 않습니다. 수명이 다한 버전의 PHP를 사용하면 보안 업데이트가 더 이상 릴리스되지 않기 때문에 문제가 발생할 수 있습니다.
문제를 방지하려면 WordPress 사이트 소유자가 사이트를 안전하게 실행할 수 있는 최소 PHP 버전을 알고 정보를 제공하는 것이 중요합니다. 사이트 소유자는 PHP 버전을 직접 수정하거나(Kinsta에서 모든 패키지에 대해 가능) 호스트에게 사이트를 최신 PHP 버전으로 업데이트하도록 요청할 수 있습니다. 극단적인 경우 이러한 최신 버전을 지원하는 호스트로 전환할 수 있습니다.
WordPress에는 최소 버전 7.4만 필요하기 때문에 많은 호스트와 웹사이트 소유자가 사이트를 업데이트할 동기가 충분하지 않습니다. 그리고 이것은 PHP 7.4가 2022년 11월에 수명이 다했다는 사실에도 불구하고 그렇습니다.
WordPress가 최소 PHP 버전을 높이면 많은 사이트가 더 이상 최신 WordPress 버전 업데이트와 호환되지 않을 수 있습니다. 그러나 이러한 오래된 버전에 대한 보안 업데이트는 꽤 오랫동안 계속 릴리스될 것입니다.
요약
웹 사이트를 PHP 8.0 이상으로 전환하려면 귀하 또는 귀하의 개발자가 수행해야 하는 몇 가지 단계가 있습니다. 중요한 단계는 다음과 같습니다.
- 정적 분석
- 단위 테스트
- 통합 테스트
- 수동 테스트
PHP 8.x로 전환할 때 모든 것이 적절하게 테스트되었는지 확인하십시오. 이것이 귀하의 사이트가 최신 PHP 버전에서 올바르고 빠르고 안전하게 실행되도록 보장하는 유일한 방법입니다.
이 기사에 참여하고 언급된 도구에 대한 그녀의 모든 작업에 대해 Juliette에게 대단히 감사합니다!
Jip Moors가 촬영하고 허가를 받아 사용하는 Juliette의 사진.