お疲れ様です。
上手く解決できない問題があり、質問します。
あるCSVファイルからデータを読み込んで、DBにインサートするための機能を作りたいです。CAKEPHPを用いてPHPコードで書き、CSVファイルを読み取りすることまでは成功しました。問題は、CSVファイルのデータ件数が増えるとエラーが発生します。
CSVファイルはコンマ区切りのファイルで、フィールドが12個あります。つまり、1件のデータに12個のフィールドがあり、それぞれ文字列が入っている感じです。ファイルの形式などには問題ありません。
CSVファイルの中身が10件の場合は、以下のよう、正常に読み込まれ、DBへのインサートも問題なく成功しました。この場合、CSVファイルから読み取った値が赤文字で表示されます。
しかし、CSVファイルの中身が1000件の場合は、CSVファイルの中身が正常に読み取れず、headers already sent byエラーで怒られ、DBへのインサートもできません。
この場合は、検証ツールのResponseでCSVファイルから読み取った値を確認すると、1000件のデータは全てあるものの、値が黒文字で表示され、連想配列として認識されてないようです。
さらにデータが増えて、10000万件をいれると、データが読み込まれずに、検証ツールでFailed To Load response Dataというエラーとなり、NetworK状況をみると、約13-14MBのResource Loaded By Pageまでグラフが伸びて失敗となってしまいます。Cakephp側では、エラーが表示されないか、Controller actions can only return ResponseInterface instance or null. Got boolean instead.というエラーが出ます。
これまで試してみあのは、PHP.iniのpost_max_sizeを40MBまで増やすのと、memory_limit、Upload_max_filesize、max_input_time、max_input_varsなどの値を多めに増やしてみましたが、結果は変わりませんでした。
ソースコードの問題ではなさそう(10件は成功と確認済み)で、CSVファイルを読み込む時のHeader設定や環境設定の値が可笑しいか、他の原因なのか、だと思いますが…自分では解決できなくて困っています。何かヒントがあれば教えてください。よろしくお願いします。
一応、ソースコードを共有します。
PHP
1 $data = file_get_contents($upFilename); 2 $data = mb_convert_encoding($data, 'UTF-8', 'sjis-win'); 3 $temp = tmpfile(); 4 fwrite($temp, $data); 5 rewind($temp); 6 7 while (($data = fgetcsv($temp, 0, ",")) !== FALSE) { 8 var_dump($data); // 値を取って表示する 9 } 10
あなたの回答
tips
プレビュー