function GetXmlHttpObject(handler) {
var objXmlHttp = null;
if (navigator.userAgent.indexOf("MSIE") >= 0) {
var strName = "Msxml2.XMLHTTP";
if (navigator.appVersion.indexOf("MSIE 5.5") >= 0) {
strName = "Microsoft.XMLHTTP";
}
try {
objXmlHttp = new ActiveXObject(strName);
objXmlHttp.onreadystatechange = handler;
return objXmlHttp;
}
catch(e) {
alert("Spiacente, il tuo Browser non supporta chimate Ajax");
return;
}
}
if (navigator.userAgent.indexOf("Mozilla") >= 0) {
objXmlHttp = new XMLHttpRequest();
objXmlHttp.onload = handler;
objXmlHttp.onerror = handler;
return objXmlHttp;
}
}
function keepalive() {
var url = "keep-alive.php";
xmlHttp = GetXmlHttpObject(returnkeepalive);
xmlHttp.open("GET", url, true);
xmlHttp.send(null);
}
function returnkeepalive() {
if (xmlHttp.readyState == 4 || xmlHttp.readyState == "complete") {
var returntext = xmlHttp.responseText;
alert(returntext);
}
}
function init() {
window.setInterval("keepalive()", 1140000); /* 19 minuti esatti */
}
window.onload = init;
Ecco un esempio di file keep-alive.php:<?php
session_start();
session_regenerate_id(TRUE);
header('Content-type: text/html;charset=iso-8859-1');
$chars_cmid = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ12345689';
$length_cmid = 20;
$comment_id = '';
for ($i_cmid = 0; $i_cmid < $length_cmid; $i_cmid++) {
$pos_cmid = mt_rand(0, strlen($chars_cmid) -1);
$comment_id .= substr($chars_cmid, $pos_cmid, 1);
}
$cmid = $comment_id;
if ((!isset($_SESSION['cmid'])) || (empty($_SESSION['cmid']))) {
$_SESSION['cmid'] = $cmid;
$cmid = $_SESSION['cmid'];
} else {
$cmid = $_SESSION['cmid'];
}
$chars_psid = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ12345689';
$length_psid = 20;
$post_id = '';
for ($i_psid = 0; $i_psid < $length_psid; $i_psid++) {
$pos_psid = mt_rand(0, strlen($chars_psid) -1);
$post_id .= substr($chars_psid, $pos_psid, 1);
}
$psid = $post_id;
if ((!isset($_SESSION['psid'])) || (empty($_SESSION['psid']))) {
$_SESSION['psid'] = $psid;
$psid = $_SESSION['psid'];
} else {
$psid = $_SESSION['psid'];
}
echo "Risulti inattivo da oltre 20 minuti e la Sessione ᅵ scaduta.\nAdesso ᅵ stata rigenerata per altri 20 minuti in automatico.\nNon farla scadere nuovamente, grazie e buon proseguimento.";
?>
Come potete notare nell'esempio keep-alive.php rigenero solo delle
sesioni che mi servono come "ticket" per convalidare il post...
ossia se l'utente posta, la sessione viene distrutta cosᅵ se torna
indietro per ripostare un duplicato si ritrova la sessione scaduta e
compare a video un messaggio che lo avverte che la sessione ᅵ
scaduta o che il post ᅵ duplicato e lo rimando nella home del mio
sito (index.php).-- Alessandro Marinuzzi -------------------- http://www.alecos.it --------------------
rispondere al telefono o per girarsi i pollici e si ritrova la sessione scaduta. A questo punto mi sono reinventato la ruota. Ho scritto un pò di Ajax con il quale ho chiamato ogni 19 minuti (un minuto prima che scadano le sessioni = 20 minuti) un file php che ho chiamato keep-alive.php. Lo scenario: l'utente fa scadere la sessione per inattività e in automatico dopo 19
Il 11/10/2012 08:25, Alessandro Marinuzzi ha scritto:
rispondere al telefono o per girarsi i pollici e si ritrova la sessione scaduta. A questo punto mi sono reinventato la ruota. Ho scritto un pò di Ajax con il quale ho chiamato ogni 19 minuti (un minuto prima che scadano le sessioni = 20 minuti) un file php che ho chiamato keep-alive.php. Lo scenario: l'utente fa scadere la sessione per inattività e in automatico dopo 19
Dal phpinfo di aruba:
session.gc_maxlifetime 1440 1440
1440/60=24 minuti.lo so ma da me sono 1200 effettivi mentre nominali sono 1440????
In realtà la sessione viene fisicamente eliminata in un momento successivo, che dipende dal numero di accessi al sito e dai valori session.gc_probability e session.gc_divisor.
Una riga di php:
ini_set('session.gc_maxlifetime',8*60*60);
Sessione di 8 ore lavorative, sperando che l'utente non si giri i pollici per 8 ore...
testato su aruba, funzionante da alcuni anni.
ciao
Marcello
--
Hai ricevuto questo messaggio perché sei iscritto al gruppo "zb-php-it" di Google Gruppi.
Per postare messaggi in questo gruppo, invia un'email a zb-p...@googlegroups.com.
Per annullare l'iscrizione a questo gruppo, invia un'email a zb-php-it+...@googlegroups.com.
Per ulteriori opzioni, visita il gruppo all'indirizzo http://groups.google.com/group/zb-php-it?hl=it.
La butto li perchè è da anni che non uso aruba, ma hai controllato anche il tempo di vita del cookie che conserva il session_id?
| session.auto_start | Off | Off |
| session.bug_compat_42 | On | On |
| session.bug_compat_warn | On | On |
| session.cache_expire | 180 | 180 |
| session.cache_limiter | nocache | nocache |
| session.cookie_domain | no value | no value |
| session.cookie_lifetime | 0 | 0 |
| session.cookie_path | / | / |
| session.cookie_secure | Off | Off |
| session.entropy_file | no value | no value |
| session.entropy_length | 0 | 0 |
| session.gc_divisor | 100 | 100 |
| session.gc_maxlifetime | 1440 | 1440 |
| session.gc_probability | 1 | 1 |
| session.name | PHPSESSID | PHPSESSID |
| session.referer_check | no value | no value |
| session.save_handler | files | files |
| session.save_path | /tmp | /tmp |
| session.serialize_handler | php | php |
| session.use_cookies | On | On |
| session.use_only_cookies | Off | Off |
| session.use_trans_sid | Off | Off |
Ciao--
Giovanni Battista Lenoci - Ueppy Technical Manager
Via Piedo 58, 23020 Tresivio (SO)
+39 347 7196482
gia...@ueppy.com - http://www.ueppy.com/
--
Hai ricevuto questo messaggio perché sei iscritto al gruppo "zb-php-it" di Google Gruppi.
Per postare messaggi in questo gruppo, invia un'email a zb-p...@googlegroups.com.
Per annullare l'iscrizione a questo gruppo, invia un'email a zb-php-it+...@googlegroups.com.
Per ulteriori opzioni, visita il gruppo all'indirizzo http://groups.google.com/group/zb-php-it?hl=it.
La butto li perchè è da anni che non uso aruba, ma hai controllato anche il tempo di vita del cookie che conserva il session_id?
Ciao--
Giovanni Battista Lenoci - Ueppy Technical Manager
Via Piedo 58, 23020 Tresivio (SO)
+39 347 7196482
gia...@ueppy.com - http://www.ueppy.com/
--
Hai ricevuto questo messaggio perché sei iscritto al gruppo "zb-php-it" di Google Gruppi.
Per postare messaggi in questo gruppo, invia un'email a zb-p...@googlegroups.com.
Per annullare l'iscrizione a questo gruppo, invia un'email a zb-php-it+...@googlegroups.com.
Per ulteriori opzioni, visita il gruppo all'indirizzo http://groups.google.com/group/zb-php-it?hl=it.
| session.gc_divisor | 100 | 100 |
| session.gc_probability | 1 | 1 |
Ragazzi! Non so perché ma adesso aruba mi permette di sovrascrivere la durata di sessione :-)
Non capisco perché prima non funzionava e oggi si... che Aruba abbia qualche problema di memoria per cui si scorda che la sessione è impostata a 86400 * 5 ? :-P La sessione è rimasta in piedi per 40 minuti senza scadere...
ini_set('session.gc_maxlifetime', 86400 * 5);
session_start();
Funziona... mi viene da chiedermi perché prima non funzionava lo stesso identico codice e adesso funziona... assurdo!!! >:o
Comunque adesso lascio la sessione attiva per tutto il giorno e vedo se è scaduta... cmq se ha superato tranquillamente i 40 minuti direi che il problema è risolto, poi i misteri del perché prima non funzionava e adesso si rimarrà come il terzo segreto di Fatima :-P
Grazie a tutti :-)
sei sicuro che sia così? controlla con un echo ini_get('session.gc_maxlifetime');
può essere che la sessione resti su anche per più del tempo stabilito nel session.gc_maxlifetime perchè il garbage collector non è detto che passi essendo probabilistico
session.gc_divisor 100 100 session.gc_probability 1 1
da come è impostato hai la probabilita di 1/100 che il garbage collector passi a buttare le sessioni scadute, il che si traduce che passa 1 volta ogni 100 pageview
se vuoi essere certo dovresti impostare il gc_probability = gc_divisor avendo così il garbage collector che passa ad ogni pageview, occhio però che se il sito è molto visitato potresti uccidere i dischi
ini_set('session.gc_maxlifetime', 86400 * 5);
ini_set('session.gc_probability', 1);
ini_set('session.gc_divisor', 1);
ini_set('memory_limit', '-1');
ini_set('register_globals', 0);
ini_set('max_execution_time', 0);
session_start();
quando l'utente termina di postare e conferma il commento elimino il cookie con//=======================================// // Commento unico con ID di 20 caratteri // //=======================================// $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ12345689'; $length = 20; $comment_id = ''; for ($i = 0; $i < $length; $i++) { $pos = mt_rand(0, strlen($chars) -1); $comment_id .= substr($chars, $pos, 1); } $cmid = $comment_id;//============================================================// // Invio un cookie affinché il commento non sia duplicato // //============================================================// if ((!isset($_COOKIE['cmid'])) || (empty($_COOKIE['cmid']))) { setcookie('cmid', $cmid); $_COOKIE['cmid'] = $cmid; $cmid = $_COOKIE['cmid']; } else { $cmid = $_COOKIE['cmid']; }
Poi se l'utente re-inviare il commento producendo un duplicato dello stesso opero questo controllo//===============================// // Distruggo Sessioni e Cookie // //===============================// setcookie('cmid'); session_destroy();
//============================================================//
// Verifico che il commento non sia duplicato //
//============================================================//
if ((!isset($_COOKIE['cmid'])) || (empty($_COOKIE['cmid']))) {
include("double_commenti.php");
exit();
}
Se il cookie è settato ed esiste allora non ha ancora postato, se
invece il cookie non esiste perché confermando il commento è stato
cancellato allora gli presento una pagina di errore che reindirizza
l'utenze sulla root del mio sito (index.php)setcookie('cmid');
così è cancellato senza dover aggiungere date passate o altro...