라라벨 버전 내역 (v6 -> v9 로 업그레이드 방법) (성능 측정) (2024-05)
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에서 변경된 부분을 기존 파일에 반영하여 수정
- 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)
//-------------------------------------
< 소스 변경 >
* app\Exceptions\Handler.php 에서 에러발생시 파일 변경
- 라라벨 9의 소스로 변경
* 에러 발생
- 에러 메시지 : 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 |