PHPでメモリの使用状況を見てみたいうんたらかんたら
PHP4を使っているとき、ありがちな状況として、マニュアルで見つけた使いたい関数がPHP5以降になってることがよくあります。
その1つ。
PHP: memory_get_peak_usage - Manual
memory_get_peak_usageはPHP によって割り当てられたメモリの"最大値"を返す関数。
memory_get_usageだと"その時点"のものなのでどうしても使いにくい。
こういう関数があるってことだけでも覚えておくと良いかもです。
その1つ。
PHP: memory_get_peak_usage - Manual
memory_get_peak_usageはPHP によって割り当てられたメモリの"最大値"を返す関数。
memory_get_usageだと"その時点"のものなのでどうしても使いにくい。
こういう関数があるってことだけでも覚えておくと良いかもです。
PHP4でシングルトン
PHP4でシングルトンなクラスの設計をしていて、サブクラスを作ってふがふが…って話が出てきた。
シングルトンってサブクラス作れないだろうと思いきや、PHP4だとコンストラクタもpublicだしサブクラス作れちゃうのでした。
▼ 実行結果
とりあえず、こんな感じかな?
サブクラスのgetInstanceの実装はかなりイケてないんだけど、クラス名がとれないっぽいので。
う〜ん。PHP4のstaticの挙動はかなりアレだな。
シングルトンってサブクラス作れないだろうと思いきや、PHP4だとコンストラクタもpublicだしサブクラス作れちゃうのでした。
- class AbstractSingle
- {
- var $value;
- function AbstractSingle () {}
- function & getInstance () {
- static $instance;
- if ($instance === NULL) {
- $instance = new AbstractSingle();
- }
- return $instance;
- }
- function setValue ($value) {
- $this->value = $value;
- }
- function getValue () {
- return $this->value;
- }
- }
- class SingleA extends AbstractSingle
- {
- function SingleA () {
- parent::AbstractSingle();
- }
- function & getInstance () {
- static $instance;
- if ($instance === NULL) {
- $instance = new SingleA();
- }
- return $instance;
- }
- }
- class SingleB extends AbstractSingle
- {
- function SingleB () {
- parent::AbstractSingle();
- }
- function & getInstance () {
- static $instance;
- if ($instance === NULL) {
- $instance = new SingleB();
- }
- return $instance;
- }
- }
- $a =& SingleA::getInstance();
- $a->setValue('A');
- $b =& SingleB::getInstance();
- $b->setValue('B');
- print $a->getValue();
- print "\n";
- print $b->getValue();
- print "\n";
- $a2 =& SingleA::getInstance();
- $a2->setValue('A2');
- print $a->getValue();
- print "\n";
- print $b->getValue();
- print "\n";
▼ 実行結果
A
B
A2
B
とりあえず、こんな感じかな?
サブクラスのgetInstanceの実装はかなりイケてないんだけど、クラス名がとれないっぽいので。
う〜ん。PHP4のstaticの挙動はかなりアレだな。
PHP:SimpleXMLでXMLを扱う
■ PHP で XML
XML の標準 API として DOM や SAX があるわけですが、PHP では SimpleXML という API も使えます。
これは階層構造のデータにその名の通りシンプルにアクセスできます。また、DOM と相互変換が可能なので双方うまいこと使い分けると幸せになれるでしょう。
[ThinkIT] Part5:PHP5のXMLサポート(1) (1/2)
と、SimpleXML は素晴らしいのですが、残念ながら PHP4 では使えません。そこで簡易的に XML を使えるライブラリを探しました。
これ↓
Keith Devens .com - PHP XML Library
使い方は非常に簡単です。
$data は配列になっているので階層を辿っていけば目的のデータを取得できます。
XML の標準 API として DOM や SAX があるわけですが、PHP では SimpleXML という API も使えます。
これは階層構造のデータにその名の通りシンプルにアクセスできます。また、DOM と相互変換が可能なので双方うまいこと使い分けると幸せになれるでしょう。
- // SimpleXML を使う。
- print '<h2>SimpleXML</h2>';
- $books = simplexml_load_file('data/xml_hoge.xml');
- print '<table border="1">';
- foreach ($books->book as $book) {
- print "<tr><td>$book->title</td><td>$book->author</td></tr>";
- }
- print "</table>";
- echo "<hr />";
- // SimpleXML → Dom
- $dom = dom_import_simplexml($books);
- // Dom を使う。
- print '<h2>DOM</h2>';
- $books = $dom->childNodes;
- print '<table border="1">';
- foreach ($books as $book) {
- if (@$book->nodeName == 'book') {
- $content = $book->childNodes;
- foreach ($content as $elem) {
- if (@$elem->nodeName == 'author') {
- $author = $elem->nodeValue;
- }
- if (@$elem->nodeName == 'title') {
- $title = $elem->nodeValue;
- }
- }
- print "<tr><td>$title</td><td>$author</td></tr>";
- }
- }
- print "</table>";
[ThinkIT] Part5:PHP5のXMLサポート(1) (1/2)
と、SimpleXML は素晴らしいのですが、残念ながら PHP4 では使えません。そこで簡易的に XML を使えるライブラリを探しました。
これ↓
Keith Devens .com - PHP XML Library
使い方は非常に簡単です。
- $xml = file_get_contents("xml_hoge.xml");
- $data = XML_unserialize($xml);
$data は配列になっているので階層を辿っていけば目的のデータを取得できます。
PEAR::DB 今さら
- $con =& DB::connect($dsn, array('persistent' => true));
persistentオプションをコネクト時に渡すと永続的な接続になります。
例えば、MySQLだとmysql_pconnect関数が呼ばれるようになる、と。
- $connect_function = $persistent ? 'mysql_pconnect' : 'mysql_connect';
とはいえ、何でもpersistentにすればよいのかというとそうではありませんので注意。
PHP: 持続的データベース接続 - Manual
PEAR::Logメモ
ロギングクラスです。ファイルだけでなく、メールやら DB にも出力できる素敵なライブラリです。
■ 前提
PEARはインストール済み
■ インストールする
pear コマンドでサクッといきます。
完了したら確認っす。
以上、簡単だねb
■ 使ってみる
とりあえずファイルにログを出力してみます。
こんな感じ。
■ ログレベル
ログレベルの指定は8段階あり、クリティカルな順に
オブジェクト取得時に指定した以上のレベルのログが出力されます。つまり、
ってことです。最後のエラーレベル名の関数はすべてのエラーレベルについてそれぞれ用意されています。ちなみに実装はエイリアス。
てことは log 関数を使った方が早いかもね、どうなのよ?(マロン風
■ 前提
PEARはインストール済み
■ インストールする
pear コマンドでサクッといきます。
pear install --alldeps Log
完了したら確認っす。
C:\dev>pear list
INSTALLED PACKAGES, CHANNEL PEAR.PHP.NET:
=========================================
PACKAGE VERSION STATE
DB 1.7.11 stable
Log 1.9.11 stable
(その他は略)
以上、簡単だねb
■ 使ってみる
とりあえずファイルにログを出力してみます。
- $conf = array('timeFormat' => '%x %X');
- $log = Log::singleton('file', 'C:\temp\app.log', 'test', $conf, PEAR_LOG_INFO);
- $log->log(__METHOD__ . '開始', PEAR_LOG_INFO);
こんな感じ。
■ ログレベル
ログレベルの指定は8段階あり、クリティカルな順に
- PEAR_LOG_EMERG
- PEAR_LOG_ALERT
- PEAR_LOG_CRIT
- PEAR_LOG_ERR
- PEAR_LOG_WARNING
- PEAR_LOG_NOTICE
- PEAR_LOG_INFO
- PEAR_LOG_DEBUG
オブジェクト取得時に指定した以上のレベルのログが出力されます。つまり、
- $log = Log::singleton('file', 'C:\temp\app.log', 'test', $conf, PEAR_LOG_INFO);
- $log->log(__METHOD__ . '開始', PEAR_LOG_INFO); // 出力される
- $log->log(__METHOD__ . '開始', PEAR_LOG_ERR); // 出力される
- $log->log(__METHOD__ . '開始', PEAR_LOG_DEBUG); // 出力されない
- $log->debug(__METHOD__ . '開始'); // 出力されない(上と同じ意味)
ってことです。最後のエラーレベル名の関数はすべてのエラーレベルについてそれぞれ用意されています。ちなみに実装はエイリアス。
- function debug($message)
- {
- return $this->log($message, PEAR_LOG_DEBUG);
- }
てことは log 関数を使った方が早いかもね、どうなのよ?(マロン風



