Olen onnellinen.

あしたもどこかで NullPointerException。資格試験とかシステム開発の記録だったりなかったり。

PHPでメモリの使用状況を見てみたいうんたらかんたら

PHP4を使っているとき、ありがちな状況として、マニュアルで見つけた使いたい関数がPHP5以降になってることがよくあります。

その1つ。

PHP: memory_get_peak_usage - Manual

memory_get_peak_usageはPHP によって割り当てられたメモリの"最大値"を返す関数。
memory_get_usageだと"その時点"のものなのでどうしても使いにくい。

こういう関数があるってことだけでも覚えておくと良いかもです。

このエントリーを含むはてなブックマーク | 

PHP4でシングルトン

PHP4でシングルトンなクラスの設計をしていて、サブクラスを作ってふがふが…って話が出てきた。
シングルトンってサブクラス作れないだろうと思いきや、PHP4だとコンストラクタもpublicだしサブクラス作れちゃうのでした。

  1.  <?php
  2.  
  3.  class AbstractSingle
  4.  {
  5.      var $value;
  6.  
  7.      function AbstractSingle () {}
  8.  
  9.      function & getInstance () {
  10.          static $instance;
  11.          if ($instance === NULL) {
  12.              $instance = new AbstractSingle();
  13.          }
  14.          return $instance;
  15.      }
  16.      
  17.      function setValue ($value) {
  18.          $this->value = $value;
  19.      }
  20.      
  21.      function getValue () {
  22.          return $this->value;
  23.      }
  24.  }
  25.  
  26.  class SingleA extends AbstractSingle
  27.  {
  28.      function SingleA () {
  29.          parent::AbstractSingle();
  30.      }
  31.  
  32.      function & getInstance () {
  33.          static $instance;
  34.          if ($instance === NULL) {
  35.              $instance = new SingleA();
  36.          }
  37.          return $instance;
  38.      }
  39.  }
  40.  
  41.  class SingleB extends AbstractSingle
  42.  {
  43.      function SingleB () {
  44.          parent::AbstractSingle();
  45.      }
  46.  
  47.      function & getInstance () {
  48.          static $instance;
  49.          if ($instance === NULL) {
  50.              $instance = new SingleB();
  51.          }
  52.          return $instance;
  53.      }
  54.  }
  55.  
  56.  $a =& SingleA::getInstance();
  57.  $a->setValue('A');
  58.  $b =& SingleB::getInstance();
  59.  $b->setValue('B');
  60.  
  61.  print $a->getValue();
  62.  print "\n";
  63.  print $b->getValue();
  64.  print "\n";
  65.  
  66.  $a2 =& SingleA::getInstance();
  67.  $a2->setValue('A2');
  68.  
  69.  print $a->getValue();
  70.  print "\n";
  71.  print $b->getValue();
  72.  print "\n";



▼ 実行結果
A
B
A2
B



とりあえず、こんな感じかな?
サブクラスのgetInstanceの実装はかなりイケてないんだけど、クラス名がとれないっぽいので。
う〜ん。PHP4のstaticの挙動はかなりアレだな。

このエントリーを含むはてなブックマーク | 

PHP:SimpleXMLでXMLを扱う

■ PHP で XML
XML の標準 API として DOM や SAX があるわけですが、PHP では SimpleXML という API も使えます。
これは階層構造のデータにその名の通りシンプルにアクセスできます。また、DOM と相互変換が可能なので双方うまいこと使い分けると幸せになれるでしょう。

  1.  <?php
  2.   // SimpleXML を使う。
  3.   print '<h2>SimpleXML</h2>';
  4.   $books = simplexml_load_file('data/xml_hoge.xml');
  5.   print '<table border="1">';
  6.   foreach ($books->book as $book) {
  7.      print "<tr><td>$book->title</td><td>$book->author</td></tr>";
  8.   }
  9.   print "</table>";
  10.   echo "<hr />";
  11.  
  12.   // SimpleXML → Dom
  13.   $dom = dom_import_simplexml($books);
  14.  
  15.   // Dom を使う。
  16.   print '<h2>DOM</h2>';
  17.   $books = $dom->childNodes;
  18.   print '<table border="1">';
  19.   foreach ($books as $book) {
  20.      if (@$book->nodeName == 'book') {
  21.       $content = $book->childNodes;
  22.       foreach ($content as $elem) {
  23.          if (@$elem->nodeName == 'author') {
  24.           $author = $elem->nodeValue;
  25.          }
  26.          if (@$elem->nodeName == 'title') {
  27.           $title = $elem->nodeValue;
  28.          }
  29.       }
  30.       print "<tr><td>$title</td><td>$author</td></tr>";
  31.      }
  32.   }
  33.   print "</table>";




