質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
INSERT

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

1回答

4097閲覧

Laravel8系で大量(10万件)の複数INSERTが効かない

mittchy

総合スコア7

INSERT

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2020/11/14 08:10

前提・実現したいこと

現在Laravelを勉強中なのですが、10万件くらいのデータを一気にINSERTしようとすると通らずスルーされてしまいます。
エラー文言が出ないので原因が分からずになってしまっております。
3000件くらいの少ないデータだとDBに問題なく登録されるのですが、件数が多くなると(今回の場合約10万件)、保存されずスルーされてしまします。
ご存じの方いらっしゃいましたら教えていただけると幸いです。

該当のソースコード

$cnt = 0; // csvファイルを開く $handle = fopen($filePath, 'r'); while (($csvContent = fgetcsv($handle)) !== false) {          // 配列に格納 $data[$cnt]['col1'] = $csvContent[0]; $data[$cnt]['col2'] = $csvContent[2]; $data[$cnt]['col3'] = $csvContent[6]; $data[$cnt]['col4'] = $csvContent[7]; $data[$cnt]['col5'] = $csvContent[8]; $data[$cnt]['col6'] = $csvContent[15]; $data[$cnt]['created_at'] = now(); $data[$cnt]['updated_at'] = now(); $cnt ++; }        // 一括insert処理 DB::table('tables')->insert($zipCodeData);

試したこと

タイムアウトの処理も追加してみたのですが、特にに変わらずでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

CHERRY

2020/11/14 08:25

PHP のログやWebサーバーのログにも何も記録されていないのでしょうか?
mittchy

2020/11/14 08:58

そうですね、logにも出力されていない状態です。 ただ、今までコマンド処理で書いていたのですが、Controllerに書き換えてブラウザ上で実行したら500エラーが出ました。 リクエストが処理できていないようなので、容量オーバーとかなのでしょうか?
hentaiman

2020/11/14 09:16

コマンド実行してエラーのログが一切どこにも出ないという事?
退会済みユーザー

退会済みユーザー

2020/11/14 14:38

トランザクション処理している? CGIなどの外部プログラム実行時間は延長させてある? 決められた最大実行時間内に処理が完了しないから、なかったこと(ロールバック)されているような気もするけども。
m.ts10806

2020/11/15 03:56

CSVの容量は? あとそのCSVはどのようにサーバーに送られてるのでしょう。 置いてあるものを読み込ませているのかアップロードもPHPでしてるのか。
guest

回答1

0

こんな感じのコードだと最後までインサートできると思う。

php

1<?php 2 3$file = ''; 4 5$fp = new \SplFileObject($file); 6$fp->setFlags(\SplFileObject::READ_CSV); 7 8$data = []; 9 10foreach ($fp as $i => $line) { 11 $data[$i]['col1'] = $line[0]; 12 $data[$i]['col2'] = $line[2]; 13 $data[$i]['col3'] = $line[6]; 14 $data[$i]['col4'] = $line[7]; 15 $data[$i]['col5'] = $line[8]; 16 $data[$i]['col6'] = $line[15]; 17 $data[$i]['created_at'] = \now(); 18 $data[$i]['updated_at'] = \now(); 19} 20 21foreach (array_chunk($data, 1000) as $chunk) { 22 \DB::transaction(function () use ($chunk) { 23 \DB::table('tables')->insert($chunk); 24 }); 25} 26

投稿2020/11/15 05:23

phper.k

総合スコア3923

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問