Heim >Backend-Entwicklung >PHP-Tutorial >Ausführliche Erläuterung von vier Methoden zum Zählen der Anzahl der Personen, die mit PHP online sind

Ausführliche Erläuterung von vier Methoden zum Zählen der Anzahl der Personen, die mit PHP online sind

WBOY
WBOYnach vorne
2022-06-08 13:51:386663Durchsuche

Dieser Artikel vermittelt Ihnen relevantes Wissen über PHP. Er stellt hauptsächlich vor, wie Sie die Anzahl der Personen online zählen. Sie können Tabellenstatistiken verwenden, Redis-geordnete Mengenstatistiken verwenden, Hyperloglog für Statistiken verwenden usw. Werfen wir einen Blick darauf , ich hoffe, es wird für alle hilfreich sein.

Ausführliche Erläuterung von vier Methoden zum Zählen der Anzahl der Personen, die mit PHP online sind

Empfohlene Studie: „PHP-Video-Tutorial

Wie viele Menschen besuchen täglich eine Unternehmenssystem-Website und wie viele Menschen sind online? Diese Art von Geschäft müssen wir uns während der Entwicklung vorbehalten, und es liegt auch in unserem Gestaltungsspielraum! Denn eine laufende Website nutzt täglich Statistiken.

Wie zählt man die Anzahl der Personen online? Es gibt mehrere Lösungen. Der Code verwendet das Laravel-Framework. Kann während der Entwicklung als Referenz verwendet werden.

1 Tabellenstatistiken verwenden

Verwenden Sie Datentabellen, um die Anzahl der Personen online zu zählen. Diese Methode kann nur verwendet werden, wenn die Anzahl der gleichzeitigen Zugriffe nicht groß ist.

Zuerst erstellen wir eine neue Tabelle: user_login

Ausführliche Erläuterung von vier Methoden zum Zählen der Anzahl der Personen, die mit PHP online sind

Bearbeiten

user_login-Tabelle

Simulieren Sie die Benutzeranmeldung, speichern Sie den Benutzer in der Tabelle, wenn er nicht vorhanden ist, und aktualisieren Sie die Anmeldeinformationen, falls vorhanden

// 客户端唯一的识别码
$client_id = session()->getId();
//用户是否已存在
$user = DB::table('user_login')
    ->where('token', $client_id)
    ->first();
//不存在则插入数据
if (empty($user)) {
    $data = [
        'token' => $client_id,
        'username' => 'user_' . $client_id, // 模拟用户
        'uid' => mt_rand(10000000, 99999999),   //模拟用户id
        'create_time' => date('Y-m-d H:i:s'),
        'update_time' => date('Y-m-d H:i:s')
    ];
    DB::table('user_login')->insert($data);
} else {    
    // 存在则更新用户登录信息
    DB::table('user_login')
     ->where('token', $client_id)
     ->update([
          'update_time' => date('Y-m-d H:i:s')
      ]);
}

Dies Muss auch regelmäßig ohne Vorgänge gereinigt werden. Benutzer: Wenn der Benutzer innerhalb einer Stunde keine Vorgänge ausführt, können wir ihn als ungültigen Benutzer aufzeichnen

Der Code lautet wie folgt:

// 客户端唯一的识别码
$client_id = session()->getId();
//用户是否已存在
$user = DB::table('user_login')
    ->where('token', $client_id)
    ->first();
//不存在则插入数据
if (empty($user)) {
    $data = [
        'token' => $client_id,
        'username' => 'user_' . $client_id, // 模拟用户
        'uid' => mt_rand(10000000, 99999999),   //模拟用户id
        'create_time' => date('Y-m-d H:i:s'),
        'update_time' => date('Y-m-d H:i:s')
    ];
    DB::table('user_login')->insert($data);
} else {    
    // 存在则更新用户登录信息
    DB::table('user_login')
     ->where('token', $client_id)
     ->update([
          'update_time' => date('Y-m-d H:i:s')
      ]);
}

Funktionen, die wir implementieren können:

1 ) Die Anzahl der Personen, die derzeit online sind

2) Die Anzahl der Personen, die innerhalb eines bestimmten Zeitraums online sind

3) Der letzte Online-Benutzer

4) Geben Sie an, ob der Benutzer online ist

