2008/4/22 火曜日

Date_Holidays_Driver_Japaneseを使ってみるとか2

Filed under: 技術メモ — dev0000 @ 12:17:02 このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをBuzzurl(バザール)に追加

PEAR::Date_Holidays_Driver_Japanese直してみた

早速使ってみたよ!

で気付いたところを折角なので。。。

PHP:
  1. <?php
  2. ini_set('display_errors', 'On');
  3. ini_set('memory_limit', -1);
  4. require_once('Date/Holidays.php');
  5.  
  6. $obj =& Date_Holidays::factory('Japanese',2008);
  7. $sec = time();
  8. for ($i=0;$i<365;$i++) {
  9.         $t = mktime(0,0,0,1,$i+1,2008);
  10.         $date = date('Y-m-d', $t);
  11.         if ($obj->isHoliday($date)) {
  12.         //      echo " holiday\n";
  13.         }
  14.         if ($i % 10 == 0) {
  15.                 echo "[{$date}][" . memory_get_usage() / (1024*1024) . "M]";
  16.                 echo "[" . (time() - $sec ) . "s]\n";
  17.                 $sec = time();
  18.         }
  19. }

実行してみた。

$ php -q d.php
[2008-01-01][1.5150375366211M][0s]
[2008-01-11][1.6816329956055M][0s]
[2008-01-21][2.049934387207M][0s]
[2008-01-31][2.6353912353516M][1s]
[2008-02-10][3.4495162963867M][0s]
[2008-02-20][4.4876708984375M][1s]
[2008-03-01][5.7306900024414M][2s]
[2008-03-11][7.2339935302734M][3s]
[2008-03-21][8.9179916381836M][5s]
[2008-03-31][10.822479248047M][8s]
[2008-04-10][13.009956359863M][11s]
[2008-04-20][15.355422973633M][17s]

# 怖くなったので、このへんで Ctrl+C


うーん。なんかメモリをどんどん消費していくような。

でそもそもの Date/Holidays/Driver.php だけど、

PHP:
  1. function isHoliday($date, $filter = null)
  2.     {
  3.         if (! is_a($date, 'Date')) {
  4.             $date = $this->_convertDate($date);
  5.             if (Date_Holidays::isError($date)) {
  6.                 return $date;
  7.             }
  8.         }
  9.  
  10.         //rebuild internal array of holidays if required.
  11.         $compare_year = $date->getYear();
  12.         $this_year = $this->getYear();
  13.         if ($this_year !== $compare_year) {
  14.             $this->setYear($compare_year);
  15.         }
  16.  
  17.         if (is_null($filter)) {
  18.             $filter = new Date_Holidays_Filter_Blacklist(array());
  19.         } elseif (is_array($filter)) {
  20.             $filter = new Date_Holidays_Filter_Whitelist($filter);
  21.         }
  22.  
  23.         foreach (array_keys($this->_dates) as $internalName) {
  24.             if ($filter->accept($internalName)) {
  25.                 if (Date_Holidays_Driver::dateSloppyCompare($date,
  26.                                           $this->_dates[$internalName]) != 0) {
  27.                     continue;
  28.                 }
  29.                 $this->setYear($this_year);
  30.                 return true;
  31.             }
  32.         }
  33.         $this->setYear($this_year);
  34.         return false;
  35.     }
  36.  
  37.     function setYear($year)
  38.     {
  39.         $this->_year = $year;
  40.         return $this->_buildHolidays();
  41.     }

毎回、setYear => _buildHolidays を呼び出しているのがガンかな。。。

どうしたもんだかという感じですが、とりあえず、
$obj = & Date_Holidays::factory('Japanese',2008);
で生成された $obj を static とかで使いまわさずに毎回呼び出せばメモリも増えないのでそれで対応。

ってか、そもそも最近対応したバグ修正から派生してるっぽいから、まだ気付いてないのかな。
Bug #13395 isHoliday resets interal year storage

HTML convert time: 0.517 sec. Powered by WordPress ME