Code/PHP

라라벨 버전 내역 (v6 -> v9 로 업그레이드 방법) (성능 측정) (2024-05)

codens 2022. 2. 15. 05:23

laravel version 6.x to 9.0 upgrade , 라라벨 버전 역사, laravel version history

 

 

// 라라벨 역사(laravel history), 지원 기간

https://en.wikipedia.org/wiki/Laravel#Release_history

https://laravel.com/docs/master/releases

버전 PHP  출시 버그 수정 보안 수정
6 (LTS,3년) 7.2 - 8.0 2019-09 2022-01 2022-09
7 7.2 - 8.0 2020-03 2020-10 2021-03
8 7.3 - 8.1 2020-09 2022-07 2023-01
9 (2년) 8.0 - 8.1 2022-02 2023-08 2024-02
10 (2년) 8.1-8.3 2023-02 2024-08 2025-02
11 8.2-8.3 2024-03 2025-09 2026-03
12 8.2-8.3 2025-Q1(예정)    

 

//-------------------------------------

php 버전별 동작여부

  php
 
라라벨 7.3 8.0 8.1
6 O O X
7 O O X
8 O O O
9 X O O

 

 

//-----------------------------------------------------------------------------
< php 업그레이드 7.3 -> 8.1 >

 

    - php8.1 다운로드 후

 

php.ini 파일 수정
post_max_size = 50M
extension_dir = "ext"
upload_max_filesize = 50M

date.timezone = Asia/Seoul

opcache.enable=1
opcache.jit_buffer_size=100M
opcache.jit=1255

    - extension 주석처리 수정
bz2 , curl, fileinfo, gd, gettext, gmp, intl, mbstring, exif, mysqli, openssl, pdo_mysql, sockets, sodium


//-------------------------------------
* extension 관련 변경 사항
gd2 : gd2가 php8에서 gd로 변경됨, 추가 작업 필요없음
interbase : DB , php 8에서 제거됨

 

 

 

//-----------------------------------------------------------------------------

< 라라벨 6 -> 9로 업그레이드 >

//---------------------------------------------

버전별 기본 composer.json


6.0
"require": {
        "php": "^7.2",
        "fideloper/proxy": "^4.0", <== 삭제
        "laravel/framework": "^6.0",
        "laravel/tinker": "^1.0"
    },
    "require-dev": {
        "filp/whoops": "^2.0",
        "fzaninotto/faker": "^1.4", <== 삭제
        "mockery/mockery": "^1.0",
        "nunomaduro/collision": "^3.0",
        "phpunit/phpunit": "^8.0"
    },


//-----------------------------------
9.0
 "require": {
        "php": "^8.0",
        "fruitcake/laravel-cors": "^2.0.5",
        "guzzlehttp/guzzle": "^7.2",
        "laravel/framework": "^9.0",
        "laravel/sanctum": "^2.14",
        "laravel/tinker": "^2.7"
    },
    "require-dev": {
        "fakerphp/faker": "^1.9.1",
        "laravel/sail": "^1.0.1",
        "mockery/mockery": "^1.4.4",
        "nunomaduro/collision": "^6.1",
        "phpunit/phpunit": "^9.5.10",
        "spatie/laravel-ignition": "^1.0"
    },


//-----------------------------------------------------------------------------
< composer.json 파일 수정 >


* 삭제
"fideloper/proxy": "^4.0", 
"fzaninotto/faker": "^1.4",

 


* 수정

- v9.0의 composer.json에서 변경된 부분을 기존 파일에 반영하여 수정

composer.json
0.00MB

 

    - horizon 사용시

"laravel/horizon": "^5.0",  => Windows에서는 아래 설정 필요
    - 에러 메시지 : 
require ext-pcntl * -> it is missing from your system. Install or enable PHP's pcntl extension.

    - 해결 방법 : 필요 extesion 요구를 속이는 설정 추가
