PDA

View Full Version : سوال: comet chat



beh3000
سه شنبه 13 خرداد 1393, 23:59 عصر
سلام دوستان

من کدی نوشتم برای چت از طریق comet ... قسمت دریافت پیامش رو که توی کنترلر هست کدش رو براتون میذارم مشکل اینجاست که وقتی اون while رو برمیدارم ( وقتی حلقه وایل نداشته باشه مثل اینه که از کلاینت هر دفه به سرور میره و برمیگرده که کامت نمیشه ) وقتی برمیدارم درست کار میکنه ولی وقتی WHILE هست ( درخواست برای 25 ثانیه در سرور باقی میمونه و هر 1 ثانیه چک میکنه که پیام جدید اومده یا نه ) در این حالت درست کار نمیکنه یعنی وقتی صفحه رو رفرش میکنیم هنگ میکنه . نمیدونم مشکل از کجاست امروز رو کلا نشستم روش اصلانشد که نشد


$startTime = strtotime("now");
$maxLoopTime = 25;
while($startTime - strtotime("now") < $maxLoopTime ){
$cc=$this->message_model->count_msguser($id);
if ($cc['cnt']>0) break;
sleep(1000000);
}


این کدی هست که اگه از زمان ورود به حلقه 25 ثانیه گذشته باشه و یا اینکه تعداد پیام جدید بیشتر از صفر باشه از حلقه میاد بیرون و در ادامه ( کدش رو نذاشتم ) پیام های جدید رو واکشی میکنه و برای کار بر میفرسته

لطفا بررسی کنید در ضمن آموزش های comet که توی سایت بود رو هم مطالعه کردم ولی درست نشد

جاوا اسکریپتم هم اینه


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 start_get(){
comet_xhr=create_xhr();
comet_xhr.onreadystatechange=receive_state;
comet_xhr.open("GET", 'get.php');
comet_xhr.send(null);
}


function receive_state() {
if(comet_xhr.readyState!=4) return;
msg=comet_xhr.responseText;
// namayesh message
comet_xhr.open("POST", 'get.php');
comet_xhr.send(null);
}

plague
چهارشنبه 14 خرداد 1393, 06:21 صبح
شما عدد بزرگتر رو در سمت راست علامت - گزاشتی !


$startTime - strtotime("now")



خب جوابش منفی میشه ! و تا آخرالزمان حلقه متوقف نمیشه

---
دوم اینکه تابع sleep به ثانیه میگیره ورودیش رو شما اومدی گفتی 1 ملیون ثانیه اسلیپ کنه ... تقریبا میشه 12 روز !
---
سوم اینکه همیشه در این جور مواقع از max_execution_time استفاده کن و مشخص کن حداکثر زمانی که کد میتونه ران بشه چقد باشه


من تو این نمونه کد عدد ها رو پایین دادم که نتیجه مشخص بشه سریع



ini_set('max_execution_time' , 8 );

$startTime = time() ;

$maxLoopTime = 5;

while( time() - $startTime < $maxLoopTime ){

echo 'checking ....<br />';
sleep(1);
}


echo 'done';

beh3000
چهارشنبه 14 خرداد 1393, 08:19 صبح
اون تابع usleep بود بر حسب میکرو ثانیه اینجا اشتباه شده ... ممنون از دقت نظرتون . ولی مشکل من بازم سرجاشه ... من میخوام کلاینت منتظر جواب سرور نمونه ! تو این مثالی که شما زدین حداکثر سرور 5 یا حداکثر 8 ثانیه مشغول خواهد بود توی این زمان من حتی نمیتونم پیام ارسال کنم ( ایجکس ارسال پیام اجرا نمیشه ) چون منتظر یک جواب از سمت سرور هست , صفحه هم رفرش نمیشه , حالا من میخوام توی سایتم توی همه صفحات بشه چت کرد مثل چت فیس بوک که یک پنل کوچیک پائین باز میشه و این مشکل برام دردسر ساز شده

plague
چهارشنبه 14 خرداد 1393, 18:55 عصر
والله من کامت کار نمیکنم چون شیوه درستی نیست و ماله این کار نیست
مشکل شما هنگ کردن حلقه بود که گفتم بخاطر چیه و الانم از توضیحاتت متوجه نمیشم مشکلت چیه

اگه مشکلت زمانیه که من دادم که بیشترشون کن !