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

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

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

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

Q&A

解決済

3回答

2272閲覧

PHPの軽量化方法について

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

1クリップ

投稿2020/04/15 01:24

まずは下記URLにあるテキストファイルにコードを載せておきましたのでご覧ください。いわゆる「初心者の”わかりづらくて重たいコード”」です(だと思います汗)

基本的な動作は、テンプレートの読込>(LOOP:DBからデータの受信>フィルタ>選択シートへの埋め込み)>ファイルへ出力になります。

コードを全部載せていますが、ループ部分は各自省略してください。

この処理を実行すると、どうしても30秒のタイムアウトになってしまい、php.iniの変更で実測したところ、実行時間に1時間11分も必要とし、最大メモリ使用量も16GBにも達してしまいました。

これをどうやって軽量化できるでしょうか。

【テーブルの種類】
0. stocker_a120_flow
0. stocker_a120_unit
0. stocker_a120_storage

【フィルタの種類(※stocker_a120_flowのみ。その他はなし。)】
gnum_:グループコード別
ascls:区分
pnum_:製品コード

【コードファイル】
https://drive.google.com/file/d/1Jb657oTCp_tbJcg1knXQDhNUsKOh5t6H/view?usp=sharing

動作環境

Windows10 + XAMPP(PHP7.3.6・MariaDB10.3.15)

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

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

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

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

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

guest

回答3

0

PHPSpreadSheet使ってるならそこは環境情報として提示された方が良いです。
ただ、DBまで関係しているとなるとそこの情報も全て提示されないことには的確なアドバイスはできませんし、既にある回答のように地道なデバックをしてもらうしかありません。
ひとつ情報として提供すると、PHPSpreadSheetでのファイル操作は結構メモリ喰ったはずで、たくさんのシートやセル、ファイルを操作すると一気にメモリを使ってた記憶があります。
コードは一部しか読んでませんが、PHPSpreadSheetへの操作を、例えばテンプレートファイル用意しておいて書き込むだけにするなど、役割分担の割合をかえるなど、工夫すると少し負荷分散できるかもしれません。

投稿2020/04/15 01:58

m.ts10806

総合スコア80765

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

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

0

まずは、何に時間がかかっているのか測定してください。DBクエリ1本に分単位の時間がかかることもありえます。

特定のDBクエリが遅いのであれば、そのクエリを改善するということになります。

投稿2020/04/15 01:31

maisumakun

総合スコア145121

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

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

maisumakun

2020/04/15 02:03

あと、DBアクセスのたびに毎回毎回PDOの接続からやるのは無駄が多すぎます。DBインスタンスはそのまま引き回しましょう(もっとも、それだけで画期的に時間が短縮されるわけでもないですが)。
退会済みユーザー

退会済みユーザー

2020/04/15 03:10

たぶん実行計画の評価を元にしたクエリーの改良やインデックスの見直しとかやってないんだろうなって察した。
退会済みユーザー

退会済みユーザー

2020/04/15 04:28 編集

すみません、m6uさんのおっしゃるとおりで、とにかく「やらなきゃいけないこと」から「現在のスキルでできること」を並べただけのPHPです。クエリの実行結果がどうこうではなく、”テーブルからビュー経由”で得られる情報をエクセルへ出力できるようにしただけでした。 私にスキルが有れば、3回のDBアクセスから3通りの元データを取得し、3つのうち2つはそのまま割当で問題なく、残りの1つでフィルタ違いの抽出結果を14通りで各ワークシートに割り当てられれば、こんなに重たくならないとは自分でも理解できているんです。ただその方法がプログラミングのわからない私には、その先に進むことができません。
退会済みユーザー

退会済みユーザー

2020/04/15 05:39

よくよく考えたら、都度DB読み込みから1回きりDB読み込みに変更したとしても、どちらにせよphpspreadsheetを使って読み込んだテンプレートに埋め込む作業を行って行く最中は、メモリ内の情報を維持しなければならず、そもそもの方法を改変しない限りは難しいのかなと思いました。 そうなってくると、処理自体を分けて出力して、オフライン(手作業)で結合するしかないのかなぁと考える次第です。
maisumakun

2020/04/15 05:41

> m6uさんのおっしゃるとおりで えっと、全く別件としか読めないのですが。
退会済みユーザー

退会済みユーザー

2020/04/15 06:50

実行計画ってリレーショナルデータベースの用語だって、わかってないのかも。 phpSpreadsheet上のデータを読み込んでphp上でゴニョゴニョするデータ量が膨大なら、 そっちが足を引っ張る可能性もあるけど、 まずは、MySQLの最適化に関する項目: MySQL :: MySQL 5.6 リファレンスマニュアル :: 8.1 最適化の概要 https://dev.mysql.com/doc/refman/5.6/ja/optimize-overview.html からチェックしてみて、SQLは遅くないのだとしたら phpSpreadsheetまわりでどのくらい時間を食っているかを調べるって感じですかねぇ?
退会済みユーザー

退会済みユーザー

2020/04/15 08:16

まだ実験結果が出ていませんが、どうもテンプレートファイルの読み込み自体に問題があるかもしれません。 テンプレートファイルを読み込むだけで、どういうわけか15分以上かかった挙げ句、メモリを最大24GBまで開放したのにそれでも足りないと出てしまいました。 もともとのテンプレートは4MBしか無いのに。。。
guest

0

ベストアンサー

厳密には解決できたわけではないのですが、下記の手順を行いました。

  • ワークシート内に埋め込んだ”串刺し集計”を行う長文の関数を、ファイル出力後に手作業で埋め込む。
  • phpspreadsheetのメモリ解放?が行われていなかったようなので再起動後開放コマンド追記

php

1 //バッファ消去 2 ob_end_clean(); 3 4 // Excelファイル出力 5 $tmpFiles = "./files/" . $fileName; 6 $writer = new XlsxWriter($spreadsheet); 7 $writer->save("$tmpFiles"); 8 9 // ワークシートを閉じる 10 $spreadsheet->disconnectWorksheets(); 11 $spreadsheet->garbageCollect();

なお、本来処理毎にDB接続=>データ取得にするのではなく、一度取得したDBデータを必要に応じて使い回す方法も頭には浮かんだのですが、スキルが足りずプログラミングができなくて断念しました。

皆さんにはたくさん回答頂きましてありがとうございました。
私のような初心者は、もしかしたら、利用可能なレベルにまで到達していないのかもしれません。しかし、たくさんの情報を頂き、参考にしながらなんとか打開策を導き出せました。ありがとうございました。

投稿2020/04/24 04:46

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問