Idea steht also hinter setInterval und Sockets, setInterval wird in den meisten Browsern unterstützt und Javascript WbsocketApi wird in fast jedem Browser unterstützt.
Kurzübersicht: setInterval () - Dieses Funktionsverhalten folgt, wenn sich Ihr Computer im Ruhezustand / Suspend / Hibernate-Modus befindet, angehalten ist und wenn Sie sich im Wake-Modus befinden, setzt er sich fort.
Der folgende Code führt Folgendes aus: Zuerst (möglicherweise zur gleichen Zeit, aber) startet er php server_socket und lauscht den Verbindungen.
als javascript websocket api sendet aktuelle zeitstempel in unix zeitstempel millisekunden alle 2 sekunden können sie 1 sekunde haben es liegt an dir
nachdem dieser PHP-Server-Socket diese Zeit erhält und prüft, ob er etwas wie die vorherige Zeit zum Vergleichen hat, wenn der Code zum ersten Mal instanziiert wird, hat PHP nichts wie die vorherige Zeit, um ihn mit der Zeit zu vergleichen, die vom Javascript-Websocket gesendet wurde, also PHP tut nichts anderes, als diese Zeit in der Sitzung mit dem Namen 'prev_time' zu speichern und darauf zu warten, dass weitere Zeitdaten vom Javascript-Socket empfangen werden. Hier beginnt also der zweite Zyklus. Wenn der PHP-Server neue Zeitdaten von Javascript WebsocketApi einbindet, prüft er, ob er mit den neu empfangenen Zeitdaten vergleichbar ist. Dies bedeutet, dass der PHP prüft, ob eine Sitzung mit dem Namen 'prev_time' vorhanden ist, wie wir es im zweiten Zyklus feststellen es existiert, ergreift seinen Wert und folgt$diff = $new_time - $prev_time
, $ diff beträgt 2 Sekunden oder 2000 Millisekunden, da unser setInterval-Zyklus alle 2 Sekunden stattfindet und das von uns gesendete Zeitformat in Millisekunden angegeben wird.
Als PHP prüft, if($diff<3000)
ob der Unterschied weniger als 3000 beträgt, wenn bekannt ist, dass der Benutzer aktiv ist. Sie können diese Sekunden wieder nach Belieben bearbeiten. Ich wähle 3000, da eine mögliche Latenz im Netzwerk fast unmöglich ist, aber Sie wissen, dass ich immer vorsichtig bin, wenn Wenn es um Netzwerke geht, fahren wir fort. Wenn PHP feststellt, dass der Benutzer aktiv ist, setzt PHP nur die Sitzung 'prev_time' zurück, deren Wert $new_time
neu empfangen wurde, und sendet zu Testzwecken eine Nachricht an den Javascript-Socket zurück.
aber wenn $diff
es mehr als 3000 ist, bedeutet dies, dass etwas unser setInterval angehalten hat und es nur möglich ist, und ich denke, Sie wissen bereits, was ich sage. In der else
Logik von ( if($diff<3000)
) können Sie Benutzer abmelden, indem Sie eine bestimmte Sitzung zerstören, und wenn Sie Wenn Sie umleiten möchten, können Sie Text an den Javacript-Socket senden und eine Logik erstellen, die window.location = "/login"
je nach Text ausgeführt wird. Hier ist der Code:
Zuerst ist es die Datei index.html, nur um Javascript zu laden:
<html>
<body>
<div id="printer"></div>
<script src="javascript_client_socket.js"></script>
</body>
</html>
dann ist es Javascript, es ist nicht wirklich schön codiert, aber Sie können herausfinden, LESEN SIE KOMMENTARE SIE SIND WICHTIG:
var socket = new WebSocket('ws://localhost:34237'); // connecting to socket
// Open the socket
socket.onopen = function(event) { // detecting when connection is established
setInterval(function(){ //seting interval for 2 seconds
var date = new Date(); //grabing current date
var nowtime = Date.parse(date); // parisng it in miliseconds
var msg = 'I am the client.'; //jsut testing message
// Send an initial message
socket.send(nowtime); //sending the time to php socket
},2000);
};
// Listen for messages
socket.onmessage = function(event) { //print text which will be sent by php socket
console.log('php: ' + event.data);
};
// Listen for socket closes
socket.onclose = function(event) {
console.log('Client notified socket has closed', event);
};
Jetzt ist hier ein Teil des PHP-Codes, keine Sorge, es gibt auch vollständigen Code, aber dieser Teil ist tatsächlich das, was die oben genannten Jobs erledigt. Sie werden auch andere Funktionen erfüllen, aber sie dienen zum Dekodieren und Arbeiten mit Javascript-Sockets, so dass es tatsächlich richtig ist hier LESEN SIE KOMMENTARE SIE SIND WICHTIG:
<?php
$decoded_data = unmask($data /* $data is actual data received from javascript socket */); //grabbing data and unmasking it | unmasking is for javascript sockets don't mind this
print("< ".$decoded_data."\n");
$response = strrev($decoded_data);
$jsTime = (int) $decoded_data; /* time sent by javascript in MILISECONDS IN UNIX FORMAT */
if (isset($_SESSION['prev_time'])) { /** check if we have stored previous time in the session */
$prev_time = (int) $_SESSION['prev_time']; /** grabbing the previous time from session */
$diff = $jsTime-$prev_time; /** getting the difference newly sent time and previous time by subtracting */
print("$jsTime - $prev_time = $diff"); /** printing the difference */
if($diff<3000){ /** checking if difference is less than 3 second if it is it means pc was not at sleep
*** you can manipulate and have for example 1 second = 1000ms */
socket_write($client,encode("You are active! your pc is awakend"));
$_SESSION['prev_time'] = $jsTime; /** saving newly sent time as previous time for future testing whcih will happen in two seconds in our case*/
}else { /** if it is more than 3 seconds it means that javascript setInterval function was paused and resumed after 3 seconds
** So it means that it was at sleep because when your PC is at sleep/suspended/hibernate mode setINterval gets pauesd */
socket_write($client,encode("You are not active! your pc is at sleep"));
$_SESSION['prev_time'] = $jsTime;
}
}else { /** if we have not saved the previous time in session save it */
$_SESSION['prev_time'] = $jsTime;
}
print_r($_SESSION);
?>
Und hier ist der vollständige Code von PHP:
<?php
//Code by: Nabi KAZ <www.nabi.ir>
session_abort();
// set some variables
$host = "127.0.0.1";
$port = 34237;
date_default_timezone_set("UTC");
// don't timeout!
set_time_limit(0);
// create socket
$socket = socket_create(AF_INET, SOCK_STREAM, 0)or die("Could not create socket\n");
// bind socket to port
$result = socket_bind($socket, $host, $port)or die("Could not bind to socket\n");
// start listening for connections
$result = socket_listen($socket, 20)or die("Could not set up socket listener\n");
$flag_handshake = false;
$client = null;
do {
if (!$client) {
// accept incoming connections
// client another socket to handle communication
$client = socket_accept($socket)or die("Could not accept incoming connection\n");
}
$bytes = @socket_recv($client, $data, 2048, 0);
if ($flag_handshake == false) {
if ((int)$bytes == 0)
continue;
//print("Handshaking headers from client: ".$data."\n");
if (handshake($client, $data, $socket)) {
$flag_handshake = true;
}
}
elseif($flag_handshake == true) {
/*
**** Main section for detectin sleep or not **
*/
if ($data != "") {
$decoded_data = unmask($data /* $data is actual data received from javascript socket */); //grabbing data and unmasking it | unmasking is for javascript sockets don't mind this
print("< ".$decoded_data."\n");
$response = strrev($decoded_data);
$jsTime = (int) $decoded_data; /* time sent by javascript in MILISECONDS IN UNIX FORMAT */
if (isset($_SESSION['prev_time'])) { /** check if we have stored previous time in the session */
$prev_time = (int) $_SESSION['prev_time']; /** grabbing the previous time from session */
$diff = $jsTime-$prev_time; /** getting the difference newly sent time and previous time by subtracting */
print("$jsTime - $prev_time = $diff"); /** printing the difference */
if($diff<3000){ /** checking if difference is less than 3 second if it is it means pc was not at sleep
*** you can manipulate and have for example 1 second = 1000ms */
socket_write($client,encode("You are active! your pc is awakend"));
$_SESSION['prev_time'] = $jsTime; /** saving newly sent time as previous time for future testing whcih will happen in two seconds in our case*/
}else { /** if it is more than 3 seconds it means that javascript setInterval function was paused and resumed after 3 seconds
** So it means that it was at sleep because when your PC is at sleep/suspended/hibernate mode setINterval gets pauesd */
socket_write($client,encode("You are not active! your pc is at sleep"));
$_SESSION['prev_time'] = $jsTime;
}
}else { /** if we have not saved the previous time in session save it */
$_SESSION['prev_time'] = $jsTime;
}
print_r($_SESSION);
/*
**** end of Main section for detectin sleep or not **
*/
}
}
} while (true);
// close sockets
socket_close($client);
socket_close($socket);
$client = null;
$flag_handshake = false;
function handshake($client, $headers, $socket) {
if (preg_match("/Sec-WebSocket-Version: (.*)\r\n/", $headers, $match))
$version = $match[1];
else {
print("The client doesn't support WebSocket");
return false;
}
if ($version == 13) {
// Extract header variables
if (preg_match("/GET (.*) HTTP/", $headers, $match))
$root = $match[1];
if (preg_match("/Host: (.*)\r\n/", $headers, $match))
$host = $match[1];
if (preg_match("/Origin: (.*)\r\n/", $headers, $match))
$origin = $match[1];
if (preg_match("/Sec-WebSocket-Key: (.*)\r\n/", $headers, $match))
$key = $match[1];
$acceptKey = $key.'258EAFA5-E914-47DA-95CA-C5AB0DC85B11';
$acceptKey = base64_encode(sha1($acceptKey, true));
$upgrade = "HTTP/1.1 101 Switching Protocols\r\n".
"Upgrade: websocket\r\n".
"Connection: Upgrade\r\n".
"Sec-WebSocket-Accept: $acceptKey".
"\r\n\r\n";
socket_write($client, $upgrade);
return true;
} else {
print("WebSocket version 13 required (the client supports version {$version})");
return false;
}
}
function unmask($payload) {
$length = ord($payload[1]) & 127;
if ($length == 126) {
$masks = substr($payload, 4, 4);
$data = substr($payload, 8);
}
elseif($length == 127) {
$masks = substr($payload, 10, 4);
$data = substr($payload, 14);
}
else {
$masks = substr($payload, 2, 4);
$data = substr($payload, 6);
}
$text = '';
for ($i = 0; $i < strlen($data); ++$i) {
$text .= $data[$i] ^ $masks[$i % 4];
}
return $text;
}
function encode($text) {
// 0x1 text frame (FIN + opcode)
$b1 = 0x80 | (0x1 & 0x0f);
$length = strlen($text);
if ($length <= 125)
$header = pack('CC', $b1, $length);
elseif($length > 125 && $length < 65536)$header = pack('CCS', $b1, 126, $length);
elseif($length >= 65536)
$header = pack('CCN', $b1, 127, $length);
return $header.$text;
}
HINWEIS LESEN SIE ES: Die
$new_time
Variable befindet sich $jsTime
im Code
Erstellen Sie einen Ordner und kopieren Sie diesen und fügen Sie ihn in Dateien ein. Führen Sie den PHP-Socket mit dem folgenden Befehl aus: php -f server_socket.php Gehen Sie zum lokalen Host und testen Sie die geöffnete Konsole, um die Meldungen "Sie sind aktiv" oder "Sie sind nicht aktiv" anzuzeigen. (wenn du aus dem Schlaf kommst); Ihre Ausführung erfolgt, wenn der Benutzer aus dem Ruhezustand kommt, nicht wenn er sich im Ruhezustand befindet, da in diesem Moment alles in der Auslagerungsdatei (Windows) oder im Swap (Linux) zwischengespeichert wird.