Home > PHP

PHP Archive

2038年問題

  • 2007-02-12 (月)
  • PHP
この記事の所要時間: 039

32ビットPCでは数値を扱う限界があります。

PHPで日付を扱う事が多いと思いますが、UNIXタイムスタンプを利用すると数値 の限界に引っかかる事を知っておく必要があります。

【PHP TIPS】 8. 2038年問題:ITpro

エントリではPEAR::Dateが紹介されていますが、ここでは別の方法を。

5.2.0以降になりますが、組み込みクラスのDateTimeクラスならこの問題に対応しています。

<?php
$date = new DateTime('2038-1-19 12:14:07');
echo $date->format('Y/m/d H:i:s') . PHP_EOL;
$date->modify("+1 day");
echo $date->format('Y/m/d H:i:s') . PHP_EOL;
$date->setDate(3000,12,31);
echo $date->format('Y/m/d H:i:s') . PHP_EOL;
?>
$ php 2038.php
2038/01/19 12:14:07
2038/01/20 12:14:07
3000/12/31 12:14:07

PHP5.2.1 str_ireplaceでzend_mm_heap corruptedが発生する

  • 2007-02-12 (月)
  • PHP
この記事の所要時間: 025

PHP5.2.1でstr_ireplaceを使用するとzend_mm_heap corruptedが発生して処理が止まってしまう不具合があるようです。

<?php
$Data = "Change tracking and management software designed to watch for abnormal system behavior.\nSuggest features, report bugs, or ask questions here."; $Data = str_ireplace("\r\n", "<br>", $Data); $Data = str_ireplace("\n", "<br>", $Data);
$Data = str_ireplace("\r\n", "<br>", $Data);
$Data = str_ireplace("\n", "<br>", $Data);
$Data = str_ireplace("\r\n", "<br>", $Data);
$Data = str_ireplace("\n", "<br>", $Data);
$Data = str_ireplace("\r\n", "<br>", $Data);
$Data = str_ireplace("\n", "<br>", $Data);
$Data = str_ireplace("\r\n", "<br>", $Data);
$Data = str_ireplace("\n", "<br>", $Data);
$Data = str_ireplace("\r\n", "<br>", $Data);
$Data = str_ireplace("\n", "<br>", $Data);
$Data = str_ireplace("\r\n", "<br>", $Data);
$Data = str_ireplace("\n", "<br>", $Data);
?>

php.internals: PHP 5.2.1 crashing Apache/IIS…

私の環境でも再現することができました。

修正パッチがありますのでstr_ireplaceを使用される方は適用されると良いでしょう。

PHP5.2.1リリース

  • 2007-02-12 (月)
  • PHP
この記事の所要時間: 10

PHP5.2.1がリリースされています。

The PHP development team would like to announce the immediate availability of PHP 5.2.1. This release is a major stability and security enhancement of the 5.X branch, and all users are strongly encouraged to upgrade to it as soon as possible.

PHP: PHP 5.2.1 Release Announcement

PHP5ユーザの方はアップグレードを。

本リリースでは–enable-memory-limit無しでもmemory_limitが有効になっています。

デフォルトではmemory_limit=128Mが設定されるのであまり問題になるシーンは無いと思いますが、メモリを食う処理をしている箇所にはご注意下さい。(ちなみにmemory_limit=-1にすればメモリ制限は行われません)

if: / endif;が使えなくなる?

  • 2007-02-07 (水)
  • PHP
この記事の所要時間: 112

php.internals: Removing if: endif; syntaxでif: / endif;構文を削除しようとする提案が出ています。

ビューテンプレート等でHTML内にPHPコードを埋める時に使っている例を見るので無くなると困る人はいると思います。(私は困ります。)

これがあるとforeachとifとの組み合わせで入れ子になった時などブロックの対応が分かりやすくて良いです。

あと単純にif: / endif;の方が違和感無いように感じるのですがどうでしょう。

・if(){}

