PHP & Webサービス 2007/10/11 14:52
モバイル向けGoogle AdSenseをPHPで使う
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.
-
*/
-
-
-
function google_append_url(&$url, $param, $value) {
-
}
-
-
function google_append_globals(&$url, $param) {
-
google_append_url($url, $param, $GLOBALS["google"][$param]);
-
}
-
-
function google_append_color(&$url, $param) {
-
global $google_dt;
-
-
google_append_url($url, $param,
-
}
-
-
function google_get_ad_url() {
-
$google_ad_url = "http://pagead2.googlesyndication.com/pagead/ads?";
-
$google_scheme = ($GLOBALS["google"]["https"] == "on")
-
? "https://" : "http://";
-
foreach ($GLOBALS["google"] as $param => $value) {
-
if ($param == "client") {
-
google_append_url($google_ad_url, $param,
-
"ca-mb-" . $GLOBALS["google"][$param]);
-
google_append_color($google_ad_url, $param);
-
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",
-
-
return $google_ad_url;
-
}
-
-
if ($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での使用法について見てきました。各言語用にコードが用意されているのは素晴らしいことなのですが、つまづきそうな点が幾つかあるので注意が必要です。
あとデザインですが、シングル広告でもかなり画面幅を取ります。もう少し控えめなパターンがあると嬉しいです。
■Related Posts
- 書籍名に年齢が入っている本を探す
- 携帯サイトに楽天ダイナミックアドを設置する
- 楽天API PEAR::Services_Rakuten-0.1.0リリース
- 楽天API PEAR::Services_Rakuten-0.2.0リリース
- 楽天オークション系対応-PEAR::Services_Rakuten-0.2.2リリース





on 13 10月 2008 at 10:45 1.ワードプレスでのモバイル(携帯)アドセンス導入(設定)方法 said …
[...] 上記のエラーを解決するにはどうすれば良いのか検索しまくり、一時は諦めそうになりましたが、何とか解決方法を見つけることができました。解決方法のヒントはこのページとこのページに書いてありました。 [...]
on 10 1月 2009 at 00:20 2.携帯版Google Adsenseのコードがいつのまにか変更になっている - ElectronicBrain is eating BreakFast said …
[...] モバイル向けGoogle AdSenseをPHPで使う | Shin x blog [...]
on 13 12月 2009 at 21:05 3.fajerwerki said …
I just want to tell you that your blog is very interesting, bookmarked