Home > PHP | Webサービス > モバイル向けGoogle AdSenseをPHPで使う

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

  • 2007-10-11 (木) 14:52
  • PHP | Webサービス
  • このエントリーをはてなブックマークに追加
この記事の所要時間: 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でコードを実行したところ、以下のメッセージが表示されました。

CODE:
  1. 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:
  1. <?php
  2.  
  3. /**
  4. * Copyright (C) 2007 Google Inc.
  5. *
  6. * Licensed under the Apache License, Version 2.0 (the "License");
  7. * you may not use this file except in compliance with the License.
  8. * You may obtain a copy of the License at
  9. *
  10. *     @license http://www.apache.org/licenses/LICENSE-2.0
  11. *
  12. * Unless required by applicable law or agreed to in writing, software
  13. * distributed under the License is distributed on an "AS IS" BASIS,
  14. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15. * See the License for the specific language governing permissions and
  16. * limitations under the License.
  17. */
  18.  
  19. $google_dt = time();
  20.  
  21. function google_append_url(&$url, $param, $value) {
  22.   $url .= "&" . $param . "=" . urlencode($value);
  23. }
  24.  
  25. function google_append_globals(&$url, $param) {
  26.   google_append_url($url, $param, $GLOBALS["google"][$param]);
  27. }
  28.  
  29. function google_append_color(&$url, $param) {
  30.   global $google_dt;
  31.  
  32.   $color_array = split(",", $GLOBALS["google"][$param]);
  33.   google_append_url($url, $param,
  34.                     $color_array[$google_dt % sizeof($color_array)]);
  35. }
  36.  
  37. function google_get_ad_url() {
  38.   $google_ad_url = "http://pagead2.googlesyndication.com/pagead/ads?";
  39.   $google_scheme = ($GLOBALS["google"]["https"] == "on")
  40.       ? "https://" : "http://";
  41.   foreach ($GLOBALS["google"] as $param => $value) {
  42.     if ($param == "client") {
  43.       google_append_url($google_ad_url, $param,
  44.                         "ca-mb-" . $GLOBALS["google"][$param]);
  45.     } else if (strpos($param, "color_") === 0) {
  46.       google_append_color($google_ad_url, $param);
  47.     } else if ((strpos($param, "host") === 0)
  48.                || (strpos($param, "url") === 0)) {
  49.       google_append_url($google_ad_url, $param,
  50.                         $google_scheme . $GLOBALS["google"][$param]);
  51.     } else {
  52.       google_append_globals($google_ad_url, $param);
  53.     }
  54.   }
  55.   google_append_url($google_ad_url, "dt",
  56.           round(1000 * array_sum(explode(" ", microtime()))));
  57.  
  58.   return $google_ad_url;
  59. }
  60.  
  61. $google_ad_handle = fopen(google_get_ad_url(), "r");
  62. if ($google_ad_handle) {
  63.   while (!feof($google_ad_handle)) {
  64.     echo fread($google_ad_handle, 8192);
  65.   }
  66.   fclose($google_ad_handle);
  67. }
  68.  
  69. ?>

[おまけ] 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での使用法について見てきました。各言語用にコードが用意されているのは素晴らしいことなのですが、つまづきそうな点が幾つかあるので注意が必要です。

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

コメント (Close):1

fajerwerki 09-12-13 (日) 21:05

I just want to tell you that your blog is very interesting, bookmarked

トラックバック:4

このエントリーのトラックバックURL
http://www.1x1.jp/blog/2007/10/google_mobile_adsense.html/trackback
Listed below are links to weblogs that reference
モバイル向けGoogle AdSenseをPHPで使う from Shin x blog
pingback from ワードプレスでのモバイル(携帯)アドセンス導入(設定)方法 08-10-13 (月) 10:45

[...] 上記のエラーを解決するにはどうすれば良いのか検索しまくり、一時は諦めそうになりましたが、何とか解決方法を見つけることができました。解決方法のヒントはこのページとこのページに書いてありました。 [...]

pingback from 携帯版Google Adsenseのコードがいつのまにか変更になっている - ElectronicBrain is eating BreakFast 09-01-10 (土) 0:20

[...] モバイル向けGoogle AdSenseをPHPで使う | Shin x blog [...]

pingback from adsenceのまとめサイト : アドセンスについて 10-09-03 (金) 10:42

[...] モバイル向けGoogle AdSenseをPHPで使う | Shin x blogる言語で記述します。adsenceサイトではphp/perl/jsp/aspのコードが用意されており、モバイル向けadsense設定を行うとそれぞれのコードが表示されます。 php用コードを確認したところ、コードの流れは単純で、adsense idや広告フォー…はてなブックマークより [...]

pingback from adsense httpsについて : アドセンスについて 10-09-19 (日) 13:18

[...] モバイル向けGoogle AdSenseをPHPで使う | Shin x bloggoogle adsenseにモバイル版が登場しました。 通常のadsenseではjavascriptを使って広告を表示するのですが、携帯ではjavascriptが使えないので、phpやperlなどサーバ側で実行する言語で記述します。adsenceサイト…はてなブックマークより [...]

Home > PHP | Webサービス > モバイル向けGoogle AdSenseをPHPで使う

検索
フィード
メタ情報

Return to page top