라라벨 버전 내역 (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에서 변경된 부분을 기존 파일에 반영하여 수정
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