<table>
<?php foreach ($list as $v) { ?>
  <tr>
    <td>
     <?php if ($v) { ?> 
       hoge
     <?php } else { ?> 
       foo
     <?php } ?> 
   </td>
  </tr>
<?php } ?>
</table>

・if: / endif;

<table>
<?php foreach ($list as $v): ?>
  <tr>
    <td>
     <?php if ($v): ?> 
       hoge
     <?php else: ?> 
       foo
     <?php endif; ?> 
   </td>
  </tr>
<?php endforeach; ?>
</table>

この例だときちんとインデントしているのでまだ{}でも良いのですが、デザイナさんがツールで編集するとインデントが崩れていたりして結構すごい事になってたりします。。。

冒頭のhttp://news.php.net/php.internals/では早速反対意見が出ているようですし、無くならないとは思いますが。

CakePHP1.1.13.4450&1.2.0.4451alphaリリース

この記事の所要時間: 026

CakePHP1.1.13.4450&1.2.0.4451alphaがリリースされています。

1.1.13.4450はバグフィックスリリース、1.2.0.4451alphaは1.2系のアルファ版となっています。

双方ともに多くの変更・修正が行われており、CakePHP Sessonコンポーネントに任意のコードが実行できる脆弱性 | Shin x blogも修正されています。

1.2の正式リリースが一歩一歩近づいてきましたね。

CakePHP Sessonコンポーネントに任意のコードが実行できる脆弱性

この記事の所要時間: 19

Sessionコンポーネントですが値を保存するキーに特定の値を仕込むと任意のコードが実行できる脆弱性があります。

この問題は1.1/1.2どちらにも存在します。

Sessionコンポーネントの親クラスであるCakeSessionクラス[cake/libs/session.php]では、セッション関連の処理にeval()を使用しています。このeval()に渡すPHPコード(evalで実行されるコード)を生成する過程で、セッションキーを使用するのですが、変数のチェックが不十分なため、任意の処理を書くことができてしまいます。

通常セッションのキーにGET/POST/COOKIEといった外部からの値は使用しないと思うのであまり影響は無いかもしれませんが、もしセッションキーにこれらの値を使用している場合は値のチェックを厳密に行う必要がありますのでご注意を。

念のためtikcet投げておいたのでいずれ修正されるかと思います。
早速パッチを適用してもらいました。openだったのは正味20分くらいでした。(早!)
Thanks phpnut!!

[.]区切りのセッションキーを配列にして使うためにeval()を使っているのですが、これはわざわざeval()を使う必要があるのでしょうか。安全性を考えるとこういった関数は極力使わない方が吉かと。

PHPテクニカルセミナーin東京に参加してきました

この記事の所要時間: 117

PHPテクニカルセミナーin東京に参加してきました。

関西在住なので平日+東京でのセミナーは普段なら参加しないのですが、Do You PHP?shimookaさんが参加されるという事だったので思い切って申し込みしました。

セミナーはフレームワークについての内容でとても興味深いお話が聞けました。Webで読むだけでなく実際にお話を聞くと理解度が格段に違います。これだけで十分来た甲斐がありました。

さらにその後の懇親会が楽しすぎました。

正直こういった場はあまり得意ではないのですが、立食形式が良かったのか、参加者の方々が良かったのか、風邪+薬で頭がボーとしてたのが良かったか;-)、この日はとても楽しく色々な方とお話ができました。

目的のshimookaさんは私がイメージしていたままでとても紳士な方でした。技術の話題から家庭の話題まで少しの時間ですがお話しできてとても楽しかったです。

あとhaltさんに「blog見てます」と声をかけてもらったのも嬉しかったです。声をかけることはあってもかけられた事は無いもので。(実はその場ではhaltさんだと分かっていなかったのですが、翌日blogのコメントで知りました。。。)

他にも色々な方々とお話したのですが、お名前を出して良いものやらと思い自粛します。。。

今回はホント東京まで行って良かったです。ありがとうございました。

# すっかり味を占めてしまったのでまた参加してみたいと思います。また相手してやってください。;-)

