Home > Archives > 2011-08

2011-08

【PHP】Memcache

memcachedに関して見ました。

PHPにはmemcachedを扱う方法として2つのモジュールがある。
1つ目はMemcacheで2つ目はMemcached。

Memcacheはpear形式で、Memcachedはpecl形式でインストールするとのこと。
とりあえず今回はMemcacheの方をみました。

Memcache

Memcache – PHP Manual

例:
memcache1.php

<?php
$mem = new Memcache;
$mem->connect('localhost', 11211);
$mem->set('key1', 'value1');
$mem->set('key2', 'value2');

echo $mem->get('key1'), PHP_EOL;
echo $mem->get('key2'), PHP_EOL;

簡単には上記の様な感じで使用をして、他にもいくつかのメソッドがあるのでそれはマニュアルを参照する。

【PHP】例外について

例外についてずっと避けてきたんですが(理由はわからないけど、なんかとっつきにくいイメージがありました。。)、
さらりとマニュアルを読んでみました。

例外

Exception – PHP Manual

読んでみたらなんも難しい事はなくむしろありがたいかなと思えた今日この頃。
この記憶がいつまで続くかわかりませんが、大事にしたいと思います。

【php】【symfony】【doctrine】各種マニュアルを読んでみる(4日目)

ちょっと期間は空いてしまいましたが、まだかろうじて読もうという気持ちはあります。

■進捗状況
・PHP:特になし
・symfony:第6章 – コントローラーレイヤーの内側
・Doctrine:特になし


cacheの部分で自分でmemcacheを導入してみるのと、自作のフィルターを作成してみる事が課題かなと。

では。

【nginx】nginxをちょこっとだけ覗いてみました

ちょこっとだけ覗くレベルのものではない(もっとがっつりやれよという意味で。)気がしますが、、、
nginxをちょこっとだけ覗いてみました。

nginxとは by wikipedia

  • 軽量高性能なWebサーバ/リバースプロキシ
  • BSD系ライセンスでリリースされている
  • 静的ファイル、インデックスファイルの処理と自動インデクシング
  • キャッシュ付きリバースプロキシ
  • 負荷分散
  • フォールトトレラント性
  • SSL/TLSサポート
  • FastCGIサポート
  • 名前ベースおよびIPベースの仮想サーバ
  • FLVストリーミング
  • MP4ストリーミング
  • Webページアクセス認証
  • gzip圧縮

Apacheの標準がpreforkで動くのに対し、nginxは1つのマスタープロセスと複数のワーカープロセスで動く。

1 万の非アクティブな HTTP キープアライブ接続は約 2.5M のメモリーを使用

というものらしい。

nginxはC10K問題を解決する為に作られたものらしく、C10K問題とはクライアント1万台問題のことで、
最近の動向として軽い処理を大量に扱わなければならないということがあり、
その時の問題になるのがCPUでもメモリでもなくプロセス番号が問題になる。

Apacheみたいに1プロセス1クライアントで処理していたら1台のサーバでは3万クライアントくらい(ポート番号のMAXは
32767)しか処理しきれないため、1スレッドで数クライアントを処理する事を求められる。


とりあえずここまで覗いてみてインストールしてアクセスできるようにしてみました。
今度はもっとがっつりみてみます。

【PHP】spl_autoload_registerに関して

PHPのspl_autoload_registerがよくわかってなかったので再度調べてみました。

PHP5以降では未定義のクラス/インターフェースを実行しようとした時に自動的にコールされる
__autoload関数というものがある。

__autoload関数

例1:
autoload1.php

<?php
function __autoload($class_name)
{
    echo "$class_name\n";
}
$obj1 = new MyClass1();
$obj2 = new MyClass2();

結果:
MyClass1
PHP Fatal error: Class ‘MyClass1′ not found in autoload1.php on line 8

解説:
1.MyClass1を読み込もうとする
2.読み込めないため__autoload関数を実行
3.echoで出力
4.それでもクラスは存在しないためエラー出力

例2:
autoload2.php

<?php
function __autoload($class)
{
    require_once $class.'.php';
    echo __FILE__ . "\n";
}
$obj = new MyClass1();

MyClass1.php

<?php
class MyClass1
{
    function __construct()
    {
        echo __CLASS__ . "\n";
    }
}

結果:
# php autoload2.php
autoload2.php
MyClass1

解説:
1.MyClass1の読み込み
2.未実装な為、___autoloadを実行
3.__autoload内でMyClass1.phpの読み込み
4.echo出力
5.MyClassのコンストラクタ実行

