カテゴリー ‘ PHP

PHPのdate_default_timezone_set()のエラー対策


 

最近のPHPでdate関連の関数を実行すると、

Strict Standards: date() [function.date]: It is not safe to rely on the systems timezone settings, please use the date.timezone setting, the TZ environment variable or the date_default_timezone_set() function. We now use ‘Asia/Tokyo’ for ‘JST’ in

こんな感じのエラーが表示されると思います。

これは、タイムゾーンを設定していないからです。

その対応の為のphp.iniの設定方法は、

sudo /etc/php.ini
date.timezone = Asia/Tokyo

これで、httpd or nginx or php-fpmを再起動してphp.iniの設定を読み込みます。

PHPでのmbstringの設定


 

PHPをUTF-8で使用する場合に、いつもmbstringの設定をするのでその備忘録

phpの[mbstring]の設定

mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = pass
mbstring.http_output = pass
mbstring.encoding_translation = Off
mbstring.detect_order = UTF-8,SJIS-win,auto
mbstring.substitute_character = ?;

これが一番、POSTなどでデータを渡しても文字化けが少ないと思われる設定方法

もっと良い設定があるかもしれませんが、いつもこの設定でやっていて特に問題ないです。

さくらのVPSのCentOS6.2への環境構築


 

さくらのVPSでのOSでCentOS6.2が標準OSになったのでその時に行った設定をまとめる

iptablesの設定

sudo vim /etc/sysconfig/iptables

次の内容を記述する

*filter
:INPUT   ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT  ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]

-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# SSH, HTTP, HTTPS, MySQL
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 433 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 25 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306  -j ACCEPT

-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited

COMMIT

iptablesを再起動する

sudo /etc/init.d/iptables start

ユーザーの作成

useradd [ユーザー名]
passwd [ユーザー名]

sudoの設定

visudo

次の行のコメントを外す

# %wheel ALL=(ALL)       ALL
  ↓
 %wheel ALL=(ALL)       ALL

次にgroupをユーザーに付与する

vigr

次の行にsudoを使用したい対象ユーザーをカンマ区切りで記述する

wheel:x:10:root
  ↓
wheel:x:10:root,[ユーザー名]

sshの設定

mkdir .ssh
chmod 700 .ssh
# scpで~/.ssh/auhtorized_keysをコピーする
chmod 600 .ssh/authorized_keys

sshd_configを編集

sudo vim /etc/ssh/sshd_config

以下のように修正して、パスワードでの認証を拒否する

PasswordAuthentication yes
  ↓ 以下のように「yes」から「no」に変更する
PasswordAuthentication no

sshdの再起動

sudo /etc/init.d/sshd restart

zshのインストール

sudo yum install zsh

ユーザーのログインシェルの変更

sudo chsh -s /bin/zsh [ユーザー名]

screenのインストール

sudo yum install screen

yumの設定

yum-prioritiesのインストール

sudo yum -y install yum-priorities

次に、CentOS-Base.repoにprioritiesの設定をする

sudo vim /etc/yum.repos.d/CentOS-Base.repo

開いたファイルの[base][updates][extras]に以下の設定を追加する

priority=1

RPMforgeリポジトリインストール

sudo rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt
sudo rpm -ivh http://apt.sw.be/redhat/el6/en/x86_64/rpmforge/RPMS/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm
sudo vim /etc/yum.repos.d/rpmforge.repo

rpmforge.repoの編集

sudo vim /etc/yum.repos.d/rpmforge.repo

rpmforge.repoの[rpmforge]に以下の内容を追加

enabled=1
priority=1

epelリポジトリのインストール

sudo rpm --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6
wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-5.noarch.rpm
sudo rpm -ivh epel-release-6-5.noarch.rpm
sudo vim /etc/yum.repos.d/epel.repo

epel.repoの編集

sudo vim /etc/yum.repos.d/epel.repo

epel.repoの[epel]を以下の内容で編集

enabled=1
priority=1

remiリポジトリのインストール

sudo rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
sudo rpm -ivh http://rpms.famillecollet.com/enterprise/6/remi/x86_64/remi-release-6-1.el6.remi.noarch.rpm
sudo vim /etc/yum.repos.d/remi.repo

remi.repoの[remi][remi-test]を以下の内容で編集

enabled=1
priority=1

memcachedのインストール

sudo yum install memcached