楽天API PEAR::Services_Rakuten-0.1.0リリース

  • 2007-01-18 (木)
  • PHP
この記事の所要時間: 1020

[2007/07/18追記] Services_Rakuten-0.2.0がリリースされています。今後はこちらをご利用下さい。

楽天から公式APIが公開されましたので、早速PEARパッケージを作ってみました。

PEAR::Services_Rakuten-0.1.0

$ pear install --alldeps /blog/download/Services_Rakuten-0.1.0.tgz

楽天APIを使用するにあたってデベロッパーIDが必要ですので【楽天ウェブサービス】RAKUTEN WEBSERVICEで取得しておきましょう。

使い方は以下です。検索サービスごとにメソッドを分けています。do~()で値を連想配列で返します。

<?php
require_once('Services/Rakuten.php');
$api = new Services_Rakuten('your_developer_id');

// 商品検索: キーワード か ジャンルID が必須
//              その他のパラメータは連想配列で指定可能
$api->doItemSearch('福袋', 101164, array('sort' => '+itemPrice'));
var_dump($api->getLastUrl());
var_dump($api->getResultData());
/*
$api->doItemSearch('福袋');
var_dump($api->getLastUrl());
var_dump($api->getResultData());
*/
/*
$api->doItemSearch(null, 101164);
var_dump($api->getLastUrl());
var_dump($api->getResultData());
*/

// ジャンル検索: ジャンルID が必須(0:ルート)
//                  その他のパラメータは連想配列で指定可能
/*
$api->doGenreSearch(0);
var_dump($api->getLastUrl());
var_dump($api->getResultData());
*/

// 商品コード検索: 商品コードが必須
//                    その他のパラメータは連想配列で指定可能
/*
$api->doItemCodeSearch('aaa:1234567');
var_dump($api->getLastUrl());
var_dump($api->getResultData());
*/

// 書籍検索: キーワード か ジャンルID が必須
//              その他のパラメータは連想配列で指定可能
/*
$api->doBookSearch('数学');
var_dump($api->getLastUrl());
var_dump($api->getResultData());
*/
/*
$api->doBookSearch(null, 208663);
var_dump($api->getLastUrl());
var_dump($api->getResultData());
*/
/*
$api->doBookSearch('数学', 208663);
var_dump($api->getLastUrl());
var_dump($api->getResultData());
*/
?>

返ってくる値はこんな感じです。

