Açık Oturumların Numarası Bul

4 Cevap php

Kullanıcıların bir web sitesinde aktif olan kaç listeleme kolay (hiçbir veritabanı) yöntemi için arıyorum. Ben kadar gelebilir kolay yolu açık oturumların sayısını sayarak gereğidir.

Bu kod should work:

$number_of_users = count(scandir(ini_get("session.save_path")));

Tabii ki (olması gerektiği gibi!) Olmaz, çünkü bu dizinin üzerinde güvenlik kısıtlamaları. Herkes dizin izinlerini değiştirmeden bu sayıyı ulaşmak için başka bir yol biliyor mu.

Note: Ben bir seçenek arıyorsanız o does not involve databases veya PHP oturumlarında güvenliğini azaltarak ediyorum.

End Note: Bu soruya gelen herkes için, ben benzer bir şey yaptım kökünden (Her dakika çalıştıran) bir cronjob kullanarak sona erdi:

ls /var/lib/php5/ | wc -l > /var/www/sessioncount

/var/www/sessioncount dosya apache kullanıcı tarafından okunabilir olduğundan emin olun. Sonra sadece PHP dosyayı okuyabilir:

$number_of_users = file_get_contents("/var/www/sessioncount");

4 Cevap

Kolay bu durumda bir veri tabanı anlamına gelmez. Ayrıca aktif olan kaç kullanıcı görmek oturuma dayanarak güvenilir değildir.

Eğer bu yolu gitmek istedim, PHP okur güvenli bir sürecin her birkaç dakikada tarafından işletilen ve bir dosya veya db içine sayılmasını kaydeder bir cronjob, yapabilirdi.

Ama veritabanı rota gidiş öneririz.

Burada, herkes için bu çözme uğruna. Sipariş kodu monte ve yolda yönergeleri kullanabilirsiniz. PHP'nin GD uzantısı gerektirir.

Webroot bir dizin yapmak, web cini ona yazabilirsiniz emin olun:

mkdir liveusers

Create bir PHP komut dosyası (vlive.php örneğin) touch Kodu (temasa btw. standart sistemi (), passthru (kullanmak, * nix komut için ) veya exec () bunu kullanmak gibi hissediyorum ne olursa olsun). O touch benzersiz bir dosya adı ile bu dizinde bir dosya, örneğin IP + OturumNo birlikte concat'd var:

<?php 
exec("touch ". $_SERVER['DOCUMENT_ROOT']."/liveusers/". md5($_SERVER['REMOTE_ADDR'].session_id()));

Şimdi de same file biz () 's I pixel.jpg Webroot /images/ directory içine adında bir 1x1 piksel koymak çıkışına uygun başlığı ile bir JPEG bitirmek kapalı gerekir , başka bir şey yapmak için çekinmeyin:

$NewImage = imagecreatefromjpeg($_SERVER['DOCUMENT_ROOT']. "/images/pixel.jpg");
header("Content-type: image/jpeg");
imagejpeg($NewImage);
?>

PHP dosyayı kaydedin, sonra yararlıdır almak için belgeye standart bir HTML etiketini yerleştirin:

<img src="/vlive.php" alt="Imagination!" />

Bu daha sonra önbelleğe sayfaları ile saf PHP gitmek sadece bu kadar canlı kullanıcı dosyaları ancak şimdiye kadar touch 'd olsun yapacaktır. Bunu yaparak yine "canlı" kullanıcıları saymak ve sitenizde bir tam sayfa önbellek sistemi kullanın.

Onlar da diğer sayfaları ziyaret ediyorsanız Tamam şimdi her sayfasında bir ziyaretçi, yüklerin kendi benzersiz bir dosya dokunur, bu yüzden sadece son zamanlarda dokunmatik komutunu gelen eğer bu kullanıcı için bir dosya yaratacaktır, bu {aynı ile erişim tarihini düzenlemek olacaktır [(0)]} komutu.

Yararlı olur budur:

Farklı bir PHP komut dosyası (diyelim readvlive.php):

<?php 
$livenum = system("find ".$_SERVER['DOCUMENT_ROOT']."/liveusers/ -type f -amin +10 | wc -l");
echo "Live Visitors: ". $livenum;
?>

Şimdi sen onu görmek istiyorum HTML öğesi içine bu pasajını içerecek edelim:

<?php include($_SERVER['DOCUMENT_ROOT']. "/readvlive.php"); ?>

Ok şimdi biz sadece 10 dakika önce değişti erişim süresine sahip benzersiz dosya sayısına yazdırmak olacak bir dosya var. Bu son on dakika içinde canlı kullanıcıları ...

Eğer oldukça can sıkıcı ve işe yaramaz hale böylece bu belgelerin içine önbelleğe canlı numarasını donabilir tam sayfa önbelleği kullanmak Şimdi eğer biz burada, yine bir seçim var. Bunun için ben PrototypeJS (Google it) önermek, Sen <head></head> arasındaki bu yer, kendi fantezi AJAX araçlarını kullanmak

<script src="/js/prototype.js" type="text/javascript"></script>

sonra </body> etiketi üzerinde bu yerleştirin.

<span id="live_users_count">&nbsp;</span>


<script type="text/javascript">
    <!--
    Event.observe(window, 'load', function() {
        if($('live_users_count')) {
            new Ajax.Updater('live_users_count','/readvlive.php'); 
        }
   }
-->
</script>

Should be fine.. not too rough. If you're concerned with how much your directory is gonna be running that find command, you could use APC or something to cache it. This example requires APC 3.1.4:

<?php
if(apc_exists('livenum')){
    $livenum = apc_fetch('livenum');echo $livenum;
} else {
    $livenum = system("find ".$_SERVER['DOCUMENT_ROOT']."/liveusers/ -type f -amin +10 | wc -l");
    apc_add('livenum',$livenum,30); 
}
?>

APC 3.0.13 ve yukarı:

<?php
if($livenum = apc_fetch('livenum')){
    echo $livenum;
} else {
    $livenum = system("find ".$_SERVER['DOCUMENT_ROOT']."/liveusers/ -type f -amin +10 | wc -l");
    apc_add('livenum',$livenum,30); 
}
?>

Bu canlı kullanıcıların son 10 dakikaları gösteren 30 saniye boyunca APC önbelleğe kullanacak, dakikada iki kez hesaplamak için komut bulmak çalışacaktır. Fena değil. : P

Clean up crontab ile yapılabilir ..

Betik (/root/deloverhead.sh):

#!/bin/sh
find "/path/to/liveusers/ -type f -amin +60 -exec rm {} \;

Crontab girdisi (her saat):

0 * * * * /root/deloverhead.sh >/dev/null 2>&1

Eğlenin, üzgünüm Garip şeyler açıklayabilir. : P

Eğer bir güvenlik riski poz olmadan bir PHP komut dosyası bu dizine erişemiyor.

Ne istediğinizi elde etmek için en kolay yolu, bir veritabanını kullanıyor. Sadece ip ve zaman damgası depolamak ve daha sonra web sitenizde aktif kullanıcı sayısını almak için zaman damgası dayanan SEÇ.

Dosya sistemi üzerinden daha oturumları erişmek için başka bir yol var mı?