Home > アーカイブ > 2007-10

2007-10

CakePHPガイドブック登場

この記事の所要時間: 032

先日ご案内したCakePHP本がいよいよ登場します。タイトルは「CakePHPガイドブック」です。

ベタな名前ですが、あえて奇をてらわず、定番となる本になって欲しい!という執筆陣の思いが詰まっています。またカバーもシンプルなデザインになっているのでオフィスに置いて頂いても違和感無いかと思います。

10月末頃には書店に並ぶそうです。見かけたら一度手に取って頂ければ嬉しいです。

# 私自身も初めての書籍なのでとても楽しみです。;-)

出版元のマイコミさんのサイト [MYCOM BOOKS – CakePHPガイドブック]

PHPソースからドキュメントを生成するツール

この記事の所要時間: 524

PHPソースからドキュメントを生成する主要な3ツールを試してみました。どのツールもそれほど深くは調べていないのでインストール+アルファ程度の設定変更で試しています。

環境はCentOS4.4+PHP5.2.3です。

phpDocumentor

PHPでできたツールです。pearコマンドでインストールできることもあって、PHPのドキュメントジェネレータとして人気があります。

  • インストール

pearコマンドでインストールできます。

$ pear install --alldeps phpdocumentor
  • ドキュメント生成

phpdocコマンドで生成します。とりあえずドキュメントを生成するだけなら設定ファイルの変更は不要です。

./src 以下のPHPファイルを対象に ./doc 以下にドキュメントを生成
$ phpdoc -t ./doc -d ./src 

[参考サイト]

Doxygen

C++でできたツールです。DoxygenはC/C++、Javaをはじめ様々な言語についてドキュメントを生成することができます。どちらかと言うと、C/C++、Java、Pythonがメインのツールですが、PHPでも十分なドキュメントを生成することができます。

  • インストール

CentOS4用はRPMがあるのでyumコマンドでインストールできます。

$ sudo yum install Doxygen

ただRPMは1.3.9ですので、最新版(1.5.3)がよければソースからインストールします。

$ tar zxvf doxygen-1.5.3.src.tar.gz
$ cd doxygen-1.5.3
$ ./configure
$ make
$ sudo make install
  • ドキュメント生成

まず設定ファイルを生成します。-gで生成する設定ファイルのファイル名を指定します。ファイル名を指定しなければDoxyfileという設定ファイルがカレントディレクトリに生成されます。

$ doxygen -g [config]

次に設定ファイルを編集します。下記は最低限変更した方が良いと思う項目です。

$ vi Doxyfile
# ドキュメント出力ディレクトリ(省略すればカレントディレクトリに出力)
# => doc ディレクトリに出力
#OUTPUT_DIRECTORY =
OUTPUT_DIRECTORY = doc

# ソースディレクトリ(省略すればカレントディレクトリ)
# => src ディレクトリ以下のファイルを解析
#INPUT =
INPUT = src

# 再帰的にソースディレクトリを解析する
# => 再帰する(YESにしないとINPUTで指定したディレクトリのみ解析する)
#RECURSIVE = NO
RECURSIVE = YES

# ソースコードページを生成する
# => ソースコードページを生成
#SOURCE_BROWSER = NO
SOURCE_BROWSER = YES

# ソースコードページにてコメントを削除する
# => ソースコードページにコメント出力
#STRIP_CODE_COMMENTS = YES
STRIP_CODE_COMMENTS = NO

ドキュメント生成コマンドを実行するとドキュメントが生成されます。

$ doxygen Doxyfile

[参考サイト]

PHPXRef

Perlでできたツールです。phpDocumentorやDoxygenとは少し毛色が異なり、クラス図などは表示されません。上記2ツールはクラス構造などをドキュメント化しますが、PHPXRefはソースコード自体をドキュメント化するのを目的としています。

  • インストール

PHPXref – The PHP Cross Referencing Documentation Utilityから最新版ソース(0.7)をダウンロードして展開するだけでokです。

$ tar zxvf phpxref-0.7.tar.gz
$ cd phpxref-0.7
  • ドキュメント生成

設定ファイルを編集します。展開したディレクトリ内にあるphpxref.cfgが設定ファイルになります。

$ vi phpxref.cfg
# ソースディレクトリ(省略すればカレントディレクトリ)
SOURCE=src

# ドキュメント出力ディレクトリ(省略すればカレントディレクトリに出力)
OUTPUT=doc

ドキュメント生成コマンドを実行するとドキュメントが生成されます。

$ ./phpxref.pl

[参考サイト]

出力サンプル

CakePHP1.1.17.5612のソースを各ツールで出力してみました。

クラス構造を確認するならDoxygenが、ファイル構造を確認するならPHPXRefが良さそうです。ただDoxygenにはクセがあるようで、PEARパッケージのようにファイル名とクラス名が異なる場合は上手く生成ができませんでした。(良い方法があればどなたかヘルプを・・・;-))

モバイル向けGoogle AdSenseをPHPで使う

この記事の所要時間: 436

Google AdSenseにモバイル版が登場しました。

通常のAdSenseではJavaScriptを使って広告を表示するのですが、携帯ではJavaScriptが使えないので、PHPやPerlなどサーバ側で実行する言語で記述します。AdSenceサイトではPHP/Perl/JSP/ASPのコードが用意されており、モバイル向けAdSense設定を行うとそれぞれのコードが表示されます。

