カテゴリー ‘ PHP

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


今回はmemcachedストレージ

Memcached

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

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

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

return array(
  'driver' => 'memcached',
  'expiration' => null,
  'memcached'  => array(
    'cache_id'  => 'fuel',
    'servers'   => array(
      array('host' => '127.0.0.1', 'port' => 11211, 'weight' => 100)
    ),
  ),
);

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

とりあえず、キャッシュを生成して試してみます。

コードの内容は、

コントローラー

public function action_memcache()
{
    // 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');

    return Response::forge(View::forge('cache/memcache', $data));
}

View

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

こんな感じです。

この時に使用したLibrary_Testオブジェクトのソースは、

<?php
class Library_Test {
  public static function _init()
  {
  }

  public function __toString()
  {
    return 'Library_Test';
  }

}

こんな感じです。

(Library_Testの設置場所は「fuel/app/classes/library/test.php」です)

でアクセスしてみると、

エラーがでた。memcachedをインストールしてませんでした。

ということでインストール(epelリポジトリなので、もしかすると環境によってはyumのリポジトリが見つからない可能性があります。その場合は、こちらを参考にリポジトリを追加するか、自力でphpのmemcached extensionをインストールしてください)

sudo yum install php-pecl-memcached
sudo /etc/init.d/httpd restart

で、再度アクセス

こんな感じになります。

登録されているキャッシュのデータを確認すると

こんな感じでした。

APCの時と全く同じ形で登録されていました。

問題点

ソースを呼んでみるとphpのmemcachedライブラリの「setOption」を使用が出来るように設計されていません。

となるとデフォルトのままでは「Consistent Hashing」の設定をできないのでは?と思っています。

これができないと「サーバの追加時にキャッシュミスだらけ」になってしまいます。

やっぱり拡張しないとダメなのかな…。

次回は、redisを調べてみます。

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


今回はAPCストレージ

APC

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

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

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

return array(
    'driver' => 'apc',
    'expiration' => null,
    'apc' => array(
        'cache_id'  => 'fuel',
    ),
);

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

とりあえず、キャッシュを生成して試してみます。

コードの内容は、

コントローラー

	public function action_apc()
	{
		// 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');

		return Response::forge(View::forge('cache/apc', $data));
	}

View

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

こんな感じです。

この時に使用したLibrary_Testオブジェクトのソースは

<?php
class Library_Test {
  public static function _init()
  {
  }

  public function __toString()
  {
    return 'Library_Test';
  }

}

こんな感じ

(Library_Testの設置場所は「fuel/app/classes/library/test.php」です)

でアクセスしてみると、

エラーが出た。APCをインストールしていませんでした。

ということでインストール

sudo yum install php-pecl-apc
sudo /etc/init.d/httpd restart

で、再度アクセス

こんな感じになります。

登録されているキャッシュのデータを確認すると

こんな感じで登録されていました。

登録内容的にはFileの時と変わらない感じでした。

次回は、memcachedを調べてみます。

PHP OpenID libraryをのbeginでNULLが返って来てはまった話し


 

仕事で、「OpenID」を使うことになり「PHP OpenID library. 」をダウンロードしてサンプルを動かしたのですが動作しない

OpneIDのサーバに接続に行ってNULLが戻ってくる???

なんでだろって調べた結果、結論としては

「dom」「domxml」

のライブラリがインストールされていなかったのが原因でした。

CentOSを使用しているので
sudo yum install php-domxml-php4-php5 -y

または、
sudo yum install php-xml -y

これで、無事動作するようになりました。

くだらない事で、時間とってしまった多分ドキュメントには記述されているのでちゃんと読みましょうということですね。

CodeIgniterを参考に作った本当に簡易なフレームワーク


 

簡易PHPフレームワークの公開です。

CodeIgniterの設定をするのも大げさすぎるサイトを作ってたりするので

その時に使用している自作フレームワークを公開します。

大元は「CodeIgniter」でも本当に必要な機能を参考に作成しているものです。

とりあえず機能としては、

MVCの分離
DB接続(PDO)

くらいかも、

セキュリティも何も考慮にいれていないので

そのあたりは必要に応じて機能拡張で対応しています。

学習コストは、すこぶる低いです。

とりあえず「sample.php」を動作させた画面です。

こんな感じ、これを動作させる為のソースは

1.config.phpの修正

まず、config/config.phpを自分の環境に合わせて修正

<?php
// config設定
$config['db_name'] = 'dbname';
$config['db_host'] = 'localhost';
$config['db_user'] = 'dbuser';
$config['db_password'] = 'dbpassowrd';
$config['db_dns'] = "mysql:host={$config['db_host']}; dbname={$config['db_name']}";
$config['libDir'] = './libs/';
$config['viewDir'] = './views/';

core/gen.phpの9行目にあるconfig.php読み込み先の設定修正する

<?php
/**
 * 共通処理
 * 全てこのソースを一度requireしてから処理する
 */
ob_start();

// 読み込むconfigの設定を環境によって修正してください。
$config['configDir'] = './config/';

2.controllerの作成

とりあえず「core/gen.php」をrequireしてから全ては始まります。

<?php
require_once('core/gen.php');
// 表示データを格納
$data = array();

// 処理
$data['title'] = 'これはサンプルです';
$data['q1'] = $gen->http->getParam('q1', 'q1はありませんでした');

// ライブラリを読み込み
$gen->load('sample');
$data['sample'] = $gen->sample->get_sample();

// 表示するHTMLの呼び出し
$gen->view->load('sample', $data);

3.viewの作成

普通のphpです、$dataという変数に値が格納されて渡ってきます。

これは$gen->view->loadの呼び出し時の第2引数がそのまま渡されます。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<div>title:<?php echo $data['title'] ?></div>
<div>q1($_GET['q1']):<?php echo $data['q1'] ?></div>
<pre>sample:<?php var_dump($data['sample']); ?></pre>
<div>now:<?php echo nowstr(); ?></div>

<div><a href="./sample.php?q1=aaa">q1テスト(aaa)</a></div>
<div><a href="./sample.php">q1テスト(値なし)</a></div>
</body>
</html>

機能拡張

1.libsの作成

contollerでの「$gen->load(‘sample’)」のようにすることで、

$config[‘libDir’]に作成した同一名称のPHPをrequireして「ucfirst」の規約に則ったクラス名のクラスを自動生成します。

<?php

class Sample {
	var $gen;
	function __construct() {
		$this->gen =& get_instance();
	}

	function get_sample() {
		$sql = 'SELECT * FROM sample';
		$stmt = $this->gen->pdo->prepare($sql);
		$stmt->execute();
		$ret = $stmt->fetchAll(PDO::FETCH_ASSOC);
		return $ret;
	}

}

2.helperの作成

$config[‘libDir’]に作成した、helper.phpの中に記述されている関数はviewのどの場所からでも呼び出しが可能です。

views/sample.phpの9行目で使用例を記述しています。

<?php
function nowstr() {
	$str_time = date('Y-m-d H:i:s');
	return $str_time;
}
function isIphone() {
	$gen =& get_instance();
	return $gen->http->isIphone();
}

 

以上がフレームワークの機能です。

ソースコードはgithubで公開しています。

githubのリポジトリはこちらになります。

機能は本当にないので勝手に拡張して使って下さい。

ライセンスなどマズイ場合は連絡もらえたらと思います。

nginxでfuelphpを使用する場合の注意点


 

nginxでfuelphpを使用する時に、「Response::redirect」を使用するとページがただしく表示されない場合があります。

Response::redirect('controller/action');

こんな、感じで普通に記述しても遷移先のURLを見ると

http://hogehoge.com/index.php/controller/index.php/controller/action

こんなURLでNot Foundになってしまいます。

 

こんな時は、

vim app/config/config.php
'base_url' => null,
// これを以下のように修正
'base_url' => '/',

を設定する事で解決できるので、base_urlはnullでなく設定するようにしましょう。

もっと良い解決方法があったら教えて下さい。

return top