Laravelで開発中に時々レスポンスが遅くなる

Laravelで開発中に時々レスポンスが遅くなる問題に悩まされた。
とくにブラウザテスト(Laravel Dusk)の実行中、$browser->waitFor()で待機しているときにレスポンスが遅くなると、テストに失敗する。

調査の結果、レスポンスが遅くなる原因は、Laravel Debugbarにあった。
Laravel Debugbarは、storage/debugbarフォルダーにファイルを出力する。
storage/debugbarフォルダー内のファイルが多くなると、ファイルの出力に時間がかかり、レスポンスが遅くなる。

対策として、ブラウザテスト(Laravel Dusk)のときは、Laravel Debugbarを無効にした。
結果、ブラウザテスト(Laravel Dusk)の動作が安定するようになった。

Laravelで外部キー制約を一時的に無効化する

Laravelで外部キー制約を一時的に無効化する方法について。

データベースのデータが不正なデータになることがないように、外部キーを使用します。

しかし、データベースの設計が変更されてデータを修正しなければならないとき、外部キー制約が邪魔になることがあります。

Laravelでは、外部キー制約を一時的に無効化する機能が用意されています。

外部キー制約を無効にするには、以下のメソッドを使用します。

Schema::disableForeignKeyConstraints();

外部キー制約を有効にするには、以下のメソッドを使用します。

Schema::enableForeignKeyConstraints();

次のコードでは、一時的に外部キー制約を無効にしてデータベースを操作し、完了したら外部キー制約を有効に戻します。

// 外部キー制約を無効化
Schema::disableForeignKeyConstraints();
// 外部キー制約が無効の間にデータベースを操作する
doSomethind();
// 外部キー制約を有効化
Schema::enableForeignKeyConstraints();

参考

指定したフォルダ内の画像ファイルの画像サイズを一覧表示するプログラム

指定したフォルダ内の画像ファイルの画像サイズを一覧表示するプログラムです。

Requirement

  • image-size

インストール

image-sizeをインストールする

npm install image-size

使い方

カレントディレクトリの画像ファイルのサイズを表示する

node imagesize.js

指定したディレクトリ内の画像ファイルのサイズを表示する

node imagesize.js image-dir

例:imagesフォルダーの画像ファイルのサイズを表示する

node imagesize.js images

出力形式

カンマ区切りで、ファイル名・画像の幅・画像の高さ表示します。

ファイル名,画像の幅,画像の高さ
ファイル名,画像の幅,画像の高さ
ファイル名,画像の幅,画像の高さ
…

ソースコード

const fs = require('fs');
const path = require('path');
const sizeOf = require('image-size');

const dir = (process.argv.length < 3) ? './' : process.argv[2];

fs.readdir(dir, (err, files) => {
    if (err) throw err;
    files.forEach(file => {
        try {
            const abspath = path.resolve(path.join(dir, file));
            const dimensions = sizeOf(abspath);
            console.log(`${file},${dimensions.width},${dimensions.height}`);
        } catch (err) {
            console.log(err);
        }
    });
});

Laravel MixでAutoprefixerを無効にする

Laravel Mixには最初からAutoprefixerが入っていて、
必要なプレフィックスを自動的に適用します。

プレフィックスを調整したいときは、optionsで設定できます。

mix.sass('resources/sass/app.scss', 'public/css')
    .options({
        autoprefixer: {
            options: {
                browsers: {
                    'last 6 versions',
                }
            }
        }
    });

完全に無効にする場合は次のようにします。

mix.sass('resources/sass/app.scss', 'public/css')
    .options({ autoprefixer: false });