[ThinkIT] Part5:PHP5のXMLサポート(1) (1/2)

と、SimpleXML は素晴らしいのですが、残念ながら PHP4 では使えません。そこで簡易的に XML を使えるライブラリを探しました。
これ↓
Keith Devens .com - PHP XML Library

使い方は非常に簡単です。

  1.  <?php
  2.  $xml = file_get_contents("xml_hoge.xml");
  3.  $data = XML_unserialize($xml);




$data は配列になっているので階層を辿っていけば目的のデータを取得できます。

このエントリーを含むはてなブックマーク | 

PEAR::DB 今さら

  1.  <?php
  2.   $con =& DB::connect($dsn, array('persistent' => true));


persistentオプションをコネクト時に渡すと永続的な接続になります。
例えば、MySQLだとmysql_pconnect関数が呼ばれるようになる、と。

  1.  <?php
  2.   $connect_function = $persistent ? 'mysql_pconnect' : 'mysql_connect';


とはいえ、何でもpersistentにすればよいのかというとそうではありませんので注意。

PHP: 持続的データベース接続 - Manual

このエントリーを含むはてなブックマーク | 

PEAR::Logメモ

ロギングクラスです。ファイルだけでなく、メールやら DB にも出力できる素敵なライブラリです。

■ 前提
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

■ 使ってみる
とりあえずファイルにログを出力してみます。

  1.  <?php
  2.  $conf = array('timeFormat' => '%x %X');
  3.  $log = Log::singleton('file', 'C:\temp\app.log', 'test', $conf, PEAR_LOG_INFO);
  4.  $log->log(__METHOD__ . '開始', PEAR_LOG_INFO);


こんな感じ。


■ ログレベル
ログレベルの指定は8段階あり、クリティカルな順に

  1. PEAR_LOG_EMERG
  2. PEAR_LOG_ALERT
  3. PEAR_LOG_CRIT
  4. PEAR_LOG_ERR
  5. PEAR_LOG_WARNING
  6. PEAR_LOG_NOTICE
  7. PEAR_LOG_INFO
  8. PEAR_LOG_DEBUG


オブジェクト取得時に指定した以上のレベルのログが出力されます。つまり、

  1.  <?php
  2.  $log = Log::singleton('file', 'C:\temp\app.log', 'test', $conf, PEAR_LOG_INFO);
  3.  
  4.  $log->log(__METHOD__ . '開始', PEAR_LOG_INFO); // 出力される
  5.  $log->log(__METHOD__ . '開始', PEAR_LOG_ERR); // 出力される
  6.  
  7.  $log->log(__METHOD__ . '開始', PEAR_LOG_DEBUG); // 出力されない
  8.  $log->debug(__METHOD__ . '開始'); // 出力されない(上と同じ意味)



ってことです。最後のエラーレベル名の関数はすべてのエラーレベルについてそれぞれ用意されています。ちなみに実装はエイリアス。

  1.  <?php
  2.  function debug($message)
  3.  {
  4.   return $this->log($message, PEAR_LOG_DEBUG);
  5.  }


てことは log 関数を使った方が早いかもね、どうなのよ?(マロン風

このエントリーを含むはてなブックマーク | 
Copyright © 2008 hydra404 all rights reserved.