Laravel11をインストールする

AlmaLinux9 + Apache + PsotgreSQL + Laravel11の組み合わせです。

AlmaLinux9 + Apache + PsotgreSQL + Laravel11で初期画面を表示したり、データベースから値を取得したりするまでのメモです。

1. 前準備

圧縮ツールのインストール

Laravelのパッケージダウンロード時に使用します。インストールしなくてもLaravelはインストールできます。
他でも使うし、そんなに大きいものでもないのでインストールした方がいいです。

圧縮ツール 動作
あり 圧縮したパッケージがダウンロードされます。早い。

なし 展開したソースがダウンロードされます。遅い。
「圧縮ツールがないのでソースをダウンロードするよ」という旨の警告がバンバン出ます。
Failed to download laravel/laravel from dist: The zip extension an...
Your command-line PHP is using multiple ini files. Run `php --ini`...
Now trying to download from source
//インストール状況確認 ...インストールされてたらスキップ
$ dnf list installed | grep -e "unzip" -e "p7zip"
p7zip.x86_64               16.02-31.el9              @epel
unzip.x86_64               6.0-56.el9                @baseos

$ sudo dnf install unzip
$ sudo dnf install p7zip

Apache設定確認

  • phpが使用できるか?
  • index.phpが指定されているか?(DirectoryIndexにindex.php)
  • リンクが使えるか?(OptionsにFollowSymLinks)
  • .htaccessを使った設定の上書きができるか?(AllowOverrideにAll)

2. Laravel11のインストール

//インストール
$ cd [インストール場所]
$ composer create-project laravel/laravel=11.* fuga

//確認
$ cd fuga
$ php artisan --version
Laravel Framework 11.28.1

//公開 ...ドキュメントルートにリンクを作る
$ cd /var/www/html
$ ln -s /[インストール場所]/fuga/public/ fuga

ComposerはComposerの使い方を参考にしてください。

laravel/laravel=11.*は11系の最新という意味のバージョン指定です。10.*や9.*とすると他のバージョンをインストールできます。

3. 初期画面表示まで

3-1. パーミッション設定

ブラウザから「http/xxxxxxxx/fuga/」へアクセスします。
Apache実行ユーザがLaravelのファイル出力先に対してパーミッションが不足しているためエラーが出ます。

file_put_contents(/var/www/apps/fuga/storage/framework/views/x~x.php): Failed to open stream: Permission denied

ここで、パーミッションが不足しているのは「…/storage/framework/views」ですが「…/storage」がLaravelのファイル出力先なので、「…/storage」以下にパーミッションを与えます。

パーミッションの与え方ですが正直どうすれば一番いいのかよくわかりません。私は2パターンを状況によって使い分けています。

パターン1

Apache実行ユーザを変更してLaravelのインストールユーザと合わせる。

  1. ユーザwwwを作成しApacheの実行ユーザ:グループをwww:wwwにする。
  2. Laravelのインストールをユーザwwwで行う。

注意点

  • Laravelを使わないPHPアプリのセッションファイルの書き込み先/パーミッションをどうするか検討する必要がある。

パターン2

Apache実行ユーザを、Laravelインストールユーザのグループに参加させて、「…/storage」以下にグループ書き込み権を与える。

  1. ユーザwwwを作成しLaravelのインストールをwwwで行う。
  2. グループwwwにApache実行ユーザを参加させる。
  3. 「…/storage」以下をchmod -R 775する。

注意点

  • webアプリが作成する ディレクトリ/ファイルの所有者がApache実行ユーザになるので、ユーザwwwから操作するのがめんどい。

私はパターン1が好きです。
Apache設定ファイルを変更する職務権限があって、Apache実行ユーザがデフォルトから変わってもお客さんからクレームがなかったらパターン1を選択します。パーミッションに関するトラブルもパターン1の方が少ないように思います。

3-2. セッション設定

パーミッション解決後、再度ブラウザから「http/xxxxxxxx/fuga/」へアクセスします。
セッションの出力先がDBになっていて、セッション保存用のテーブルが作成されていないためエラーが出ます。

SQLSTATE[HY000]: General error: 8 attempt to write a readonly database (Connection: sqlite, SQL: update "sessions" set "payload" = ...)

とりあえず、セッションの出力先をfileに変更します。

セッションの保存先は割とあとの方で変更しても大丈夫な印象です。出力先をfileで開発して問題が出たら変更するということにします。私は複数アプリサーバ + ロードバランサで運用とかしない限りは、そのままfileで運用します。

$ cd [インストール場所]/fuga
$ vi .env
$ diff .env .env.example
 :
 :
< SESSION_DRIVER=file
ーーー
> SESSION_DRIVER=database

再度、ブラウザから「http/xxxxxxxx/fuga/」へアクセスします。これでLaravelの初期画面が表示されるはずです。

4. 環境設定

$ diff .env .env.example
 :
< APP_KEY=base64: ... 省略 ...
ーーー
> APP_KEY=
 :
< APP_TIMEZONE=Asia/Tokyo
< APP_URL=https://www.xxxx.jp/
ーーー
> APP_TIMEZONE=UTC
> APP_URL=http://localhost
 :
< APP_LOCALE=ja
< APP_FALLBACK_LOCALE=ja
< APP_FAKER_LOCALE=ja_JP
ーーー
> APP_LOCALE=en
> APP_FALLBACK_LOCALE=en
> APP_FAKER_LOCALE=en_US
 :
< LOG_CHANNEL=daily
< LOG_DAILY_DAYS=14
ーーー
> LOG_CHANNEL=stack
> LOG_STACK=single
 :
< DB_CONNECTION=pgsql
< DB_HOST=127.0.0.1
< DB_PORT=5432
< DB_DATABASE=xxx
< DB_USERNAME=yyy
< DB_PASSWORD=dummy
< DB_CHARSET=utf8
ーーー
> DB_CONNECTION=sqlite
 :
< SESSION_DRIVER=file
ーーー
> SESSION_DRIVER=database

5. DB接続確認

接続確認用データ作成

$ psql xxx yyy
=> SELECT current_database(), current_user;
 current_database | current_user
------------------+--------------
 xxx              | yyy

=> CREATE TABLE test(field1 text);
=> INSERT INTO test VALUES ('lara-hoge-fuga!!!');

モデル:App/Models/Test.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;

class Test extends Model
{
    public static function find(){
        return DB::table('test')->first();
    }
}

コントローラ:App/Http/Controllers/TestController.php

<?php

namespace App\Http\Controllers;

use App\Models\Test;
use Illuminate\Http\Request;

class TestController extends Controller
{
    /**
     * index
     */
    public function index()
    {
        echo '** DB接続テスト **';
        dump(
            Test::find()
        );
    }
}

ルート:routes/web.php

<?php

use Illuminate\Support\Facades\Route;

//Route::get('/', function () {
//    return view('welcome');
//});

Route::get('/test',    [App\Http\Controllers\TestController::class,  'index']);

www.xxxx.jp/testにアクセスすると「lara-hoge-fuga!!!」が表示される。(ように頑張る!)
あと、スキーマーとか使いたい場合は、config/database.phpにパラメターを追加してやる。

//config/database.phpから抜粋

'pgsql' => [
      :
    'search_path'   => env('DB_SCHEMA'). ', public',
    'schema'        => env('DB_SCHEMA'),
      :
],