PHP用コードを確認したところ、コードの流れは単純で、AdSense IDや広告フォーマット、HTTPリクエスト(HTTP_USER_AGENT等)などを専用変数に設定して、最後にリモートにあるPHPコードをrequire()しているだけです。

コードを見て気になる点があったのでメモしておきます。

$_SERVERにキーが無いことを想定していない

$_SERVER[‘HTTPS’]や$_SERVER[‘HTTP_REFERER’]など値が存在しない可能性があるものをそのまま参照しています。これらの値が存在しない場合は「Notice: Undefined index」が発生します。

[対応策]

isset()やempty()で連想配列にキーが存在するかどうかを確認します。単純に回避するなら[@]をつけてエラーメッセージの出力を抑制する方法もあります。

require()でリモートスクリプトをインクルード

PHP5.2.3でコードを実行したところ、以下のメッセージが表示されました。

Warning: require() [function.require]: URL file-access is disabled in the server configuration in /home/www/xxxx/ad.php on line 17

これはallow_url_includeディレクティブがoffになっているために発生します。allow_url_includeはPHP5.2.0からは追加されたもので、これがoffになっているとリモートにあるスクリプトをinclude()やrequire()でインクルードすることができません。

allow_url_includeはデフォルトはoffとなっているので、そのままだとこのコードは動作しません。

対応策としては3通りの方法があります。

[対応策1] allow_url_includeをonにする

allow_url_includeをonにすればこのコードは動作します。しかしこのディレクティブはセキュリティリスク(RFI等)を回避するためにoffにされているものなので、できればこの方法は取らない方が良いです。

またallow_url_includeはphp.iniやhttpd.confでのみ設定が可能なので、共用サーバなどでは設定が変更できないかもしれません。

[対応策2] file_get_contents()でリモートスクリプトを読む

file_get_contents()でリモートスクリプトを読み込む方法です。file_get_contents()は単にファイルを読み込んでその内容を返すだけなので、allow_url_includeの影響は受けません。

あとは読み込んだスクリプトをeval()で実行しようと思いました。が、eval()でエラーが発生しました。「<&php」「&>」が引っかかっているようです。対応しても良いのですが、これはこのまま放置。

[対応策3] リモートスクリプトをローカルに置く

require()で読み込んでいるスクリプトをローカルに置いてしまいます。そしてrequire()でローカルのファイルをインクルードするようにします。こうすればallow_url_includeの設定に関わらずスクリプトを実行できます。

ちなみにリモートスクリプトは以下のようになっています。

<?php

/**
 * Copyright (C) 2007 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     @license http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

$google_dt = time();

function google_append_url(&$url, $param, $value) {
  $url .= "&" . $param . "=" . urlencode($value);
}

function google_append_globals(&$url, $param) {
  google_append_url($url, $param, $GLOBALS&#91;"google"&#93;&#91;$param&#93;);
}

function google_append_color(&$url, $param) {
  global $google_dt;

  $color_array = split(",", $GLOBALS&#91;"google"&#93;&#91;$param&#93;);
  google_append_url($url, $param,
                    $color_array&#91;$google_dt % sizeof($color_array)&#93;);
}

function google_get_ad_url() {
  $google_ad_url = "http://pagead2.googlesyndication.com/pagead/ads?";
  $google_scheme = ($GLOBALS&#91;"google"&#93;&#91;"https"&#93; == "on")
      ? "https://" : "http://";
  foreach ($GLOBALS&#91;"google"&#93; as $param => $value) {
    if ($param == "client") {
      google_append_url($google_ad_url, $param,
                        "ca-mb-" . $GLOBALS["google"][$param]);
    } else if (strpos($param, "color_") === 0) {
      google_append_color($google_ad_url, $param);
    } else if ((strpos($param, "host") === 0)
               || (strpos($param, "url") === 0)) {
      google_append_url($google_ad_url, $param,
                        $google_scheme . $GLOBALS["google"][$param]);
    } else {
      google_append_globals($google_ad_url, $param);
    }
  }
  google_append_url($google_ad_url, "dt", 
          round(1000 * array_sum(explode(" ", microtime()))));

  return $google_ad_url;
}

$google_ad_handle = fopen(google_get_ad_url(), "r");
if ($google_ad_handle) {
  while (!feof($google_ad_handle)) {
    echo fread($google_ad_handle, 8192);
  }
  fclose($google_ad_handle);
}

?>

[おまけ] require()よりinclude()

require()は読込に失敗した場合、Fatal errorが発生してスクリプトの実行が止まってしまいます。一方include()は読込ができなくてもWarningが出るのみです。広告は最悪表示されなくとも問題無いので、include()(もしくは@include())を使った方がより良いでしょう。

allow_url_fopenをonにしておく

最後に大事なこと。どのような対策を取るにせよallow_url_fopenはonである必要があります。これはリモートスクリプト自体がfopen()でリモートファイルを読みに行っているためです。またallow_url_includeをonにしたところでallow_url_fopenがoffだとリモートファイルのインクルードは動作しません。

allow_url_fopenはデフォルトではonになっているので問題無いかと思いますが、上手く動作しない場合はご確認を。

まとめ

モバイル向けGoogle AdSenseのPHPでの使用法について見てきました。各言語用にコードが用意されているのは素晴らしいことなのですが、つまづきそうな点が幾つかあるので注意が必要です。

あとデザインですが、シングル広告でもかなり画面幅を取ります。もう少し控えめなパターンがあると嬉しいです。

Home > アーカイブ > 2007-10

検索
フィード
メタ情報

Return to page top