🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PHP

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

Q&A

解決済

3回答

2081閲覧

テーブルの情報をエクセルに取り込む関数(mysql)

watosonn12345

総合スコア6

PHP

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

0グッド

0クリップ

投稿2019/10/24 05:22

編集2019/10/25 09:33

PHPにて、mysqlにあるテーブルのデータをエクセルに取り込み、そのエクセルファイルをダウンロードするコードを作っています。ここで、テーブルのデータ量が多すぎるためにエラーが発生する(●●のウェブページは一時的に停止しているか、新しいウェブアドレスに移動した可能性があります。)のですが、php.iniを変更する以外で解決方法はありますか?具体的なコードは見せられないです、すみません。

PHPEXCELを使用しているために、エクセル作成時に膨大なメモリを消費しており、それが動作不良の原因でした。解決策は模索中です。←一時間程度待てばDL可能だということが判明したので、これを数分に短縮したいです。

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

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

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

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

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

m.ts10806

2019/10/24 06:07

どんなデータをどんなコードで対処しようとしているか提示されてないのでなんとも。 それができないならサーバーの設定なども開示いただく必要があるでしょうし、前提や背景すら提示難しいのでしたら解決にはつながりにくい抽象的すぎるコメントしかできませんよ
m.ts10806

2019/10/25 04:02

謝ったところで問題はなにも進まないので質問編集してきちんと解決させてください。
m.ts10806

2019/10/25 09:25

あまり応えてもらった感はないですけど全く答えられないわけではないですね
m.ts10806

2019/10/25 09:32

あでも先に思ってた回答がついてたので私からはないです。
watosonn12345

2019/10/25 09:34

時間短縮する方法について教えてほしいです;;
m.ts10806

2019/10/25 09:56

PHPからは実行コマンド叩くだけにしてあとは全部別言語にやらせるくらいしか。適材適所といいますし。
watosonn12345

2019/10/25 10:40

phpでさえ始めたばかりなので別言語はとても……ですがありがとうございます
guest

回答3

0

ベストアンサー

PHP 内で Excel を作成して、それをダウンロードさせている、のですよね?

おそらく PhpSpreadsheet を使っているかと思いますが、あれは結構豪快にメモリを食います。
詳しくは公式サイトにありますが、1cell あたりざっくり 1KB(セルに最大の255文字突っ込んだ場合)食いますので、それなりに広いエクセルファイルだと内部的なメモリはかなり使っていると思われます。
さらに Cell, Worksheet, Workbook といったオブジェクトの階層構造が複雑であるため、メモリの解放がうまくいかない、という宿痾があります。
※ので、強制的に行う方法が提示されています

60000行×20列だと
20*60000 = 1200000KB = 1171.875MB = 1.14441 GB くらいは最悪で覚悟する必要がありますね。

投稿2019/10/25 06:32

編集2019/10/25 06:37
tacsheaven

総合スコア13703

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

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

watosonn12345

2019/10/25 08:24

ありがとうございます、やはりデータ量が膨大なのが原因みたいです、強制的に行う方法というのはどちらに書かれていますか?探しましたが見つかりません
tacsheaven

2019/10/25 08:38

公式のドキュメントにある "Creating a spreadsheet" の最後、"Clearing a Workbook from memory" を参照してください。一回で複数の excel ファイルを作るような場合は効果が見込めます。
watosonn12345

2019/10/25 08:48

ありがとうございます。一つのデータベースから一つのエクセルファイルを作成したい場合、ある領域で区切ってその都度キャッシュをクリアしていくことって可能ですか?
tacsheaven

2019/10/25 09:08

workbook -> worksheet -> range(cell) といった構造は維持していないと最終出力ができませんから、書き込み終わるまではクリアできないですね。 また一度書き込んでクリアしても、追記するために読み込めばオブジェクトが展開されるから同じ事になりますし。
watosonn12345

2019/10/25 09:13

ありがとうございます。メモリ消費はおいといて、処理(DLまでの時間)を早くするためになにか試すべきことはありますでしょうか?
m.ts10806

2019/10/25 09:36 編集

csvでダウンロードしかないんじゃないかな。それを自分でExcelで開いて加工 もともとファイル操作をするための言語ではないのであまりそこまでやらせるのも酷ですよ。月報みたいなフォーマットが決まったものにデータ突っ込むまででしょう。
tacsheaven