MySQLのインストール

sudo yum install --enablerepo=remi mysql.x86_64 mysql-server.x86_64

MySQLの設定

sudo vim /etc/my.cnf

以下の設定を記述する

[mysqld]

 〜 途中略 〜

character-set-server=utf8
skip-character-set-client-handshake

 〜 途中略 〜

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqldump]
default-character-set=utf8

データベースの作成

sudo mysql_install_db

mysqlを起動

sudo /etc/init.d/mysqld start

rootパスワードの設定

/usr/bin/mysqladmin -u root password '新しいパスワード'

PHPのインストール

sudo yum install --enablerepo=remi,remi-test php.x86_64 php-devel.x86_64 php-bcmath.x86_64 php-cli.x86_64 php-common.x86_64 php-gd.x86_64 php-fpm.x86_64 php-imap.x86_64 php-mbstring.x86_64 php-mcrypt.x86_64 php-mysql.x86_64 php-pdo.x86_64 php-soap.x86_64 php-snmp.x86_64 php-xml.x86_64 php-xmlrpc.x86_64
sudo yum install --enablerepo=remi,remi-test php-pecl-apc.x86_64 php-pecl-memcached.x86_64 php-pecl-http.x86_64

nginxのインストール

wget http://nginx.org/download/nginx-1.1.19.tar.gz
tar zxvf nginx-1.0.15.tar.gz
wget http://labs.frickle.com/files/ngx_cache_purge-1.5.tar.gz
tar zxvf ngx_cache_purge-1.5.tar.gz
cd nginx-1.1.19/
sudo yum install libxslt-devel.x86_64 gd-devel.x86_64 geoip-devel.x86_64 pcre-devel.x86_64 openssl-devel.x86_64
sudo groupadd -g 700 www-data
sudo useradd -s /sbin/nologin -M -g www-data -u 700 -d /var/www www-data
./configure --user=www-data --group=www-data --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module --prefix=/opt/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --pid-path=/var/run/nginx.pid --lock-path=/var/lock/subsys/nginx --http-log-path=/var/log/nginx/access.log --add-module=../ngx_cache_purge-1.5
make
sudo make install

nginxの起動スクリプトの設定

sudo vim /etc/init.d/nginx

以下の内容を記述する

#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig:   - 85 15
# description:  Nginx is an HTTP(S) server, HTTP(S) reverse \
#               proxy and IMAP/POP3 proxy server
# processname: nginx
# config:      /etc/nginx/nginx.conf
# config:      /etc/sysconfig/nginx
# pidfile:     /var/run/nginx.pid

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0

nginx="/usr/sbin/nginx"
prog=$(basename $nginx)

NGINX_CONF_FILE="/etc/nginx/nginx.conf"

[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx

lockfile=/var/lock/subsys/nginx

start() {
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
    echo -n $"Starting $prog: "
    daemon $nginx -c $NGINX_CONF_FILE
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}

stop() {
    echo -n $"Stopping $prog: "
    killproc $prog
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}

restart() {
    configtest_q || configtest || return 6
    stop
    start
}

reload() {
    configtest_q || configtest || return 6
    echo -n $"Reloading $prog: "
    killproc $nginx -HUP
    echo
}

configtest() {
  $nginx -t -c $NGINX_CONF_FILE
}

configtest_q() {
    configtest >/dev/null 2>&1
}

rh_status() {
    status $prog
}

rh_status_q() {
    rh_status >/dev/null 2>&1
}

# Upgrade the binary with no downtime.
upgrade() {
    local pidfile="/var/run/${prog}.pid"
    local oldbin_pidfile="${pidfile}.oldbin"

    configtest_q || configtest || return 6
    echo -n $"Staring new master $prog: "
    killproc $nginx -USR2
    retval=$?
    echo
    sleep 1
    if [[ -f ${oldbin_pidfile} && -f ${pidfile} ]];  then
        echo -n $"Graceful shutdown of old $prog: "
        killproc -p ${oldbin_pidfile} -QUIT
        retval=$?
        echo
        return 0
    else
        echo $"Something bad happened, manual intervention required, maybe restart?"
        return 1
    fi
}

case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart|configtest)
        $1
        ;;
    force-reload|upgrade)
        rh_status_q || exit 7
        upgrade
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    status|status_q)
        rh_$1
        ;;
    condrestart|try-restart)
        rh_status_q || exit 7
        restart
        ;;
    *)
        echo $"Usage: $0 {start|stop|reload|configtest|status|force-reload|upgrade|restart}"
        exit 2