array(8) {
  ["count"]=>
  string(5) "19743"
  ["page"]=>
  string(1) "1"
  ["first"]=>
  string(1) "1"
  ["last"]=>
  string(2) "1"
  ["hits"]=>
  string(2) "1"
  ["carrier"]=>
  string(1) "0"
  ["pageCount"]=>
  string(3) "100"
  ["Items"]=>
  array(1) {
    ["Item"]=>
    array(30) {
      [0]=>
      array(22) {
        ["itemName"]=>
        string(128) "【受賞記念★送料無料】本当に有難う!感涙の超!増量詰め過ぎスイーツ福袋![直送](冷凍)"
        ["itemCode"]=>
        string(10) "ocs:743812"
        ["itemPrice"]=>
        string(4) "2980"
        ["itemCaption"]=>
        string(8171) "ロイヤルミルクティープリン卵をたっぷり使ったカスタードプリンをベースに、煮出した紅茶をふんだんに混ぜて作りました。よく紅茶を題材にした洋菓子を作る場合アッサムティを使うことが多いんですが、今回はあえてフレーバーのあるアールグレイの紅茶を使用。牛乳と生クリームをふんだんに使ったコクの高いリッチミルクティに仕上がってます。んんんん?。感心するほどしっかりとした素材選び、、、基本かもしれませんが、ホント、イイ仕事してます♪アールグレイの茶葉を細かくカットしてプリンに入れるという細かな作業をして、今回もしっかりあの「魔法の生クリーム」トッピング!スプーンで一緒にすくってお口に入れると、、、ふんわか滑らかなプリンの舌触りに、鼻から抜ける紅茶の柔らかな香り、そして生クリームの絶妙なコクがベストマッチ!ほっこりする味わいのミルクティプリンはおまけなんて言うのはもったいないくらいの逸品ですぞ!   止まらない「大満足」の声、声、声!!ちょっと照れくさくなっちゃうくらいの評価を沢山いただいています!その一部をご紹介。購入者の方の意見ですからうれしい限りです!有難うございます! 今までにない、チーズケーキでとても美味しくいただきました。早速、友人にも試食してもらい、好評でした。 ホントに美味しかった!!特にクリーム類が!シュークリームがもうちょっと食べたかったけど全部込みでこのお値段ならしょうがないかな。また購入しよっと 生クリームがかなり美味!!ふわとろ?! 冷凍で届きすぐに食べなくて済むのでとても便利!会社に持って行き皆で食べました。大好評でした。待ちに待ったスイーツとってもおいしかったです☆どれもおいしく頂きました。本日届いて残りがロールケーキとシュークリーム2個。甘いお菓子の食べ過ぎに・・・。でもおいしくてつい頂いてしまいました生チーズケーキ、こんなに美味しいスイーツがあったなんて・・・。と思うほど美味しいです。夫も絶賛でした!どれを食べても美味しかったです!対応もとてもよかったし、是非また利用したいです。少しずついろんな種類が入っていた事、その全てが美味しくてとても満足しました。どれもこれもとっても美味しかったです。生クリームもさっぱり目でとても食べやすくあっという間に食べてしまいました。また機会があればぜひ注文したいお品ばかりでした。送料無料でお得♪生ケーキは絶品で子供も濃厚で美味しいかったと言ってました。また機会があればよろしくお願いしますね。チーズケーキ最高においしかったです。一人で全部イケチャウ感じでした。美味しかったです。生クリームがタップリなんですけど全然しつこくないし、家族と2人でペロっとたいらげちゃいました。お気に入りはパイシューです!!また送料込みでお得なセットを作ってください。おいしくて、友人に配ってしまいました!連絡を頂いていた日にちに無事に受け取りました。チーズケーキ、チョコレートケーキ、ロールケーキ、パイシュー・・すべて美味しかったです。送料無料の上、価格も破格でとってもお得でした。また美味しい企画を楽しみにしています。ありがとうございました。インターネットのお取り寄せで今までで一番おいしい。大満足。美味しいチーズをたっぷり味わえるケーキでした。コクがあるのに、ふわふわ感もあって、商品紹介のとおりの美味しさでした。チーズ大好きのお友達にもお分けしてとても喜ばれました。大好きなパイシュー、さくっとして、ふわっとして、ほんのりとバターの香りがして、大、大、大好きな甘すぎない生クリームがたっぷりと入っていてとろけるーって感じ。対応も迅速で、梱包もとても丁寧でありがとうございます。ケーキ類が、苦手な主人も、美味しそうに食べていました。本当に、しっとりしていて、あー、生チーズケーキはこうでなくっちゃと思いました。対応も迅速で、梱包もとても丁寧でした。有難うございました。お菓子は冷凍でもおいしくいただけるんだなぁと感心しました。福袋大当たりでした 美味しかったです また企画してねチーズケーキ とっても美味しかったです。子供がうっとりしながら食べてました^^チョコ命(チーズはダメ)の下の子もいるのでセットでとてもよかったです^^知り合いの方に送ったのですが、とても喜んでもらえました。おいしくて、あっという間に食べてしまったそうです。生クリームがすご?くおいしかったです。パイもサクサクで、シュークリームがお気に入りです。チョコレートケーキは、友達にプレゼントしましたら泣きそうなくらい喜んでました(^0^)評判通りのおいしさで非常に満足しております。また食べたいですね♪この福袋、ほんといろいろ入っていて満足です。家族も喜んでいました。また機会があれば購入したいと思います。今回で3回目の購入。はっきり言って中毒に近いです(笑美味しい!の一言です。冷凍便なのにこのボリュームで送料無料は嬉しい。今届いたチーズケーキを食べたながら再注文したところです。これは凄いセットですね!福袋サイコー┗(>Д<)┛    ◆ご注文に際して◆商品内容≫(1)生チーズケーキ2本(サイズ:長さ約17.5cm、横幅約6cm、高さ約4cm)、(2)生チョコケーキ1本(サイズ:長さ約17.5cm、横幅約6cm、高さ約4cm)(3)パイシュー5個(1個約45g)※5個で一袋になっております(4)生ロールハーフサイズ1本(幅約8cm×長さ約9cm)(5)ロイヤルミルクティープリン1個(直径約6.5cm×高さ約6cm 約135g)原材料≫生チーズケーキ/チーズ、砂糖、小麦粉、卵、生クリーム、サワークリーム生チョコケーキ/チョコレート、小麦粉、砂糖、バター、卵、はちみつ、生クリーム、洋酒パイシュー/卵黄、小麦粉、十勝産牛乳、十勝産生クリーム、グラニュー糖、無塩バター、グリシン生ロール(ハーフ)/卵、小麦粉、十勝産生クリーム、グラニュー糖、バター、ココアロイヤルミルクティープリン/牛乳、グラニュー糖、生クリーム、卵黄、水、アールグレイ茶葉、寒天、澱粉賞味期限≫冷凍で約1ケ月・解凍後冷蔵保存にて2日出荷場所≫製造元(大阪)より直送ご注意≫他の商品と一緒のご注文はご遠慮ください。一緒にご注文の場合は別送となり、送料が別途かかりますのでご注意ください《コンビニ決済(後払い)のお客様》他の商品とご一緒にご注文の場合、最初の出荷時に全額の振込用紙を同梱(または郵送)致します。期限内に全額お支払いください。《代引決済のお客様》他の商品とご一緒にご注文の場合、最初の配送時に全額を配達員にお渡しください。配送形態≫冷凍便出荷日≫「出荷日」の欄をご確認ください。商品のお届けは「出荷日」の翌日または翌々日となります。"
        ["itemUrl"]=>
        string(50) "http://www.rakuten.co.jp/ocs/535471/708704/#743812"
        ["affiliateUrl"]=>
        string(103) "http://hb.afl.rakuten.co.jp/hgc//?pc=http%3A%2F%2Fwww.rakuten.co.jp%2Focs%2F535471%2F708704%2F%23743812"
        ["smallImageUrl"]=>
        string(79) "http://image.rakuten.co.jp/wshop/data/ws-mall-img/ocs/img64/img10113976081.jpeg"
        ["mediumImageUrl"]=>
        string(80) "http://image.rakuten.co.jp/wshop/data/ws-mall-img/ocs/img128/img10113976081.jpeg"
        ["availability"]=>
        string(1) "1"
        ["taxFlag"]=>
        string(1) "0"
        ["postageFlag"]=>
        string(1) "0"
        ["creditCardFlag"]=>
        string(1) "1"
        ["shopOfTheYearFlag"]=>
        string(1) "0"
        ["affiliateRate"]=>
        string(3) "1.0"
        ["startTime"]=>
        string(0) ""
        ["endTime"]=>
        string(0) ""
        ["reviewCount"]=>
        string(4) "3054"
        ["reviewAverage"]=>
        string(4) "4.44"
        ["shopName"]=>
        string(39) "オーガニックサイバーストア"
        ["shopCode"]=>
        string(3) "ocs"
        ["shopUrl"]=>
        string(29) "http://www.rakuten.co.jp/ocs/"
        ["genreId"]=>
        string(6) "200157"
      }
    }
  }
}

