勉強したことのメモ

webプログラマが勉強したことのメモ。

PHPでCSVを出力する際にメモリを節約

   

MySQLよりデータを大量に取り出してCSV化し、ダウンロードさせるというPHPのプログラムを作成した。今まではデータ件数が少なかったので問題なかったが今回は数十万件のデータをCSV化するというものになりメモリが足りなくなった。一旦はmemory_limitを変更することで対応したが、できればプログラム側でもメモリを節約するように変更したい。以下に方法をメモ。

 

テスト条件

使用したテーブル構造は以下の通り。

mysql> show columns from item;
+--------------+------------------+------+-----+---------+----------------+
| Field        | Type             | Null | Key | Default | Extra          |
+--------------+------------------+------+-----+---------+----------------+
| id           | int(11)          | NO   | PRI | NULL    | auto_increment |
| key          | varchar(30)      | YES  |     | NULL    |                |
| point        | int(10) unsigned | YES  |     | NULL    |                |
| created_date | datetime         | YES  | MUL | NULL    |                |
+--------------+------------------+------+-----+---------+----------------+

ランダムなデータを400万件ほど突っ込んであるテーブルで今回はそこから1万件取得し、CSV化するというもの。

 

今までのCSV化方法

以下記事のまま作成。

https://taitan916.info/blog/?p=2078

メモリ使用量は約9MBとなった。

 

今回試した方法

$name = date('ymdhis');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $name . '.csv');
$fp = fopen('php://output', 'w');
stream_filter_append($fp, 'convert.iconv.UTF-8/CP932', STREAM_FILTER_WRITE);

$sql = '
	SELECT * 
	FROM item 
	LIMIT 10000
';
$row = $mysqli->query($sql);

while ($rs = $row->fetch_array(MYSQLI_ASSOC)) {
	fputcsv($fp, $rs);
}

メモリ使用量は約2MB。4.5倍ほど改善された。

 

参考サイト

http://codaholic.org/?p=1800

https://lab.flama.co.jp/archives/1139/

 - PHP

  関連記事

PHPでパーミッションの変更

chmodというみたことが無いPHP関数があったのでメモ。 ■参考サイト htt ...

WordPressにてPHPのAPCuを使用して高速化を図る方法

先日本サイトのサーバにAPCuを導入した。しかしながら所感にも書いたとおりAPC ...

PHPで「Unable to allocate~」とエラー

PHPで「Unable to allocate memory for pool」 ...

smart_resize_imageで縦横の比率関係なく、固定リサイズ

PHPで縦横どちらかが指定の長さを超えた場合、比率を保ったままリサイズで使ったs ...

クロスドメインな状況でiframeがIEのみ挙動がおかしくなる場合

iframeで別のドメインのサイトを表示させた場合に、firefoxやchrom ...

日付の比較で○日前というのを調べる

PHP及びjavascriptで日付の比較をしたく、締切日とかではなく ○日前と ...

PHP5.4系でAPCが上手く動かなかったので5.5にアップデート&Zend OPcache導入

PHP5.3系から5.4系にアップデートしてから、WordPressがちょっと重 ...

XHTMLをPHPファイルで取り扱う際の注意点

デザイナーさんからガラケーサイト用に渡されたHTMLファイルが XHTMLで書か ...

PHPでURLを解析してクエリを抽出する方法

formからGETでURLの文字列を送信したものを、受信した側でクエリ部分のみ抽 ...

cronの設定方法

cronを設定してみたので方法をメモ。 まずcronで動かすPHPを作成。 ■c ...