esac

起動スクリプトの権限を変更する

sudo chmod 755 /etc/init.d/nginx

php-fpmの設定

php-fpmの起動ユーザーをnginxで指定したユーザーと合わせる

sudo vim /etc/php-fpm.d/www.conf
user = www-data
group = www-data

sessionのフォルダのグループを変更する

sudo chgrp www-data /var/lib/php/session

nginxの設定変更(以下の記述を追加)

location ~ \.php$ {
    root           html;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  /opt/nginx/html/$fastcgi_script_name;
    include        fastcgi_params;
}

nginxの再起動

sudo /etc/init.d/nginx restart

php-fpmの起動

sudo /etc/init.d/php-fpm restart

info.phpを書いて動作確認

vim info.php
<? phpinfo();

自動起動設定

sudo chkconfig iptables on
sudo chkconfig nginx on
sudo chkconfig php-fpm on
sudo chkconfig memcached on
sudo chkconfig mysqld on
sudo chkconfig postfix on

これでCentOS6.2にnginx + mysql + phpの環境ができました。

[FuelPHP] FuelPHPで作るログイン管理


 

5日目の@madmamorさんの「FuelPHPでFacebookアプリを作ってみよう。準備編。」に続きまして、

FuelPHP Advent Calendar 2011の6日目を書かせていただきます。@9ensanです。

今回は、FuelPHPをインストールすると「fuel/packages」フォルダに入ってくる「SimpleAuth」を使ったログイン管理システムの作り方です。

動作するサンプルは「こちら」になります。

まずは、初期設定です。

「fuel/packages/auth/config」フォルダ内にある2ファイル

  • auth.php
  • simpleauth.php

を「fuel/app/config」にコピーします。

「auth.php」を

return array(
  'driver' => 'SimpleAuth',
  'verify_multiple_logins' => false,
  'salt' => '9ensan',
);

のように、

「simpleauth.php」を

'login_hash_salt' => '9ensan_login',

のように、修正します。

※両ファイルのsaltの付いた行に関しては、各個人で簡単に分からない文字列にしてください。

次に「fuel/app/config/config.php」を

  /**
   * Localization & internationalization settings
   */
  'language'           => 'ja', //'en', // Default language
  'language_fallback'  => 'en', // Fallback language when file isn't available for default language
  'locale'             => 'ja_JP', //'en_US', // PHP set_locale() setting, null to not set

  'encoding'  => 'UTF-8',

  /**
   * DateTime settings
   *
   * server_gmt_offset  in seconds the server offset from gmt timestamp when time() is used
   * default_timezone   optional, if you want to change the server's default timezone
   */
  'server_gmt_offset'  =>  3600 * 9, //0,
  'default_timezone'   => 'Asia/Tokyo', //'UTC',

のように修正します。

そして、「fuel/app/lang/」に「ja」フォルダを作成します。

そこに「validation.php」を作成し中身に以下の内容を記述します。

return array(
  'required' => ':label は必須入力です。',
  'min_length' => ':label は :param:1 文字以上で入力して下さい。',
  'max_length' => ':label は :param:1 文字以下で入力して下さい。',
  'valid_email' => ':label は メールの形式で入力して下さい。',
);

これは、validationエラー時に日本語でエラーメッセージを出力する為に用意しています。

dbが接続できる用に「db.php」も修正しておきます。

これでconfigファイルの準備はできました。

次にテーブルを作ります。

db.phpで接続するように設定しているデータベースに対して、以下のSQLを実行し「users」テーブルを作成します。

