20220111のlaravelに関する記事は3件です。

compactの使い方

UserController.php public function index() { $user = Auth::user(); return view('index', compact('user')); } $userにログインしているユーザー情報を定義、$を付けずcompactの中にuserと記載し、index.blade.php(ビュー側)に定義した$userを渡す事が出来ます。 index.blade.php <p>{{ $user->name }}</p> と記載をするとログインしているusersテーブルのnameカラムを取得し表示する事ができます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel,MySQL】MySQLへのinsert速度について調べてみた

概要 本記事は、PHPフレームワークLaravel入門 第2版で学習している中の疑問・つまづきの備忘録です。 今回はLaravelからMySQLへのinsert速度について調べたことをまとめます。 なお、PHPフレームワークLaravel入門 第2版ではSQLiteを利用していますが、MySQLに読み替えて同じことを行なっています。 サンプルコード 以下はPHPフレームワークLaravel入門 第2版に記載されていた、シーディング処理です。 PeopleTableSeeder.php public function run() { $param = [ 'name' => 'taro', 'mail' => 'taro@yamada.jp', 'age' => '12', ]; DB::table('people')->insert($param); $param = [ 'name' => 'hanako', 'mail' => 'hanako@flower.jp', 'age' => '34', ]; DB::table('people')->insert($param); $param = [ 'name' => 'sachiko', 'mail' => 'sachiko@happy.jp', 'age' => '56', ]; DB::table('people')->insert($param); } PHPフレームワークLaravel入門 第2版 このコードではinsert()メソッドが同じように複数回呼ばれています。 冗長で効率が悪く見えたので見えたので次のコードも試してみたところ、同様に動作しました。 PeopleTableSeeder.php public function run() { $param1 = [ 'name' => 'taro', 'mail' => 'taro@yamada.jp', 'age' => '12', ]; $param2 = [ 'name' => 'hanako', 'mail' => 'hanako@flower.jp', 'age' => '34', ]; $param3 = [ 'name' => 'sachiko', 'mail' => 'sachiko@happy.jp', 'age' => '56', ]; //ここを変更 $insert_params = [$param1, $param2, $param3]; //insertの呼び出しが1回で済む DB::table('people')->insert($insert_params); } 結局どちらがいいのか コードのきれいさでは後者の方がよさそうですが、大量のレコードをinsertする場合はどちらの方が効率がいいのかを調査しました。 その結果、MySQLの場合は、一度に複数レコードをinsertする方が高速に処理できるようです。 また、このことをバルクインサートと言います。 バルクインサートとは、リレーショナルデータベース(RDB)のテーブルに行を追加する際、複数の行を一回のSQL文の実行で追加すること。 INSERT文に複数行のデータを列挙する バルクインサート(bulk insert)とは - IT用語辞典 e-Words 下のグラフは一度にinsertする件数と速度の関係を示しています。 It takes around 1,000 inserts per query to reach the maximum throughput in both cases, but 40 inserts per query are enough to achieve 90% of this throughput on localhost, which could be a good tradeoff here. It’s also important to note that after a peak, the performance actually decreases as you throw in more inserts per query. High-speed inserts with MySQL 従って、MySQLでは一度に1000レコード程度をinsertした場合に最速となります。特にlocalhostの場合は、一度に40レコード程度で最速の90%の速度が出るようです。 一方で1000レコード以上に増やしていくと、徐々に速度が落ちていきます。 MySQLのドキュメントにも以下のような記載があります。 同じクライアントから同時に多数の行を挿入する場合は、複数の VALUES リストで INSERT ステートメントを使用して、同時に複数の行を挿入します。 これは、個別の単一行の INSERT ステートメントを使用するより、大幅に (場合によっては数倍) 速くなります。 MySQL 8.0 リファレンスマニュアル(INSERTステートメントの最適化) 実際に試してみた まずは、10000レコードを1レコードごとにinsertしてみました。 PeopleTableSeeder.php public function run() { for ($i = 0; $i < 10000; $i++) { $param = [ 'name' => "name{$i}", 'mail' => "test{$i}@example.com", 'age' => '30', ]; DB::table('people')->insert($param); } } $ ./vendor/bin/sail artisan db:seed Seeding: Database\Seeders\PeopleTableSeeder Seeded: Database\Seeders\PeopleTableSeeder (67,399.28ms) Database seeding completed successfully. 結果は67秒程度。 次に、10000レコードを1000ずつ分割してinsertしました。 PeopleTableSeeder.php public function run() { $params = []; for ($i = 0; $i < 10000; $i++) { $param = [ 'name' => "name{$i}", 'mail' => "test{$i}@example.com", 'age' => '30', ]; $params[$i] = $param; if (count($params) >= 1000) { DB::table('people')->insert($params); $params = []; } } } $ ./vendor/bin/sail artisan db:seed Seeding: Database\Seeders\PeopleTableSeeder Seeded: Database\Seeders\PeopleTableSeeder (236.20ms) Database seeding completed successfully. 速い!! こちらは1秒以下で終了しました。 10000レコードでこの差なので、件数が増えるとさらに影響が大きくなりそうですね。 まとめ MySQLにおいてレコードをinsertする際は、1000レコード程度をバルクインサートするのが最も高速になります。 実際に試してみて、insert処理1つでこれほどの差が出て感動しました。 特に大規模なアプリになると、このようなDBとのやりとりの実装方法も重要になると実感できたので、今後に活かそうと思います。 参考文献 PHPフレームワークLaravel入門 第2版 バルクインサート(bulk insert)とは - IT用語辞典 e-Words High-speed inserts with MySQL MySQL 8.0 リファレンスマニュアル(INSERTステートメントの最適化)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel jetstream ubuntu20

ubuntuで実施 sudo apt-get update sudo apt-get upgrade sudo apt-get install vim PDO関連のドライバーやその他のパッケージをインストールする sudo apt-get install php-intl sudo apt-get install apache2 php php-gd mysql-server php-mysql php-fpm sudo apt-get install php-zip php-mbstring php-xml php7.4-cli php-dev sudo apt-get install php-mbstring php-xml php-json sudo apt-get install php7.4-sqlite3 #composer導入 sudo apt-get install curl curl -sS https://getcomposer.org/installer sudo apt-get install composer which composer パス設定の場所を変えよう(mv)でね sudo mv composer /usr/local/bin/composer which composer 所有権の設定を変えよう sudo chmod 755 /usr/local/bin/composer export PATH=/usr/local/bin:$PATH which composer Laravel自体のインストールとかパスとか色々 composer global require "laravel/installer" export PATH="$PATH:/.config/composer/vendor/bin" source ~/.bashrc インストールからコレクティブの設定まで composer create-project --prefer-dist laravel/laravel brog cd brog composer install composer require "laravelcollective/html" node.jsの設定です。一旦myappから離れてから行って下さい cd sudo apt install -y nodejs npm sudo npm install n -g sudo apt install npm sudo n stable sudo apt install nodejs curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash source ~/.bashrc sudo apt purge -y nodejs npm 利用可能なNodeのバージョンを確認 nvm list-remote nvm install v14.2.0 v14.0.0 v14.1.0 v14.2.0 上記のどれかを選択 稀にnodeのバージョンが古すぎるとNGになるので要注意 cd brog composer require laravel/jetstream php artisan jetstream:install livewire npm install && npm run dev php artisan key:generate php artisan migrate php artisan serve
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む