PDA

View Full Version : پاسخ سرور در آن واحد به همه کلاینت ها



iranme
دوشنبه 18 بهمن 1389, 14:03 عصر
سلام،
نمی دونستم این سوال رو کجا بپرسم ولی چون یه جورایی به آژاکس ربط داره اینجا مطرح کردم.
آیا امکانش هست که اگر یکی از کاربران سایت تغییری را در یک متن داد و در پایگاه داده ذخیره شد بلافاصله برای تمام کاربرانی که اون متن را دارن نگاه میکنند تغییر کنه!؟ بدون اینکه صفحه refresh بشه.
و البته نمیخوام از تایمر هم استفاده کنم (مثلا هر 1 دقیقه چک بشه!) چون معلوم نیست که کی اون متن تغییر میکند!
ممنون میشم راهنمایی کنید.
البته اگه مبهم هست بگید تا بیشتر توضیح بدم.

hossin.esm
دوشنبه 18 بهمن 1389, 14:50 عصر
فکر نکنم راه دیگری باشه .
شما باید با تایمر مثلا هر 20 ثانیه تغییرات را چک کنید اگر تغییرات وجود داشت اون را به کاربر نمایش بدید(نیاز به رفرش هم نیست.)

hossin.esm
دوشنبه 18 بهمن 1389, 15:06 عصر
فکر نکنم راه دیگری باشه .
شما باید با تایمر مثلا هر 20 ثانیه تغییرات را چک کنید اگر تغییرات وجود داشت اون را به کاربر نمایش بدید(نیاز به رفرش هم نیست.)

iranme
دوشنبه 18 بهمن 1389, 16:44 عصر
خب آخه معلوم نیست این تغییر کی پیش بیاد. ممکن هست هر ثانیه تغییر بکنه و یا ممکن هست اصلا در مدت 5 دقیقه هیچ تغییری بوجود نیاد!
در ضمن اگر قرار باشه از تایمر هم استفاده کنم میخوام برای همه دقیقا در یک زمان خاص صفحه عوض بشه، به عبارتی منطبق بر ساعت سرور باشه. یعنی اگه به فرض قرار هست هر 20 ثانیه چک بشود و کاربری وارد صفحه بشود و 5 ثانیه پیش چک شده باشد دقیقا 15 ثانیه بعد برای این شخص چک بشود (نه همون 20 ثانیه پیش فرض). آیا چنین چیزی امکانش هست؟
یه نکته هم اینکه میخوام با php بنویسم.

hossin.esm
دوشنبه 18 بهمن 1389, 18:06 عصر
بله و ممکن هست ساعت ها هیچ تغییری رخ ندهد.
در رابطه با همزمان سازی میشه این کار را انجام داد .
میشه زمان اولیه را در سرور ذخیره کرد و زمان رفرش بعدی را محاسبه کرد
و زمان اولیه تایمر را توسط سرور تنظیم کرد ولی خوب شاید دقیق دقیق زمان کلاینت ها همزمان نشود و احتلاف کمی داشته باشد.

و اصل الگوریتم هست و زبان برنامه نویسی مهم نیست.

iranme
دوشنبه 18 بهمن 1389, 18:52 عصر
در مورد اینکه گفتید بله و ممکن است .... خب یعنی میشه کاری کرد که از تایمر استفاده نکرد و متوجه تغییر شد؟
این چیزی که گفتید (تنظیم زمان از سرور) رو چه طوری میتونم پیاده سازی کنم!؟

hossin.esm
دوشنبه 18 بهمن 1389, 21:08 عصر
نه منظورم این بود که زمان تغییرات معلوم نیست
این هم یک مثال
زمان حلقه یا تایمر هم 20 ثانیه هست.
index.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<?php
$con = mysql_connect("localhost","root","");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db("change", $con);
$result = mysql_query("SELECT * FROM time");
if($row = mysql_fetch_array($result))
{

$base_time =$row['base_time'];


}

mysql_close($con);
$time=time()-$base_time;
$time= $time%20;
$time=20-$time;
echo $time;
echo "<br />";

?>

<script type="text/javascript">
var time=<?php echo $time; ?>;
time=time*1000;
setTimeout("loadXMLDoc()",time);
function loadXMLDoc()
{

var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;

}
}
xmlhttp.open("GET","change.php",true);
xmlhttp.send();
setTimeout("loadXMLDoc()",20000);

}
</script>
</head>
<body>
<div id="myDiv"> </div>
</body>
</html>


change.php


<?php
header("Cache-Control: no-cache");
header("Pragma: no-cache");
echo time();
?>







دیتابیس