PEARパッケージ作成は過去と他人はかえられないが、未来と自分はかえられる – PEARパッケージを作成、手軽に管理するのツールを使いました。面倒なPEAR作成がかなり楽できます。すばらしいです。;-)

CakePHP phpinfo()風に設定を表示-CakeInfo-

この記事の所要時間: 138

CakePHPアプリケーションの設定内容をphpinfo()風に表示するスクリプト[CakeInfo]を作ってみました。

CakeInfo-0.1.0
対応バージョン:1.1.11.4064以降

Cheesecake Photoblogを表示するとこんな感じです。

現在表示される内容は以下です。

  • PHP
    アプリケーションを実行しているPHP情報
  • Core
    [app/webroot/index.php][app/config/core.php]で設定されていているフレームワーク定数
  • Path
    Configureオブジェクトが持つ各パス情報
  • Database(デフォルトは非表示)
    [app/webroot/database.php]で設定されていているDB接続情報
  • Controller
    アプリケーション内のコントローラ情報。Controllerクラスとの差分を表示。
  • Model
    アプリケーション内のモデル情報。Modelクラスとの差分を表示。

設置

設置方法は簡単です。
まずこちらのzipファイルを解凍します。
あとは解凍した[cakeinfo.php][logo-mini.gif]を[app/webroot/]に設置するだけです。

