# PHP & Laravel 升級
###### tags: `PHP` `backend`
### 目標
- PHP 7.2 -> ^8.1
- laravel 6.2 -> ^8.0
### 環境
- ubuntu 18.04
### 前置作業
為了預防直接正式機硬改會出問題,先用docker模擬相同的環境,測試到沒問題才在正式機實作
### PHP 升級
1. 先新增PHP的PPA
```shell
sudo apt install software-properties-common
sudo add-apt-repository ppa:ondrej/php -y
```
2. 進行apt套件的升級
```shell
sudo apt update -y && sudo apt upgrade -y
```
3. 安裝PHP8.1版本所需的套件
```shell
sudo apt install php8.1 php8.1-gd php8.1-fpm php8.1-cli php8.1-curl php8.1-zip php8.1-mysql php8.1-mbstring php8.1-xml php8.1-bcmath
```
4. 更改nginx fastcgi的使用路徑
```shell
sudo vim /etc/nginx/sites-available/some-host.com
```
移動到檔案中的段落
```shell
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
```
改成
```shell
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
```
5. 重啟nginx和php-fpm
```shell
sudo systemctl restart nginx && sudo systemctl restart php8.1-fpm
```
### laravel 升級
這會遇到比較多的問題,因為有很多相容性套件也一併需要升級,不過官網寫得蠻清楚,照著改還蠻順利的。
1. 由於要升級到laravel 8,需要composer 2以上的api,所以若是composer 版本為1則進行升級
```shell
composer self-update
```
2. 對照官網提供的升級指南(附在參考資料中),將composer.json改寫,以下提供幾個範例
```json
"require": {
"php": "^8.1",
"dingo/api": "^2",
"doctrine/dbal": "^3.6",
"fideloper/proxy": "^4.0",
"google/recaptcha": "^1.2",
"laravel/framework": "^8.0",
"laravel/socialite": "^5.0",
"laravel/tinker": "^2.0",
"maatwebsite/excel": "^3.1",
"spatie/laravel-permission": "^4.0",
"sunspikes/clamav-validator": "^2.1",
"tymon/jwt-auth": "^1.0.0"
},
"require-dev": {
"facade/ignition": "^2.0",
"fakerphp/faker": "^1.9.1",
"mockery/mockery": "^1.0",
"nunomaduro/collision": "^5.0",
"phpunit/phpunit": "^9.0"
},
```
3. 將原先的vendor砍了`rm -rf vendor`(我不確定不砍能不能成功)
4. `sudo composer update` 結束
#### 問題排解
- 遇到 `Script @php artisan package:discover --ansi handling the post-autoload-dump event returned with error code 255]`
這在升級laravel 7的時候會碰到,需要對`app/Exception/Handler.php`做修改
修改很簡單,只要把原先`Exception`的物件改成`Throwable`即可
```php
public function report(Throwable $exception)
{
parent::report($exception);
}
public function render($request, Throwable $exception)
{
return parent::render($request, $exception);
}
```
### 結論
這次升級比我想像中的快很多,過程中也沒碰到什麼太災難的問題,整體來說,先用docker測試再去實作會令人安心上不少。
### 參考資料
- [Quick Guide - Upgrading to Laravel 9 and PHP 8.1](https://dev.to/adam_crampton/quick-guide-upgrading-to-laravel-9-and-php-81-2dbh)
- [laravel 8官網升級導引](https://laravel.com/docs/8.x/upgrade)