블로그

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

Code › PHP · 2022-02-15 · 공개

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)

/blog/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

알림