"config": {
        "platform": { 
            "ext-pcntl": "8.0",
            "ext-posix": "8.0"
        },


//-------------------------------------
* 미지원 패키지


"aws/aws-sdk-php-laravel": "^3.0", => 실패, 아직 라라벨9 미지원(2022-02 현재)
https://github.com/aws/aws-sdk-php-laravel
https://packagist.org/packages/aws/aws-sdk-php-laravel

 

 

//-----------------------------------------------------------------------------

라라벨 업그레이드 매뉴얼 정리 ( 6 -> 7 -> 8 -> 9)

https://codens.info/2344

 

 

//-------------------------------------

< 소스 변경
* app\Exceptions\Handler.php 에서 에러발생시 파일 변경
    - 라라벨 9의 소스로 변경

Handler.php
0.00MB

 

* 에러 발생

    - 에러 메시지 : Trait 'Illuminate\Foundation\Auth\AuthenticatesUsers' not found 
    - 해결 방법 : 라라벨 7에서 인증 스케폴딩이 변경됨

        composer.json에 다음 추가
"laravel/ui": "^3.0",

 

 

//-------------------------------------

    - 라라벨 8에서 기본 Pagination이 Tailwind 로 바뀜, 기존 Bootstrap을 사용하려면
app\Providers\AppServiceProvider.php, boot() 함수에 다음을 추가

\Illuminate\Pagination\Paginator::useBootstrap();

 

//-----------------------------------------------------------------------------
    - TrustProxies 변경

"fideloper/proxy" 패키지 삭제

https://github.com/fideloper/TrustedProxy

 

    - app/Http/Middleware/TrustProxies.php 파일 수정
use Fideloper\Proxy\TrustProxies as Middleware 을 다음으로 변경

=>
use Illuminate\Http\Middleware\TrustProxies as Middleware

 

//-------------------------------------
// 이전
protected $headers = Request::HEADER_X_FORWARDED_ALL;
 
// 이후
protected $headers =
    Request::HEADER_X_FORWARDED_FOR |
    Request::HEADER_X_FORWARDED_HOST |
    Request::HEADER_X_FORWARDED_PORT |
    Request::HEADER_X_FORWARDED_PROTO |
    Request::HEADER_X_FORWARDED_AWS_ELB;

 


//-------------------------------------

- 변경된 composer.json 적용

composer update

 

 

 

//-----------------------------------------------------------------------------

< 라라벨과 php 버전에 따른 성능 측정 >

    - 라라벨 collection의 toArray() 함수가 매우 느려서 신경이 쓰여 측정해봄

 

    - 라라벨 v9보다 v6 빠름

    - 라라벨 v6은 php7.3보다 php8.0 3배 빠름(toArray())

 

    - 컬렉션의 map 과 foreach는 별 차이 없음
        - map이 조금 느리지만 충분한 속도, 초당 천만회 이상

 

    - 대량 배열 요소 반복 조회시 상황(foreach)
        - Collection 상태으로 반복 조회하는 것 보다 toArray()로 변경후 foreach로 반복 조회 하는 것이 2배 이상 빠름

        - 소량 조회는 Collection 상태로 조회, toArray()가 워낙 느림

    

   - php8의 JIT 기능을 켜면 30%정도의 성능 상승

 

//

벤치마크 결과

    - 테스트 데이터 : 46개 칼럼을 가진 레코드 30개

실행 속도(초당 실행수)

//

      라라벨
php     6 8 9
7.3 toArray() 769 310 X
foreach Array 724 302 X
Collection 208 181 X
8.0 toArray() 2,962 655 644
foreach Array 2,597 637 626
Collection 458 392 394
8.1 toArray() X 664 652
foreach Array X 646 637
Collection X 399 392
JIT기능 OFF
8.0 toArray() 2,424 504 503
foreach Array 2,030 483 480
Collection 340 274 269
8.1 toArray() X 521 522
foreach Array X 500 503
Collection X 279 279

 

 

 

 

반응형