2019/10/25 09:38

PHPExcel(とその後継であるPhpSpreadsheet)では、Excel のデータをオブジェクト化しています。操作はしやすいのですがその分メモリも処理時間も食うので、速度優先であれば csv として吐き出して、あとでクライアント側で excel に取り込んで加工した方がよいです。 時間がかかる処理ならば、ブラウザでは処理を受け付けるだけにして、cron か何かでバッチ処理で作成してダウンロード可能な状態に持っていく、なんて方法もあることはありますが。 ただ、いくらでかい excel だといっても、1時間程度かかるというのは尋常じゃないですね。サーバのスペックが足りなくてメモリスワップを頻発させているとか、何か別の要因も考えなきゃならないかと思います。
watosonn12345

2019/10/25 09:47

お二人ともありがとうございます。excelファイルではなくcsvファイルにmysqlのテーブルデータを書き込むようにコードを修正してみます。
watosonn12345

2019/10/25 09:51

まあコード書けないんですけども・・・
m.ts10806

2019/10/25 09:55

サンプルコードは幾らでもあります。
watosonn12345

2019/10/25 10:41

ありがとうございます。真似します。
guest

0

https://www.php.net/manual/ja/function.set-time-limit.php

タイムアウトであればこれとかですかね
ほかにもini_set関数とかでその処理中だけiniの設定値書き換えるものがあるので調べてみるといいかもしれません

投稿2019/10/24 05:31

hanhunhun

総合スコア100

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

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

watosonn12345

2019/10/24 05:44

説明不足ですみません、php.iniをいくらいじっても直りませんでした
hanhunhun

2019/10/24 05:54

サーバーのログ等は確認されましたか? エラーの内容の詳細が分かれば解決の糸口になるかと
watosonn12345

2019/10/25 05:44

返信遅れてすみません。エラーログを見たところ、Allowed memory size of ●● bytes exhaustedと表示されたので、php.iniで設定したメモリの許容量をエクセルファイルが超えてしまっているのだと思います。●●は現在700Mなのですが、さらに増やしてしまってもいいのでしょうか・・・
Y.H.

2019/10/25 05:51

空きメモリがそれ以上あるのであれば増やしてもいいですが、 現状1アクセスで700Mを超えてるんですよね? システムの条件として2多重以上では動作させないという制限など設けられてるんでしょうか? 1GBに増やしてなんとかなったとしても、同時アクセスが2つあるだけでまたメモリ足りなくなりますよ。
watosonn12345

2019/10/25 06:22

おそらくそのような制限はありません。メモリを増やしたところ、ダウンロードできたのですが、ダウンロードしたエクセルファイル自体は3000kb程度しかありませんでした、これはなぜでしょうか?
Y.H.

2019/10/25 06:26

> これはなぜでしょうか? ソースファイルもデータも提示が無いので そのExcelファイルを作成する過程でいっぱいメモリを使用しているのでしょう。 としか言えないです。
Y.H.

2019/10/25 06:31

その「Excelファイル」はcsvではなく*.xlsxですか? であれば、*.xlsxは実はzipファイル形式です。 拡張子をzipに変更し展開してみましょう。展開後のファイルサイズの合計はどれくらいでしょうか?
watosonn12345

2019/10/25 08:25

2MBMBくらいで、たいしたことはありませんでした。やはりメモリを食っているのは処理だと思います
guest

0

csvで渡せば、excelで開けると思いますが
開けないならexcelの許容量をオーバーしているだけかも

投稿2019/10/24 05:28

yambejp

総合スコア116661

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

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

watosonn12345

2019/10/24 05:43

ほかのデータが少ないテーブルなら開けるので、後者だと思います
yambejp

2019/10/24 06:16

何列、何行、1セルの平均的なデータ量などないとなんとも言えません。 ちなみにでかいデータをエクセルに乗せても仮に開けても 遅くて使い物にならないのでもたせる意味はあまりないです。 集計、抽出をMySQL側で処理して必要なデータのみエクセルに 落としてください
yambejp

2019/10/25 06:30

そのくらいのデータならクライアント側のエクセルの問題ではないですね おつかいのエクセル作成用のライブラリが大量にメモリを 食うだけかもしれません
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問