5

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

ありがとう、

4

2 に答える 2

1

これにはAPCなどを使用できます。そこに配置したデータは共有メモリで利用できます。

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

于 2012-05-30T18:01:21.590 に答える
1

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

店:

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') );

編集:同時実行の問題を自分で処理するには、ロックを使用するのが最も簡単な方法だと思います。この疑似コードでは、lock exists と get lock の間で競合状態が発生する可能性がまだありますが、要点はわかります。

疑似コード:

while ( lock exists ) {
    microsleep;
}
get lock.
check we got lock.
write value.
release lock.
于 2012-05-30T18:03:25.550 に答える