例3:

<?php
function __autoload($class)
{
    require_once $class.'.php';
    echo __FILE__ . "\n";
}

class MyClass1
{
    public function __construct()
    {
        echo __CLASS__."\n";
    }
}
$obj = new MyClass1();

結果:
MyClass1

解説:
1.MyClass1の読み込み
2.実装されている為、コンストラクタを実行

上記からわかる様に未実装の場合に__autoload関数が実行される。
これはマジックメソッドというらしく他にもあるので覚えておく必要がある。

さて、これはこれで便利だけどちょっと困った事があります。
__autoload関数は1つしか定義できないため、以下の場合に困ったりする。

困った例:
autoload3.php

<?php
function __autoload($class)
{
    include_once $class.'.php';
    echo "__FILE__\n";
}
$obj1 = new MyClass1();
// MyClass2はHoge/MyClass.phpにあるとする
$obj2 = new MyClass2();

結果:
__FILE__
MyClass1
PHP Warning: include_once(MyClass2.php): failed to open stream: No such file or directory in autoload3.php on line 5PHP Warning: include_once(): Failed opening ‘MyClass2.php’ for inclusion (include_path=’.:/usr/share/pear:/php/includes:/usr/local/lib’) in autoload3.php on line 5
__FILE__
PHP Fatal error: Class ‘MyClass2′ not found in autoload3.php on line 12

※ソースの改行を消しているので、エラーの行数と異なっています。

解説:
1.MyClass1の読み込み
2.実装されていない為、__autoload関数の実行
3.MyClass1.phpの読み込み、echo出力
4.MyClass1.phpのコンストラクタ実行
5.MyClass2の読み込み
6.include_pathに存在しないため、Warning出力
7.__autoload関数の実行
8.Fatalエラー

※requireとincludeだと処理が違うため、わからない人は調べて下さい。

上記を見るとMyClass2が違うディレクトリにある場合、autoload関数は1つしか登録できないという仕様上、
途中でエラーがでて止まっています。

長くなりましたがこれを解決するのがspl_autoload_registerです。

spl_autoload_register関数

例1:
spl_autoload_register1.php

<?php
namespace Foobar;
class Foo
{
    static public function test($name)
    {
        print '[[' . $name .']]'."\n";
    }
}
spl_autoload_register(__NAMESPACE__ . '\Foo::test');

$obj = new IndexistestClass;

結果:
[[Foobar\IndexistestClass]]
PHP Fatal error: Class ‘Foobar\IndexistestClass’ not found in spl_autoload_register1.php on line 14

解説:
1.spl_autoload_registerでFoobar\Foo::testの登録
2.IndexistestClassの読み込み
3.実装されていない為、spl_autoload_registerで登録をしたtest関数の実行
4.print出力
5.それでも存在していない為、Fatalエラー出力


例2:
spl_autoload_register2.php

<?php
function a ($c)
{
    echo "a\n";
}
function b ($c)
{
    echo "b\n";
}
spl_autoload_register('a');
spl_autoload_register('b');
$c = new Bla();

結果:
a
b
PHP Fatal error: Class ‘Bla’ not found in
spl_autoload_register2.php on line 14

解説:
1.spl_autoload_registerでa,bの登録
2.Blaクラスの読み込み
3.実装されていない為、aを実行
4.それでも存在していないため、bを実行
5.最後まで読み込めない為、Fatalエラー出力

ここで大事なのはspl_autoload_registerで登録した順に実行されていくという事!

例3:
spl_autoload_register3.php

<?php
function a ($c)
{
    echo "a\n";
    class Hoge {}
}
function b ($c)
{
    echo "b\n";
}
spl_autoload_register('a');
spl_autoload_register('b');
$c = new Hoge();

結果:
a

解説:
1.spl_autoload_registerでa, bの登録
2.Hogeクラスの読み込み
3.この時点では未実装の為、aの実行
4.ここでHogeクラスを発見した為、読み込み完了

上記を見てもらえればわかると思いますが、aの途中でHogeクラスが見つかったため、
bを実行する前にオブジェクト生成が完了しています。

aとbの登録順序を逆にしたらどうなるかは試してみて下さい。
また、これで違うディレクトリのクラスが存在する場合でも
うまく読み込める事も試してみて下さい。

参考:
クラスのオートローディング
spl_autoload_register – PHP Manual
spl_autoload_register

Home > Archives > 2011-08

Search
Feeds
Meta

Return to page top