現在、PDO を使用する PHP でアプリケーションを開発しています。CSVファイルを読み込み、データベースのレコードをチェックし、更新、削除などを行うインポートを書いています....
私が気付いたのは、このスクリプトで使用されているメモリが非常に多く、クエリの実行方法に関係しているように見えることです。CSV の各行に対して実行されるクエリの例については、以下を参照してください。
$qry = "SELECT * FROM company WHERE id = 1";
$sth = $this->prepare($qry);
$sth->execute();
$sth->setFetchMode(PDO::FETCH_INTO, new Company());
$sth->fetch();
上記の場合、memory_get_peak_usage() = 6291456
以下を使用する場合:
$qry = "SELECT * FROM company WHERE id = 1";
$sth = $this->prepare($qry);
$sth->execute();
$sth->setFetchMode(PDO::FETCH_CLASS, "Company");
$sth->fetch();
上記の場合、memory_get_peak_usage() = 524288
ご覧のとおり、その差はかなり大きいです。
私は3つの質問があると思います..
- PHP 5.3.5 で PDO::FETCH_OBJ を使用するとメモリ リークが発生しますか?
- FETCH_OBJ とは対照的に FETCH_CLASS の使用に違いはありますか?
- 他の誰かが同じ問題を経験しましたか?
Company クラスは単純です。
class Company {
function __construct(){}
/**classvars**/
public $_tablename = 'company';
public $transient;
public $id;
public $name;
/**endclassvars**/
}