সুতরাং আইডিয়া সেটআইন্টারওয়াল এবং সকেটগুলির পিছনে রয়েছে, সেট ইনটার্ভাল বেশিরভাগ ব্রাউজারে সমর্থিত এবং জাভাস্ক্রিপ্ট WbsketApi প্রায় প্রতিটি ব্রাউজারে সমর্থিত।
সংক্ষিপ্ত ওভারভিউ: সেটইন্টারওয়াল () - আপনার কম্পিউটারটি যখন স্লিপ / সাসপেন্ড / হাইবারনেট মোডে থাকে তখন এটিকে বিরতি দেওয়া হয় এবং আপনি যখন জাগ্রত মোডে থাকেন তখন এটি আবার শুরু হয়।
নিম্নলিখিত কোডটি নিম্নলিখিতটি করে, প্রথমে (সম্ভবত একই সময়ে তবে) এটি পিএইচপি সার্ভার_সোকেট সংযোগগুলি শোনার শুরু করে,
জাভাস্ক্রিপ্টের চেয়ে ওয়েবসকেট এপিআই ইউনিক্স টাইমস্ট্যাম্প মিলিসেকেন্ডগুলিতে প্রতি 2 সেকেন্ডে বর্তমান টাইমস্ট্যাম্প প্রেরণ করে আপনি 1 সেকেন্ডে এটি আপ করতে পারেন।
পিএইচপি সার্ভারের সকেটটি এবার পাওয়ার পরে এবং তার সাথে তুলনা করার মতো আগের সময়ের মতো কিছু আছে কিনা তা যাচাই করে, যখন কোডটি প্রথম ইনস্ট্যান্ট হয় পিএইচপি এর সাথে জাভাস্ক্রিপ্ট ওয়েবসকেট থেকে প্রেরিত সময়ের সাথে তুলনা করার জন্য আগের সময়ের মতো কিছু নেই, তাই পিএইচপি 'prev_Time' নামক অধিবেশনটিতে এবার সময় সাশ্রয় ছাড়া কিছুই করে না এবং জাভাস্ক্রিপ্ট সকেট থেকে অন্য সময়ের ডেটা পুনরুদ্ধারের জন্য অপেক্ষা করে, সুতরাং এখানে দ্বিতীয় চক্র শুরু হয়। যখন জাভাস্ক্রিপ্ট ওয়েবসাইটসকপি থেকে পিএইচপি সার্ভার সকেট নতুন সময়ের ডেটা পরীক্ষা করে এটি এই নতুন প্রাপ্ত সময়ের ডেটার সাথে তুলনা করার জন্য আগের সময়ের মতো কিছু আছে তা পরীক্ষা করে, এর অর্থ পিএইচপি চেক করে যে 'অ্যাড-টাইম' নামক সেশনটি উপস্থিত রয়েছে, কারণ আমরা দ্বিতীয় চক্রের পিএইচপি আবিষ্কার করি যে এটি বিদ্যমান, এটির মান ধরে এবং নিম্নলিখিতগুলি করে$diff = $new_time - $prev_time
, f পার্থক্যটি 2 সেকেন্ড বা 2000 মিলিয়ন সেকেন্ডের হবে কারণ আমাদের সেট ইন্টার্নাল চক্রটি প্রতি 2 সেকেন্ডে ঘটে এবং সময় ফর্ম্যাটটি আমরা পাঠাচ্ছি এটি মিলিসেকেন্ডে হয়,
পিএইচপি চেক করার চেয়ে if($diff<3000)
যদি পার্থক্যটি 3000 এর চেয়ে কম হয় তবে যদি এটি জানা থাকে যে ব্যবহারকারী সক্রিয় আছেন, আবার আপনি আপনার ইচ্ছামতো এই সেকেন্ডে ম্যানিপুলেট করতে পারেন, আমি 3000 বেছে নিই কারণ নেটওয়ার্কে সম্ভাব্য বিলম্বিতা যা প্রায় অসম্ভব তবে আপনি জানেন আমি যখন সর্বদা সতর্ক থাকি এটি নেটওয়ার্কগুলিতে আসে, সুতরাং চলুন, যখন পিএইচপি নির্ধারণ করে যে ব্যবহারকারী সক্রিয় রয়েছে পিএইচপি কেবলমাত্র 'পূর্ব_কালীন' সেশনটি পুনরায় সেট করে $new_time
যার মান নতুনভাবে প্রাপ্ত হয়েছিল এবং কেবল পরীক্ষার উদ্দেশ্যে এটি জাভাস্ক্রিপ্ট সকেটে বার্তা প্রেরণ করে,
তবে যদি $diff
3000 এর বেশি হয় তবে এর অর্থ এই যে কোনও কিছু আমাদের সেট ইনটারওয়ালকে বিরতি দিয়েছে এবং এটি ঘটতে পারে এমন একমাত্র উপায় আছে এবং আমি মনে করি আপনি ইতিমধ্যে জানেন যা আমি বলছি তাই else
, ( if($diff<3000)
) এর যুক্তিতে আপনি নির্দিষ্ট সেশনটি ধ্বংস করে ব্যবহারকারীকে লগআউট করতে পারেন এবং যদি আপনি আপনাকে জাভাক্রিপ সকেটে কিছু পাঠ্য প্রেরণ করতে এবং পাঠ্যের window.location = "/login"
উপর নির্ভর করে একটি যুক্তি তৈরি করতে পারেন যা এখানে কোড:
প্রথমে এটি জাভাস্ক্রিপ্ট লোড করার জন্য সূচিপত্রের HTML ফাইল file
<html>
<body>
<div id="printer"></div>
<script src="javascript_client_socket.js"></script>
</body>
</html>
তারপরে এটি জাভাস্ক্রিপ্ট যা সত্যই সুন্দরভাবে কোড করা হয়নি তবে আপনি গুরুত্বপূর্ণ মন্তব্যগুলি পড়তে পারেন তা বুঝতে পারেন:
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);
};
এখন এখানে পিএইচপি কোডের একটি অংশ রয়েছে, পুরো কোড রয়েছে তা ভেবে চিন্তিত হবেন না তবে এই অংশটি হ'ল উপরে বর্ণিত কাজগুলি আপনি অন্যান্য ফাংশনগুলিতেও মিলিত হবেন তবে তারা জাভাস্ক্রিপ্ট সকেটগুলি ডিকোডিং এবং কাজ করার জন্য তাই এটি আসল জিনিসটি সঠিক right এখানে গুরুত্বপূর্ণ মন্তব্যগুলি পড়ুন তারা গুরুত্বপূর্ণ:
<?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);
?>
এবং এখানে পিএইচপি এর পুরো কোডটি রয়েছে:
<?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;
}
দ্রষ্টব্য এটি পড়ুন:
$new_time
পরিবর্তনশীল $jsTime
কোড হয়
ফোল্ডারটি তৈরি করুন এবং পিএইচপি সকেটটি কমান্ডের সাহায্যে চালানো ফাইলগুলিতে এটি অনুলিপি করুন এবং পেস্ট করুন: পিএইচপি -f সার্ভার_সকেট.এফপি লোকালহোস্টে যান এবং বার্তাটি দেখতে এটি খোলা কনসোলটি পরীক্ষা করুন এটি "আপনি সক্রিয়" বা "আপনি সক্রিয় নন" বলবে (আপনি যখন ঘুম থেকে আসেন); আপনার এক্সিকিউটিনটি ঘটবে যখন ব্যবহারকারীরা ঘুম থেকে আসবেন না যখন তারা যখন ঘুমের কারণ হয় সেই মুহুর্তে পেজফাইলে (উইন্ডোজ) বা অদলবদল (লিনাক্স) এ সমস্ত কিছু ক্যাশে থাকে