CREATE TABLE `users` (
    `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    `username` VARCHAR( 50 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL ,
    `password` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL ,
    `group` INT NOT NULL DEFAULT 1 ,
    `email` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL ,
    `last_login` VARCHAR( 25 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL ,
    `login_hash` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL ,
    `profile_fields` TEXT CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL ,
    `created_at` INT( 11 ) UNSIGNED NOT NULL ,
    UNIQUE (
        `username` ,
        `email`
    )
)

こちらのテーブルは、「simpleauth.php」コンフィグファイル内で、

ログインに使用するテーブル名をusersと指定しているのでこの名前で作成します。

もし、別名に変更する場合「simpleauth.php」コンフィグファイル内も修正が必要になります。

これで、SimpleAuthを使用する準備はできました。

まず、用意するメソッドですが、今回は以下のメソッドを用意します。

  • before() // 前処理
  • action_404() // ページが見つからない
  • action_timeout() // 不正なページアクセス
  • action_logined() // ログイン済み画面
  • validate_login() // ログイン入力チェック
  • action_login() // ログイン処理
  • action_logout() // ログアウト
  • action_create() // ユーザー作成入力画面
  • validate_create() // ユーザー作成入力チェック
  • action_created() // ユーザー作成処理
  • action_update()  // ユーザー更新入力画面
  • validate_update() // ユーザー更新入力チェック
  • action_updated() // ユーザー更新処理
  • action_remove()  // ユーザー削除確認画面
  • action_removed() // ユーザー削除処理

まずは、前処理から

	public function before()
	{
		parent::before();
		// 初期処理
		// POSTチェック
		$post_methods = array(
			'created',
			'updated',
			'removed',
		);
		$method = Uri::segment(2);
		if (Input::method() !== 'POST' && in_array($method, $post_methods)) {
			Response::redirect('auth/timeout');
		}
		// ログインチェック
		$auth_methods = array(
			'logined',
			'logout',
			'update',
			'remove',
		);
		if (in_array($method, $auth_methods) && !Auth::check()) {
			Response::redirect('auth/login');
		}
		// ログイン済みチェック
		$nologin_methods = array(
			'login',
		);
		if (in_array($method, $nologin_methods) && Auth::check()) {
			Response::redirect('auth/logined');
		}
		// CSRFチェック
		if (Input::method() === 'POST') {
			if (!Security::check_token()) {
				Response::redirect('auth/timeout');
			}
		}
	}

ここでは、「Auth::check()」と「Security::check_token()」が重要な処理になります。

「Auth::check()」は、既にログイン済みかどうかのチェックになります。

ログインしていないと表示しては、まずいメソッドをログインしていないのに呼ばれた場合はログインページへリダイレクトしています。

「Security::check_token()」は、CSRFを防ぐ為にtokenのチェックをしています。

tokenの仕込みは、view側で、

<input type="hidden" name="<?php echo \Config::get('security.csrf_token_key');?>" value="<?php echo \Security::fetch_token();?>" />

のように記述し、hiddenにtokenを設定しています。

ちなみに、「before」メソッドは、FuelPHPでは、コンストラクタの代わりに、初期処理を記述するメソッドです。

ですので、Controllerで実装する共通処理は「before」メソッドで記述するのがいいと思います。

次にログイン処理ですが

	public function action_login()
	{
		// ログイン処理
		$username = Input::post('username', null);
		$password = Input::post('password', null);
		$result_validate = '';
		if ($username !== null && $password !== null) {
			$validation = $this->validate_login();
			$errors = $validation->error();
			if (empty($errors)) {
				// ログイン認証を行う
				$auth = Auth::instance();
				if ($auth->login($username, $password)) {
					// ログイン成功
					Response::redirect('auth/logined');
				}
				$result_validate = "ログインに失敗しました。";
			} else {
				$result_validate = $validation->show_errors();
			}
		}
		$this->template->title = 'ログイン';
		$this->template->content = View::forge('auth/login');
		$this->template->content->set_safe('errmsg', $result_validate);
	}

このようになっていて

重要なのは、12、13行目のAuthのインスタンス生成部分とloginメソッドの使い方です。

Authのインスタンス「auth.php」コンフィグで「'driver' => 'SimpleAuth',」と設定してたので、

自動的にSimpleAuthのインスタンスが生成されます。

そして「$auth->login($username, $password)」では、パラメータで取得出来た、

ユーザー名とパスワードをチェックします。

ログインに成功するとtrueを、失敗すると、falseを返します。

ですので、ログインできたらログイン後画面にリダイレクトし、失敗した場合は、そのままエラー画面を表示しています。

次に、ログアウト

Auth::logout();

この1文でログアウトができます。

次に、ユーザーの登録処理

$auth->create_user($input['username'], $input['password'], $input['email'])

ユーザー名、パスワード、メールアドレスを渡して登録します。

失敗したら、falseが戻ってくるか、Exceptionが発生するので適時上手く処理する必要があります。

このメソッドには実は、隠れた第4引数、第5引数があり、

第5引数は、プロフィール情報を配列で渡すと「serialize」してデータベースに格納してくれます。

RDBの恩恵は消えますが、様々なプロフィールを登録出来る仕組みは「SimpleAuth」は保持しています。

次に、ユーザー情報更新処理

$auth->update_user($values, $username)

このように、ユーザー名をキーに更新対象を連想配列で渡します。

成功するとtrue、失敗するとfalseまたは、Exceptionが発生します。

こちらも適時上手く処理擦る必要があると思います。

次に、ユーザー削除処理

$auth->delete_user(Input::post('username', null));
Auth::logout();

削除後に、ログアウトするようにしてください。

こちらも削除に失敗するとExceptionが発生するので上手く処理してください。

FuelPHPでは、想定外の処理が起きると例外(Exception)を投げる処理があります。

これは、いいか悪いかは、人によって意見が分かれると思いますが、

上手く処理をしておかないと思いも寄らずに、通っていると思っていた処理が通らないなどという事に陥りかねないので

注意が必要だと思います。

 

今回作成した、ログイン処理は、「こちらに」app以下のファイルをアップしてあります。

参考にして頂ければと思います。

また、まずい箇所がありましたら、指摘して頂けたらと思います。

 

7日目のFuelPHP Advent Calendar 2011は、@tao_sさんによる

FuelPHPとCodeIgniterでCMS作ってパフォーマンスを比べてみた」です。

私もCodeIgniterからの移籍組なのでCIとのベンチマークは、とても気になるところです。

長くなりましたが、読んで頂きありがとうございました。

FuelPHPのキャッシュライブラリ – File編


まずは、fileストレージ

File

まず、cacheのコンフィグファイルをapp配下にコピーします。

cp fuel/core/config/cache.php fuel/app/config/cache.php

以下のように「fuel/app/config/cache.php」の内容を設定

return array(
	'driver' => 'file',
	'expiration' => null,
	'file' => array(
		'path' => '',
	),
);

これで、「file」ストレージをキャッシュに使用する設定ができました。

pathは設定していないと、デフォルトでは「fuel/app/cache」に

キャッシュの内容を保存したファイルが作成されます。

とりあえず、以下の内容でキャッシュを生成して試してみる

コードの内容は、

コントローラー

  public function action_cache()
  {
    // String
    Cache::set('string', 'cache test');
    $data['string'] = Cache::get('string');

    // Array
    $a = array(1, 2, array('key' => 'value'));
    Cache::set('array', $a);
    $data['array'] = Cache::get('array');

    // Object
    $o = new Library_Test();
    Cache::set('object', $o);
    $data['object'] = Cache::get('object');

    $this->template->title = 'Test » Cache';
    $this->template->content = View::forge('test/cache', $data);
  }

View

<p>Cache</p>
<div>String:<?php var_export($string) ?></div>
<div>Array :<?php var_export($array) ?></div>
<div>Class :<?php var_export($object) ?></div>
</p>

こんな感じです。

すると、画面上では

こんな感じになります。

で実際にキャッシュファイルの内容を確認すると

「fuel/app/cache」に以下の3ファイルが出来ていました。

  • array.cache
  • object.cache
  • string.cache

中身は、

{{Fuel_Cache_Properties}}{"created":1322409987,"expiration":null,"dependencies":[],"content_handler":"string"}{{/Fuel_Cache_Properties}}cache test

こんな感じ、

作成日時が「created」に入るみたい。

あとで確認するけど、「expiration」「dependencies」には、setメソッドの引数で渡される、expiration, dependenciesの情報がそれぞれ入るだろうと予想。

で、上記は文字列を保存したstring.cacheの内容だが、文字列はそのまま保存される模様。

同様に、array.cache、object.cacheの内容は、

{{Fuel_Cache_Properties}}{"created":1322409987,"expiration":null,"dependencies":[],"content_handler":"serialized"}{{/Fuel_Cache_Properties}}a:3:{i:0;i:1;i:1;i:2;i:2;a:1:{s:3:"key";s:5:"value";}}
{{Fuel_Cache_Properties}}{"created":1322409987,"expiration":null,"dependencies":[],"content_handler":"serialized"}{{/Fuel_Cache_Properties}}O:12:"Library_Test":0:{}

こんな感じ、phpのserialize関数を使用して保存されるもようでした。

return top