設定

現在のところ設定項目は[DATABASE_CONFIG_FLAG]一つだけです。

  • DATABASE_CONFIG_FLAG
    この定数が設定されていればDatabase項目が表示されます。(デフォルトはコメントアウト)

Cakeを使った事例も増えているようですし、特に大きなサイトではアプリケーション全体を俯瞰できるものがあれば便利だと思います。設置も簡単ですのでお試し頂ければ嬉しいです。

いずれは表示だけでなくてWeb上からアプリケーションを構築できるような仕組みにできれば面白いですね。;-)

ネストした関数

  • 2007-01-11 (木)
  • PHP
この記事の所要時間: 17

PHPで関数をネストして定義できるんですね。知りませんでした。

<?php
function func() {
  function inner_func() {
    echo 'inner_func' . PHP_EOL;
  }

  inner_func();
  echo 'func' . PHP_EOL;
}

func();

/* output
inner_func
func
*/
?>

メソッド内でもネストできます。

<?php
class Hoge {
  function method() {
    function inner_method() {
      echo 'inner_method' . PHP_EOL;
    }

    inner_method();
    echo 'method' . PHP_EOL;
  }
}

$obj = new Hoge;
$obj->method();

/* output
inner_method
method
*/
?>

無意味ですがこんな事もできます。

<?php
function func() {
  function inner_func() {
    function inner_inner_func() {
      function inner_inner_inner_func() {
        echo 'inner_inner_inner_func' . PHP_EOL;
      }
      inner_inner_inner_func();
      echo 'inner_inner_func' . PHP_EOL;
    }
    inner_inner_func();
    echo 'inner_func' . PHP_EOL;
  }

  inner_func();
  echo 'func' . PHP_EOL;
}

func();

/* output
inner_inner_inner_func
inner_inner_func
inner_func
func
*/
?>

注意点ですが、ネスト関数を呼び出す際はネスト関数の定義後でないとFatal errorが発生します。

function func() {
  inner_func(); // Fatal error
  function inner_func() {
  }
  inner_func(); // ok
}

さて関数(メソッド)内に定義されているネスト関数ですが、スコープはどうなっているのでしょうか。見た目からすると定義されている関数内でのみ使用可能なように見えるのですが、実は通常の関数と同じくグローバルスコープになっています。

<?php
class Hoge {
  function method() {
    function inner_method() {
      echo 'inner_method' . PHP_EOL;
    }

    inner_method();
    echo 'method' . PHP_EOL;
  }
}

$obj = new Hoge;
$obj->method();

inner_method(); // ここでも呼べる

/* output
inner_method
method
inner_method
*/
?>

ネスト関数を異なるクラスのメソッド内に定義しても名前空間は同じです。関数名がぶつからないようにする必要があります。(PHP4.3.0以降)

うーん、使いどころがあるような無いような。。。メソッド内で関数を動的に定義する時なんかは使えるかも。

参照:PHPマニュアル-関数

ホーム > PHP

検索
フィード
メタ情報

Return to page top