月別アーカイブ: 2010年11月

dfgallery PHP5.3での修正

概要

サーバをアップグレードしたことによって動かなくなった

dfgallery

原因がよくわからなかったからしばらく放置してた。
でも、やっぱり動かしたいのでデバッグしてみたときのメモ。

dfgallery

Q.そもそもdfgalleryって何?

A.dfgalleryでググるとすぐにわかると思いますが、高機能なフォトギャラリーです。アプリケーション自体はCodeIgniterで作られているようです。

このアプリケーション、最初は配布元の動画のようにスムーズに設定出来ない。。。

インストール

インストールの時の設定はこちらのサイトを参照したほうがいいかと思います。
Flickrのウェブアルバムと同等の機能を持つdfGallery 2.0をさくらインターネットの共用サーバーに設置する
このリンクの解決の方のリンクをたどるといいかと思います。

原因

PHPのバージョンが5.3に上がったことが原因だった。

対処: PHP5.3の時の変更箇所

/lib/ci/codeigniter/CodeIgniter.php
60行

// コメントアウト
//set_magic_quotes_runtime(0); // Kill magic quotes

set_magic_quotes_runtime()は非推奨となったため。

/lib/ci/libraries/URI.php
189行目をコメントアウトして追加

//if ( ! preg_match("|^[".preg_quote($this->config->item('permitted_uri_chars'))."]+$|i", $str))
if ( ! preg_match("|^[".($this->config->item('permitted_uri_chars'))."]+$|i", rawurlencode($str)))

ここを参照

/lib/ci/libraries/Loader.php
249行目を変更

//$CI->dbutil =& new $class();
$CI->dbutil = new $class();

php5は=で参照渡し
ここを参照

多分これでOKなはず…

PHP browscap

毎回確認するのはとても面倒なのでshellを作成。

#vi browscapupdate.sh
=============================================
#!/bin/bash
wget http://browsers.garykeith.com/stream.asp?PHP_BrowsCapINI
retdiff=`diff -q stream.asp?PHP_BrowsCapINI /etc/php.d/browscap.ini`

if ["$retdiff" = ""] ; then
        rm -f stream.asp?PHP_BrowsCapINI
        echo "no update"
else
        mv -f stream.asp?PHP_BrowsCapINI /etc/php.d/browscap.ini
        echo "update!"
fi
=============================================
#chmod 700 browscapupdate.sh

#echo "0 5 * * * root /root/browscapupdate.sh" > /etc/cron.d/update

内容

  • 新規ファイルの作成
  • ファイルのダウンロード
  • ダウンロードしたファイルと現在のファイルの比較
  • 差分があればファイルを更新、なければDLしたファイルを削除
  • ファイルに実行権限の付加
  • Cronに登録

PHP get_browser() ユーザのブラウザの機能を取得

概要

標準では使えないget_browser()関数を使うために、browscap.iniファイルをダウンロードし、php.iniの設定を行う。

最近ボットのアクセス頻度が多くなったため、ボット判定のために何かないかなと思っていたところ、この関数を見つけたのでメモ。

参考URL

PHPマニュアル

ダウンロード

browscap.ini
ここからphpのものをDLする。
/etc/php.d/browscap.ini
に配置する。

どこか適当な場所に配置する。

設定

/etc/php.ini
browscap = /etc/php.d/browscap.ini
browscap = 配置したパス
※httpdの再起動
/etc/rc.d/init.d/httpd restart

ファイルの更新

browscap.ini は PHP にはバンドルされていません。 しかし、ここで最新の » php_browscap.ini を入手することができます。

browscap.ini は多くのブラウザに関する情報をもっていますが、 データベースを最新に保つのはユーザーによる更新に依存しています。 ファイルのフォーマット自体を見ればおおよそのことがわかります。

上記のようにマニュアルに書いてある。
i.e.古くなったら自分で更新してねってこと。。。

You shall not mirror the files without prior authorization.

※自動化すると、アクセスを拒否されるおそれがあるのでしないほうがいいです。

[訂正]自動化するのはOKだけど、24時間以内に10回以上のアクセスをすると、アクセス制限がかけられます。

403-6 Errorが表示されたので、google先生に翻訳の相談をしながら、問い合せてみました。
つくったShellをテストするために何度か実行したら上のエラーが表示されたとういうのは内緒。。。

Bot判定のサンプル

	// member var
	public $_bots = array(
	    'Googlebot',
	    'bingbot',
	    'NHN Corp',
	    'MLBot',
	    'SurveyBot',
	);

	// method
	/**
	 * Botを判定する
	 * @return boolean
	 */
	function isBot($isBrowsercap = true, $ua = null){
		if($isBrowsercap == true){
			$browser = get_browser(null, true);
			if($browser['crawler'] == true){
				return true;
			}
		}
		if ($ua == null) {
			$ua = $_SERVER['HTTP_USER_AGENT'];
		}
		$botlist = "/(" . implode("|", $this->_bots) . ")/";
		if (preg_match($botlist, $ua)) {
			return true;
		}
		return false;
	}

get_browserを使った場合でも弾けなかったものを、自分で追加して弾くようにする。

判定方法

判定方法は、ipアドレスではなく、User Agentからキーワードが含まれていないかを検索することにした。
なぜなら、ipアドレスの管理は大変だから。。。
使われていたものが急に使われなくなったり、使われていなかったものが急に使われたりするようになることもあるから。