【PHP】PHPExcelの処理が遅すぎるとき

PHPExcelはPHPでExcelのブックやシートを読込み、作成、出力できるライブラリです。

CSVではなくExcelで出力することで
はじめから可視化しやすい形で出力できるのですが、
データ量やシートの複雑さによっては
出力にかなり時間がかかるようになってしまうことがあります。

もし何も考えずにループの中で

を多用しているならば、チューニングによって
劇的に速くなるかもしれません。

例えば、帳票の出力などでは動的に行が増える場合が多いと思いますが、
ループの中で

のように1行ずつ追加していくような処理は、
かなりパフォーマンスが悪いようです。

そういうときには、追加する行数を計算してから

を1回実行することでパフォーマンスが向上します。

もし行数を計算するためだけに追加でループさせる必要があったとしても
1行ずつ

を実行するよりははるかに速い場合が多いようです。

また、

も、もしループの中で同じスタイルを1行ずつ実行しているのならば、
できる限りループの外で一括で実行することで
劇的にパフォーマンスが向上する可能性があります。

私の場合、実際にExcelで帳票を出力する場面があったのですが、
何も考えずに実装したときと、上記のとおりチューニングした場合とでは
10倍くらいの差がありました。

【TCPDF】HTMLからのPDF出力で社印(角印)を会社情報にかぶせたい

PHPからPDF出力が簡単にできるTCPDFですが、
その中でもさらに、HTMLタグでPDFが作成できる機能は
WEBアプリの開発者にとっては
とても簡単に成形されたPDFが作成できるので便利です。

最近のバージョンではHTMLのタグだけではなく、
スタイルシートもある程度は反映してくれます。
ただ、さすがにブラウザとは違うので
すべてのHTMLやスタイルの表現が使えるわけではありません。

WEBでPDF出力がよく使われるもののひとつに
「領収証の出力」
がありますが、
このとき紙の領収証と同じように
会社情報に社印(角印)を少しかぶせて表示させたいですよね。

ブラウザ上ならスタイルでいろんなやり方がありますが、
TCPDFのHTML変換機能では使えないものが多いようです。
いろいろ試した結果、実現できた方法はtableタグのスタイル「padding-top」でした。

例:

【PHP】【MySQL】日付の書式の違い

PHPとMySQLで日付の書式が若干違っています。
どちらかしか使わないと決めているならいいのですが、
日付の整形をPHPでやるか、MySQLでやるいか、ケースバイケースなんですよね。

PHPは

使い方は

MySQLは

使い方は

【MySQL】PHPのstrposをSQLでやる

MySQLのLOCATE関数でPHPのstrpos関数と同様のことができます。

このSQLの答えは5が返ってきます。

PHPのstrposと異なるのは、
1文字目がヒットした場合は0ではなく1を返します。
存在しなかった場合は0が返ってきます。

私がよく使うパターンとしては
データの中にキーワードが含まれるかどうかの判定ですね。

【PHP】Last-Modifiedヘッダによる静的コンテンツのキャッシュ制御

画像などの静的コンテンツのファイルに直接アクセスした場合は
ブラウザが自動的にキャッシュ制御を行ってくれますが、
PHPで静的コンテンツを返すような処理を行っている場合にキャッシュを利用するには
Last-Modifiedヘッダを使ってキャッシュを制御する必要があります。

まず、PHPでファイルをダウンロードさせる際に
filemtime関数でファイルの更新日時を取得してLast-Modifiedヘッダを追加します。

さらにキャッシュを残すためのヘッダも追加します。

そうすると、次に同じファイルをダウンロードしようとした際のリクエストヘッダの中に

というヘッダが追加され、ファイルの更新日時が入っています。

ですので、このヘッダの有無を調べ、ファイルの更新日時と比較することで
ファイルを返すかキャッシュを返すかを判定します。

レスポンスコード304を返す処理は下記の通りです。

ちなみに、Etagというヘッダを使ってキャッシュを制御することもできますが
Etagはどちらかというと動的コンテンツのキャッシュで利用するためのものです。
静的コンテンツのキャッシュにもEtagを使ったサンプルが多くみられるのですが
Last-Modifiedヘッダだけで十分だと思います。