Jadi Ide ada di belakang setInterval dan Soket, setInterval didukung di sebagian besar browser dan javascript WbsocketApi didukung di hampir setiap browser.
Gambaran singkat: setInterval () - perilaku fungsi ini mengikuti saat komputer Anda dalam mode sleep / suspended / hibernate, ia dijeda dan ketika Anda berada dalam mode bangun, ia melanjutkan sendiri.
Kode berikut melakukan hal berikut, pada awalnya (mungkin pada saat yang sama tetapi) mulai php server_socket mendengarkan koneksi,
daripada javascript websocket api mengirimkan timestamp saat ini di milix detik Unix cap timestamp dalam setiap 2 detik Anda dapat memiliki 1 detik terserah Anda.
setelah itu soket server php mendapatkan waktu ini dan memeriksa apakah ia memiliki sesuatu seperti waktu sebelumnya untuk membandingkan, ketika kode pertama kali instantiated php tidak memiliki apa pun seperti waktu sebelumnya untuk membandingkannya dengan waktu yang dikirim dari javascript websocket, jadi php tidak melakukan apa-apa selain menghemat waktu ini dalam sesi yang disebut 'prev_time' dan menunggu data waktu lain yang akan diterima dari soket javascript, jadi di sini dimulai siklus kedua. ketika server php melakukan socket data waktu baru dari javascript WebsocketApi, ia memeriksa apakah ada waktu seperti waktu sebelumnya untuk membandingkan dengan data waktu yang baru diterima ini, itu berarti bahwa php memeriksa apakah ada sesi yang disebut 'prev_time', karena kami berada di siklus kedua php menemukan itu ada, meraih nilainya dan mengikuti$diff = $new_time - $prev_time
, $ diff akan menjadi 2 detik atau 2000 milidetik karena ingat siklus setInterval kami terjadi dalam setiap 2 detik dan format waktu yang kami kirim dalam milidetik,
daripada memeriksa php if($diff<3000)
jika perbedaannya kurang dari 3000 jika ia mengetahui bahwa pengguna aktif, sekali lagi Anda dapat memanipulasi detik ini seperti yang Anda inginkan, saya memilih 3000 karena kemungkinan latensi dalam jaringan yang hampir tidak mungkin tetapi Anda tahu saya selalu berhati-hati ketika datang ke jaringan, jadi mari kita lanjutkan, ketika php menentukan bahwa pengguna aktif php hanya me-reset sesi 'prev_time' dengan nilai $new_time
yang baru saja diterima dan hanya untuk tujuan pengujian ia mengirim pesan kembali ke soket javascript,
tetapi jika $diff
lebih dari 3000 itu berarti bahwa sesuatu menghentikan setInterval kami dan hanya ada cara itu bisa terjadi dan saya pikir Anda sudah tahu apa yang saya katakan, jadi dalam else
logika ( if($diff<3000)
) Anda dapat logout pengguna dengan menghancurkan sesi tertentu dan jika Anda ingin mengarahkan Anda dapat mengirim beberapa teks ke soket javacript dan membuat logika yang akan dijalankan window.location = "/login"
tergantung pada teks, itu dia di sini adalah kode:
Pertama adalah file index.html hanya untuk memuat javascript:
<html>
<body>
<div id="printer"></div>
<script src="javascript_client_socket.js"></script>
</body>
</html>
maka itu javascript itu tidak benar-benar kode indah tetapi Anda dapat mengetahui KOMENTAR BACA MEREKA PENTING:
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);
};
sekarang di sini adalah bagian dari kode php, jangan khawatir di bawah ada kode lengkap juga tetapi bagian ini sebenarnya apa pekerjaan yang disebutkan di atas Anda akan memenuhi fungsi-fungsi lain juga, tetapi mereka untuk decoding dan bekerja dengan soket javascript sehingga hal yang sebenarnya benar di sini BACA KOMENTAR MEREKA PENTING:
<?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);
?>
Dan di sini adalah kode lengkap dari 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;
}
CATATAN BACA TI:
$new_time
variabel $jsTime
dalam Kode
buat folder dan cukup salin dan tempel ini dalam file yang menjalankan soket php dengan perintah: php -f server_socket.php pergi ke localhost dan mengujinya konsol terbuka untuk melihat pesan itu akan mengatakan "Anda aktif" atau "Anda tidak aktif" (ketika Anda datang dari tidur); executin Anda akan terjadi ketika pengguna akan datang dari tidur bukan ketika mereka tidur karena pada saat itu semuanya di-cache di pagefile (windows) atau di swap (linux)