-- phpMyAdmin SQL Dump
-- version 3.2.0.1
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: Feb 07, 2011 at 06:01 PM
-- Server version: 5.1.36
-- PHP Version: 5.3.0
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
--
-- Database: `change`
--
-- --------------------------------------------------------
--
-- Table structure for table `time`
--
CREATE TABLE IF NOT EXISTS `time` (
`base_time` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Dumping data for table `time`
--
INSERT INTO `time` (`base_time`) VALUES
(1297098561);

کد بالا ممکن هست بعد از گذشت مدتی زمان ها اختلاف پیدا کنند.
برای همزمانی دقیق تر هم میتونید در هر با ارتباط با سرور زمان را دو باره تنظیم کنید.

iranme
دوشنبه 18 بهمن 1389, 21:58 عصر
خیلی ممنون. راستی تو IE کار نمیکنه ولی تو FF و Chrome کار میکنه.

لطف کردید ولی میشه یک توضیح هم در مورد اینها بدید!؟
1- میشه در مورد این خط ها توضیح بدید که چه کاری انجام میده:



$time=time()-$base_time;
$time= $time%20;
$time=20-$time;
echo $time;


2- در جاوا اسکریپت تو این خط چرا time در 1000 ضرب شده؟


time=time*1000;

3- تو دیتابیس چرا مقدار 1297098561 انتخاب شده؟



ببخشید سوالاتم زیاد شد. یکمی تازه کارم!

iranme
دوشنبه 18 بهمن 1389, 22:11 عصر
یک مشکل دیگه هم پیدا کردم!
میشه اون ثانیه شمار رو هم که گذاشتین به صورت معکوس هر 1 ثانیه تغییر بکنه!؟

hossin.esm
دوشنبه 18 بهمن 1389, 22:44 عصر
خیلی ممنون. راستی تو IE کار نمیکنه ولی تو FF و Chrome کار میکنه.

لطف کردید ولی میشه یک توضیح هم در مورد اینها بدید!؟
1- میشه در مورد این خط ها توضیح بدید که چه کاری انجام میده:



[PHP]
$time=time()-$base_time;





$time= $time%20;
$time=20-$time;
echo $time;


من با IE8 تست کردم جواب داد

<DIV align=left>
$time=time()-$base_time;
$time= $time%20;
$time=20-$time;
echo $time;


$base_time زمان پایه هست که میتونه زمان گذشته تا حال باشه و یکبار در دیتابیس ذخیره میشه.
time() زمان جاری سیستم را بر میگرداند. اختلاف این دو میشه زمان گذشته شده از شروع به کار.
$time= $time%20; % برای بدست آوردن باقیمانده استفاده شده (یعنی زمان گذشته شده از اخرین زمان رفرش) که اگر از 20 کم کنیم میشه زمان باقیمانده تا رفرش بعدی.







2- در جاوا اسکریپت تو این خط چرا time در 1000 ضرب شده؟



time=time*1000;




چون زمان بر حسب میلی ثانیه هست



3- تو دیتابیس چرا مقدار 1297098561 انتخاب شده؟




زمان پایه هست که میتونه زمان گذشته تا حال باشه و یکبار در دیتابیس ذخیره میشه.






ببخشید سوالاتم زیاد شد. یکمی تازه کارم!







خواهش میکنم.

hossin.esm
دوشنبه 18 بهمن 1389, 23:14 عصر
یک مشکل دیگه هم پیدا کردم!
میشه اون ثانیه شمار رو هم که گذاشتین به صورت معکوس هر 1 ثانیه تغییر بکنه!؟

index.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<?php
$con = mysql_connect("localhost","root","");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db("change", $con);
$result = mysql_query("SELECT * FROM time");
if($row = mysql_fetch_array($result))
{

$base_time =$row['base_time'];


}

mysql_close($con);
$time=time()-$base_time;
$time= $time%20;
$time=20-$time;


?>

<script type="text/javascript">
var time=<?php echo $time; ?>;
counter(time);
time=time*1000;
setTimeout("loadXMLDoc()",time);
function loadXMLDoc()
{

var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;

}
}
xmlhttp.open("GET","change.php",true);
xmlhttp.send();
setTimeout("loadXMLDoc()",20000);

}
function counter(t)
{
t--;
if(t<=0)
{
t=20;
}
if(document.getElementById("con"))
{
document.getElementById("con").innerHTML =t;
}
setTimeout("counter("+t+")",1000);
}

</script>
</head>
<body>
<div id="con"><?php echo $time; ?> </div>
<div id="myDiv"> </div>
</body>
</html>

زمان شمارنده خیلی واقعی نیست و باید روش کار بشه.

iranme
سه شنبه 19 بهمن 1389, 01:38 صبح
دوست عزیز خیلی لطف کردید. ممنون از راهنماییتون.
ولی متاسفانه من base_time یا همون عدد را متوجه نشدم! یعنی چی زمان گذشته تا حال؟ منظور از گذشته چیه؟ اصلا این عدد را شما چجوری بدست آوردید که مقدارش این شده؟ و من چطوری می تونم خودم زمان گذشته را بدست بیارم!؟

hossin.esm
سه شنبه 19 بهمن 1389, 09:11 صبح
دوست عزیز خیلی لطف کردید. ممنون از راهنماییتون.
ولی متاسفانه من base_time یا همون عدد را متوجه نشدم! یعنی چی زمان گذشته تا حال؟ منظور از گذشته چیه؟ اصلا این عدد را شما چجوری بدست آوردید که مقدارش این شده؟ و من چطوری می تونم خودم زمان گذشته را بدست بیارم!؟
این زمان زمان شروع کار هست که میتونید با تابع ()time توی php بدست آورید (خود php یک زمان دارد که از یک زمان شروع شده . php از 0 شروع شده ولی ما یک زمان php را زمان شرع کار در نظر میگیریم) .
ما برای شروع کار یک زمان را زمان شروع کار در نظر میگیریم خیلی مهم نیست که چه زمانی باشد فقط باید یک زمان گذشته یا حال در php باشد.
و بر اساس این زمان زمان تایمرها کلاینت ها را تنظیم میکنیم. بر اساس محاسبه که انجام دادیم میتوان فهمید چند دوره کذشته و چقدر زمان تا دوره ی بعدی داریم.
اگر خوب توضیح ندادم ببخشید.