SimRFE
پنج شنبه 01 آبان 1393, 13:35 عصر
با سلام.
من میخواستم با php و javascript-jquery یه سرویس چت بسازم بدون اینکه بخوام هر چند میلی ثانیه یبار به سرور درخواست بفرستیم و بدون این که تنظیمات سرور رو دستکاری کنم ، با تحقیقاتی که کردم بهترین راه استفاده از Comet هست ،
من یه مثال ساده ایـــــــــنجا (http://barnamenevis.org/showthread.php?301779-Comet-%DA%86%DB%8C%D8%B3%D8%AA-%D8%A8%D9%87-%DA%86%D9%87-%D8%AF%D8%B1%D8%AF%DB%8C-%D9%85%DB%8C%D8%AE%D9%88%D8%B1%D9%87!-%DA%86%DA%AF%D9%88%D9%86%D9%87-%D9%BE%DB%8C%D8%A7%D8%AF%D9%87-%D8%B3%D8%A7%D8%B2%DB%8C-%D9%85%DB%8C%D8%B4%D9%88%D8%AF) پیدا کردم و یه سری تغییرات توش دادم مثل سیو کردن مسیج ها در دیتابیس ،
حالا مشکلم اینه که وقتی صفحه رو با دو تا مرورگر باز میکنم ، وقتی یه مسیج سند میکنم ، هر دو مرورگر با هم آپدیت نمیشن و مسیج رو نشون بدن ، گاهی فقط یکیشون آپدیت میشه ، گاهی هم هیچکدم نمیشن.
این هم کدامه:
<?php
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: private, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0");
header('Pragma: private');
header("Pragma: no-cache");
header('Content-Type: text/html; charset=utf-8');
?>
<html>
<head>
<title>sss</title>
<script src="jquery.js" type="text/javascript"></script>
<script>
$( document ).ready(function() {
var comet_xhr;
function create_xhr() {
var xhr;
if(window.XMLHttpRequest) xhr = new XMLHttpRequest();
else if (window.ActiveXObject) xhr = new ActiveXObject("Microsoft.XMLHTTP");
return xhr;
}
function receive_state() {
if(comet_xhr.readyState!=4) return;
msgg=comet_xhr.responseText;
txt=document.getElementById('txt');
if(msgg.indexOf('_-_')==0) {
msgga = msgg.substring(msgg.indexOf('_-_')+3);
txt.innerHTML = msgga;
}
comet_xhr.open("GET", 'get.php');
comet_xhr.send(null);
}
txt.value='';
comet_xhr=create_xhr();
comet_xhr.onreadystatechange=receive_state;
comet_xhr.open("GET", 'get.php');
comet_xhr.send(null);
function send() {
var msg = $('#msg').val();
var name = $("#name").val()
$.post( "save.php", { name: name, msg: msg });
}
$("#msg").keyup(function (e) {
if (e.which == 13) {
send();
}
});
});
</script>
</head>
<body>
<div style="margin: auto; width:500px;">
<span style="vertical-align: top">Messages:</span>
<div id="txt" style="width: 500; height: 500;border:1px solid black;overflow: scroll;padding-left: 15px;"></div>
<br />
name:
<input type="text" name="name" id="name" style="display:block" />
message:
<input type="text" name="msg" id="msg" style="display:block;" />
</div>
</body>
</html>
این فایل ایندکس هست که هم باکس چت توش هست و هم ایجکس و جاوا اسکریت.
<?php
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: private, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0");
header('Pragma: private');
header("Pragma: no-cache");
header('Content-Type: text/html; charset=utf-8');
$msg_file='msg.txt';
$name_file='name.txt';
clearstatcache();
while(filesize($msg_file)==0) {
usleep(10000);
clearstatcache();
}
$fp=fopen($msg_file, "r+");
//flock($fp, LOCK_EX);
$msg=fread($fp, filesize($msg_file));
ftruncate($fp, 0);
fclose($fp);
$fpn=fopen($name_file, "r+");
//flock($fpn, LOCK_EX);
$name=fread($fpn, filesize($name_file));
ftruncate($fpn, 0);
fclose($fpn);
$server = mysql_connect('localhost', 'root', '');
$database = mysql_select_db('aa');
$sendinfos = mysql_query("INSERT INTO `aa`.`msg` (`id`, `name`, `msg`) VALUES (NULL, '{$name}', '{$msg}');");
function records($query) {
$record = array();
GLOBAL $queries;
$queries = mysql_query($query);
if($queries && mysql_num_rows($queries) > 0) {
while($queryrow = mysql_fetch_assoc($queries)) {
$record[] = $queryrow;
}
}
return $record;
}
clearstatcache();
$gets = records("SELECT * FROM `msg`");
echo '_-_';
foreach($gets as $theget) {
echo $theget['name']. ': ' . $theget['msg'] . '<br />';
}
این هم فایلی هست که داده ها بهش ارسال میشن ، این فایل مسیج رو میگیره توی یه فایل دخیرش میکنه ، بعد توی دیتابیس ذخیره میکنه و بعد محتویات فایل رو پاک میکنه.
<?php
session_start();
if(isset($_POST['msg']) && isset($_POST['name'])) {
$open = fopen('msg.txt', 'w');
$write = fwrite($open, $_POST['msg']);
fclose($open);
$openn = fopen('name.txt', 'w');
$write = fwrite($openn, $_POST['name']);
fclose($openn);
}
این هم فقط اسم طرف رو میگیره و توی یه فایل سیو میکنه که بعد از توی فایل get بگیریمش (اول با session انجامش دادم خیلی دیر جواب میداد ، نمیدونم چرا)
به نظرتون مشکلش چیه؟
پ.ن: این کد رو فعلا فقط برای تست نوشتم ، میدونم استاندارد نیست و به هم ریختس و...!
من میخواستم با php و javascript-jquery یه سرویس چت بسازم بدون اینکه بخوام هر چند میلی ثانیه یبار به سرور درخواست بفرستیم و بدون این که تنظیمات سرور رو دستکاری کنم ، با تحقیقاتی که کردم بهترین راه استفاده از Comet هست ،
من یه مثال ساده ایـــــــــنجا (http://barnamenevis.org/showthread.php?301779-Comet-%DA%86%DB%8C%D8%B3%D8%AA-%D8%A8%D9%87-%DA%86%D9%87-%D8%AF%D8%B1%D8%AF%DB%8C-%D9%85%DB%8C%D8%AE%D9%88%D8%B1%D9%87!-%DA%86%DA%AF%D9%88%D9%86%D9%87-%D9%BE%DB%8C%D8%A7%D8%AF%D9%87-%D8%B3%D8%A7%D8%B2%DB%8C-%D9%85%DB%8C%D8%B4%D9%88%D8%AF) پیدا کردم و یه سری تغییرات توش دادم مثل سیو کردن مسیج ها در دیتابیس ،
حالا مشکلم اینه که وقتی صفحه رو با دو تا مرورگر باز میکنم ، وقتی یه مسیج سند میکنم ، هر دو مرورگر با هم آپدیت نمیشن و مسیج رو نشون بدن ، گاهی فقط یکیشون آپدیت میشه ، گاهی هم هیچکدم نمیشن.
این هم کدامه:
<?php
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: private, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0");
header('Pragma: private');
header("Pragma: no-cache");
header('Content-Type: text/html; charset=utf-8');
?>
<html>
<head>
<title>sss</title>
<script src="jquery.js" type="text/javascript"></script>
<script>
$( document ).ready(function() {
var comet_xhr;
function create_xhr() {
var xhr;
if(window.XMLHttpRequest) xhr = new XMLHttpRequest();
else if (window.ActiveXObject) xhr = new ActiveXObject("Microsoft.XMLHTTP");
return xhr;
}
function receive_state() {
if(comet_xhr.readyState!=4) return;
msgg=comet_xhr.responseText;
txt=document.getElementById('txt');
if(msgg.indexOf('_-_')==0) {
msgga = msgg.substring(msgg.indexOf('_-_')+3);
txt.innerHTML = msgga;
}
comet_xhr.open("GET", 'get.php');
comet_xhr.send(null);
}
txt.value='';
comet_xhr=create_xhr();
comet_xhr.onreadystatechange=receive_state;
comet_xhr.open("GET", 'get.php');
comet_xhr.send(null);
function send() {
var msg = $('#msg').val();
var name = $("#name").val()
$.post( "save.php", { name: name, msg: msg });
}
$("#msg").keyup(function (e) {
if (e.which == 13) {
send();
}
});
});
</script>
</head>
<body>
<div style="margin: auto; width:500px;">
<span style="vertical-align: top">Messages:</span>
<div id="txt" style="width: 500; height: 500;border:1px solid black;overflow: scroll;padding-left: 15px;"></div>
<br />
name:
<input type="text" name="name" id="name" style="display:block" />
message:
<input type="text" name="msg" id="msg" style="display:block;" />
</div>
</body>
</html>
این فایل ایندکس هست که هم باکس چت توش هست و هم ایجکس و جاوا اسکریت.
<?php
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: private, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0");
header('Pragma: private');
header("Pragma: no-cache");
header('Content-Type: text/html; charset=utf-8');
$msg_file='msg.txt';
$name_file='name.txt';
clearstatcache();
while(filesize($msg_file)==0) {
usleep(10000);
clearstatcache();
}
$fp=fopen($msg_file, "r+");
//flock($fp, LOCK_EX);
$msg=fread($fp, filesize($msg_file));
ftruncate($fp, 0);
fclose($fp);
$fpn=fopen($name_file, "r+");
//flock($fpn, LOCK_EX);
$name=fread($fpn, filesize($name_file));
ftruncate($fpn, 0);
fclose($fpn);
$server = mysql_connect('localhost', 'root', '');
$database = mysql_select_db('aa');
$sendinfos = mysql_query("INSERT INTO `aa`.`msg` (`id`, `name`, `msg`) VALUES (NULL, '{$name}', '{$msg}');");
function records($query) {
$record = array();
GLOBAL $queries;
$queries = mysql_query($query);
if($queries && mysql_num_rows($queries) > 0) {
while($queryrow = mysql_fetch_assoc($queries)) {
$record[] = $queryrow;
}
}
return $record;
}
clearstatcache();
$gets = records("SELECT * FROM `msg`");
echo '_-_';
foreach($gets as $theget) {
echo $theget['name']. ': ' . $theget['msg'] . '<br />';
}
این هم فایلی هست که داده ها بهش ارسال میشن ، این فایل مسیج رو میگیره توی یه فایل دخیرش میکنه ، بعد توی دیتابیس ذخیره میکنه و بعد محتویات فایل رو پاک میکنه.
<?php
session_start();
if(isset($_POST['msg']) && isset($_POST['name'])) {
$open = fopen('msg.txt', 'w');
$write = fwrite($open, $_POST['msg']);
fclose($open);
$openn = fopen('name.txt', 'w');
$write = fwrite($openn, $_POST['name']);
fclose($openn);
}
این هم فقط اسم طرف رو میگیره و توی یه فایل سیو میکنه که بعد از توی فایل get بگیریمش (اول با session انجامش دادم خیلی دیر جواب میداد ، نمیدونم چرا)
به نظرتون مشکلش چیه؟
پ.ن: این کد رو فعلا فقط برای تست نوشتم ، میدونم استاندارد نیست و به هم ریختس و...!