// 可实现功能一:当前总共在线人数
$c = DB::table('user_login')->count();
echo &#39;当前在线人数:&#39; . $c . &#39;<br />&#39;;
// 可实现功能二:某时间段内在线人数
$begin_date = &#39;2020-08-13 09:00:00&#39;;
$end_date = &#39;2020-08-13 18:00:00&#39;;
$c = DB::table(&#39;user_login&#39;)
    ->where(&#39;create_time&#39;, &#39;>=&#39;, $begin_date)
    ->where(&#39;create_time&#39;, &#39;<=&#39;, $end_date)
    ->count();
echo $begin_date . &#39;-&#39; . $end_date . &#39;在线人数:&#39; . $c . &#39;<br />&#39;;
// 可实现功能三:最新上线的用户
$newest = DB::table(&#39;user_login&#39;)
    ->orderBy(&#39;create_time&#39;, &#39;DESC&#39;)
    ->limit(10)
    ->get();
echo &#39;最新上线的用户有:&#39;;
foreach ($newest as $value) {
    echo $value->username . &#39; &#39;;
}
echo &#39;<br />&#39;;
// 可实现功能四:指定用户是否在线
$username = &#39;user_1111&#39;;
$online = DB::table(&#39;user_login&#39;)
    ->where(&#39;username&#39;, $username)
    ->exists();
echo $username . ($online ? &#39;在线&#39; : &#39;不在线&#39;);

2 Verwenden Sie die von Redis bestellte Sammlung, um online zu implementieren Zahlenzählen

Da es sich im Speicher befindet, ist es sehr effizient und kann die Anzahl der Online-Personen innerhalb eines bestimmten Zeitraums zählen und verschiedene Aggregationsvorgänge durchführen. Wenn jedoch viele Leute online sind, wird mehr Speicher beansprucht. Ein weiterer Punkt:

Ungültige Benutzer können nicht während der Benutzeroperationszeit entfernt werden. Nur Benutzer, die sich manuell abmelden, werden aus der Sammlung gelöscht.

Der Code lautet wie folgt:

// 客户端唯一的识别码
$client_id = session()->getId();
echo $client_id . &#39;<br />&#39;;
// 按日期生成key
$day = date(&#39;Ymd&#39;);
$key = &#39;online:&#39; . $day;
// 是否在线
$is_online = Redis::zScore($key, $client_id);
if (empty($is_online)) {    // 不在线,加入当前客户端
    Redis::zAdd($key, time(), $client_id);
}
// 可实现功能一:当前总共在线人数
$c = Redis::zCard($key);
echo &#39;当前在线人数:&#39; . $c . &#39;<br />&#39;;
// 可实现功能二:某时间段内在线人数
$begin_date = &#39;2020-08-13 09:00:00&#39;;
$end_date = &#39;2020-08-13 18:00:00&#39;;
$c = Redis::zCount($key, strtotime($begin_date), strtotime($end_date));
echo $begin_date . &#39;-&#39; . $end_date . &#39;在线人数:&#39; . $c . &#39;<br />&#39;;
// 可实现功能三:最新上线的用户,时间从小到大排序
$newest = Redis::zRangeByScore($key, &#39;-inf&#39;, &#39;+inf&#39;, [&#39;limit&#39; => [0, 50]]);
echo &#39;最新上线的用户有:&#39;;
foreach ($newest as $value) {
    echo $value . &#39; &#39;;
}
echo &#39;<br />&#39;;
// 可实现功能四:指定用户是否在线
$username = $client_id;
$online = Redis::zScore($key, $client_id);;
echo $username . ($online ? &#39;在线&#39; : &#39;不在线&#39;) . &#39;<br />&#39;;
// 可实现功能五:昨天和今天都上线的客户
$yestoday = Carbon::yesterday()->toDateString();
$yes_key = str_replace(&#39;-&#39;, &#39;&#39;, $yestoday);
$members = [];
Redis::pipeline(function ($pipe) use ($key, $yes_key, &$members) {
    Redis::zinterstore(&#39;new_key&#39;, [$key, $yes_key], [&#39;aggregate&#39; => &#39;min&#39;]);
    $members = Redis::zRangeByScore(&#39;new_key&#39;, &#39;-inf&#39;, &#39;+inf&#39;, [&#39;limit&#39; => [0, 50]]);
    //dump($members);
});
echo &#39;昨天和今天都上线的用户有:&#39;;
foreach ($members as $value) {
    echo $value . &#39; &#39;;
}

3 Verwenden Sie Hyperloglog für Statistiken

Im Gegensatz zur geordneten Erfassungsmethode spart Hyperloglog sehr viel Platz, aber die von ihm implementierte Funktion ist auch sehr einfach. Es kann nur die Anzahl der Online-Personen zählen und kann keine anderen Funktionen implementieren.

Redis HyperLogLog ist ein Algorithmus für Kardinalitätsstatistiken. Der Vorteil von HyperLogLog besteht darin, dass der zur Berechnung der Kardinalität erforderliche Platz immer fest und sehr klein ist.

In Redis benötigt jeder HyperLogLog-Schlüssel nur 12 KB Speicher, um die Kardinalität von fast 2^64 verschiedenen Elementen zu berechnen. Dies steht in scharfem Gegensatz zu einer Sammlung, die bei der Berechnung der Kardinalität mehr Speicher verbraucht. Je mehr Elemente vorhanden sind, desto mehr Speicher wird verbraucht.

Da HyperLogLog jedoch nur die Kardinalität basierend auf den Eingabeelementen berechnet und die Eingabeelemente nicht selbst speichert, kann HyperLogLog nicht jedes Element der Eingabe wie eine Sammlung zurückgeben.

// note HyperLogLog 只需要知道在线总人数
for ($i=0; $i < 6; $i++) {
    $online_user_num = mt_rand(10000000, 99999999);     //模拟在线人数
    var_dump($online_user_num);
    for ($j=1; $j < $online_user_num; $j++) { 
        $user_id = mt_rand(1, 100000000);
        $redis->pfadd(&#39;002|online_users_day_&#39;.$i, [$user_id]);
    }
}
$count = 0;
for ($i=0; $i < 3; $i++) { 
    $count += $redis->pfcount(&#39;002|online_users_day_&#39;.$i);
    print_r($redis->pfcount(&#39;002|online_users_day_&#39;.$i). "\n");
}
var_dump($count);
//note  3 days total online num
var_dump($redis->pfmerge(&#39;002|online_users_day_both_3&#39;, [&#39;002|online_users_day_0&#39;, &#39;002|online_users_day_1&#39;, &#39;002|online_users_day_2&#39;]));
var_dump($redis->pfcount(&#39;002|online_users_day_both_3&#39;));

Diese Lösung kann nur die Gesamtzahl der Online-Personen in einem bestimmten Zeitraum zählen, kann jedoch nichts mit der Liste der Online-Benutzer tun, spart jedoch Speicherplatz. Wenn nicht viele statistische Datenanforderungen bestehen, können wir dies berücksichtigen Art Plan.

4 Bitmap-Statistiken verwenden

Bitmap verwendet ein Bit, um den Wert oder Status eines Elements darzustellen, und der Schlüssel ist das entsprechende Element selbst. Wir wissen, dass 8 Bits ein Byte bilden können, sodass die Bitmap selbst erheblich Speicherplatz spart.

Bitmap wird häufig für Funktionen wie Benutzer-Check-in, aktive Benutzer, Online-Benutzer usw. verwendet.

Der Code lautet wie folgt

// 模拟当前用户
$uid = request(&#39;uid&#39;);
$key = &#39;online_bitmap_&#39; . date(&#39;Ymd&#39;);
// 设置当前用户在线
Redis::setBit($key, $uid, 1);
// 可实现功能1:在线人数
$c = Redis::bitCount($key);
echo &#39;在线人数:&#39; . $c . &#39;<br />&#39;;
// 可实现功能2:指定用户是否在线
$online = Redis::getBit($key, $uid);
echo $uid . ($online ? &#39;在线&#39; : &#39;不在线&#39;) . &#39;<br />&#39;;
// 可实现功能3:昨天和今天均上线的用户总数
$yestoday = Carbon::yesterday()->toDateString();
$yes_key = str_replace(&#39;-&#39;, &#39;&#39;, $yestoday);
$c = 0;
Redis::pipeline(function ($pipe) use ($key, $yes_key, &$c) {
    Redis::bitOp(&#39;AND&#39;, &#39;yest&#39;, $key, $yes_key);
    $c = Redis::bitCount(&#39;yest&#39;);
});
echo &#39;昨天和今天都上线的用户数量有:&#39; . $c . &#39;<br />&#39;;

Bitmap verbraucht nicht viel Speicherplatz, liefert aber viele statistische Informationen. Diese Lösung ist eine Empfehlung wert.

Empfohlenes Lernen: „PHP-Video-Tutorial

Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung von vier Methoden zum Zählen der Anzahl der Personen, die mit PHP online sind. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:learnku.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen