PHPカスタムスーパーグローバルアレイの質問
-
27-10-2019 - |
質問
私は読んでいて、それが望んでいたので達成することは不可能かもしれないことを知っていますが、私は方法があることを望んでいるので、ここに行きます。
私にはユーザーのIDがあり、それぞれにカウントがあります。これらの値をマシンメモリに保存し、DBをたまにしか更新できないようにしたいと思いますが、Absolutleyは絶えずではありません。もちろん、ページは多くのユーザーからアクセスされています。アレイは各ユーザーに関連性を維持し、必要に応じて更新したいと考えています。 (それが私がDBを使用したくないもう1つの理由です。アップデートはインデックス付き列で時間がかかりますよね?)
次のような配列:$ my_superglobal_arr =( '1' => 304、 '2' => 763、 '6' => 12、'13 '=> 96);完璧だっただろう。
助言がありますか ?
ありがとう !
解決
アップデートインデックス付き列で時間がかかりますよね?
右。ただし、それは依存します。最初にデータベースに行くことを強くお勧めします。 実務の経験 更新などを使用して、「多くの」と呼ぶことができる特定のユーザーを学びます。そして、あなたが本当にあなたの珍しいセットアップが本当に必要であるならば、それは本当に必要なのか、それとも単なる想像上の空想であるかを決めます。
あなたの他の質問を読むと、最初にSQLを学ぶことは必須です。
他のヒント
カップルする必要があります ArrayAccess
と APC キャッシュ能力と採用a Singleton
パターン。
class UserCounter implements ArrayAccess {
public static function getInstance()
{
static $instance;
if (!$instance) {
$instance = new self;
}
return $instance;
}
public function offsetSet($offset, $value)
{
apc_store(__CLASS__.$offset, $value);
}
public function offsetExists($offset)
{
return !!apc_fetch(__CLASS__.$offset);
}
public function offsetUnset($offset)
{
apc_delete(__CLASS__.$offset);
}
public function offsetGet($offset)
{
return apc_fetch(__CLASS__.$offset);
}
private function __construct() {}
private function __clone() {}
private function __wakeup() {}
}
使用法:
$user_counter = UserCounter::getInstance();
$user_counter[1] = $user_counter[1] + 1;
var_dump($user_counter[1]);
最初のリクエストでの出力:
int(1)
2番目:
int(2)
これらのカウンターをデータベースに保存する必要がある場合:
$user_counter = UserCounter::getInstance();
foreach ($users as $user_id) {
store_counter_in_db($user_id, $user_counter[$user_id]);
}
ノート: バグがあります これにより、APCの特定のバージョンで単一のリクエスト中に単一のカウンターを増やすことができなくなる場合があります。後続のリクエストでの増加は問題ではありません。