2012-05-30 11 views
5

PHPでハッシュマップ(連想配列)をPHPで実装しようとしています。これはアプリケーション全体で利用可能です。つまり、アプリケーションコンテキストで保存します。プログラム終了時に失われることはありません。 PHPでこれをどのように実現できますか?アプリケーションコンテキストのhashmap PHP

おかげで、

+1

while (lock exists) { microsleep; } get lock. check we got lock. write value. release lock. 
PHP自体には 'アプリケーション・コンテキスト' を有していません。回避策があります(つまり、ファイルや共有メモリの内容を保存する)が、それ以外の場合は、PHPスクリプトの実行終了時には何も存続しません。 – zneak

答えて

1

ZendのバージョンのPHPを使用している場合は、簡単です。
データをシリアル化する必要はありません。
コンテンツのみをキャッシュできます。ファイルハンドルなどのリソースはできません。 true/falseを格納するには、1,035を使用して、キャッシュの失敗と===の結果を区別できます。

ストア:

zend_shm_cache_store('cache_namespace::this_cache_name',$any_variable,$expire_in_seconds); 

取得:

$any_variable = zend_shm_cache_fetch('cache_namespace::this_cache_name'); 

if ($any_variable === false) { 
    # cache was expired or did not exist. 
} 

を長い間住んでいたデータのために使用することができます:

zend_disk_cache_store();zend_disk_cache_fetch(); 

をZendのないものについては、上記の対応APCのバージョン:

ストア:

apc_store('cache_name',$any_variable,$expire_in_seconds); 

は取得:

$any_variable = apc_fetch('cache_name'); 

if ($any_variable === false) { 
    # cache was expired or did not exist. 
} 

は言及された他の方法のうちのいずれかを使用しないでください。 共有メモリを使用できない場合は、データをディスクにシリアル化/シリアル化解除できます。もちろん、共有メモリは、はるかに高速であるとZendのいいところは、それはあなたのための同時実行の問題を処理し、名前空間ができている:

ストア:

file_put_contents('/tmp/some_filename',serialize($any_variable)); 

を取得します。

$any_variable = unserialize(file_get_contents('/tmp/some_filename')); 

編集を:処理するには同時実行性は自分自身に問題を起こします、私は最も簡単な方法はロックを使用することだと思います。私はまだロックが存在しロックを取る間のこの擬似コードの競合状態の可能性を見ることができますが、あなたはその点を知っています。

擬コード:

+0

私はフレームワークを使用していません。フレームワークを使用しないでこれを行うにはどうすればいいですか? – cldy1020

+0

フレームワークはzend PHPスタックから別に実装されています。私はどちらのフレームワークも使用していません。 –

+0

申し訳ありません、私はZendスタックを持っていません。共有メモリまたはAPC(Alix Axelの言及の通り) – cldy1020

1

あなたは、このためには、共有メモリに利用できるがあるだろう置くデータをAPCsimilarsを使用することができます。

これはもちろん、サーバーの再起動の間は維持されないことに注意してください。

+0

[APC](http://www.php.net/manual/en/book.apc.php)と[共有メモリ](http://www.php.net/manual)の主な違いは何ですか? /en/ref.shmop.php)? – cldy1020

関連する問題