ورود

View Full Version : کامت چت در Yii



beh3000
پنج شنبه 27 آذر 1393, 15:02 عصر
سلام

میخوام کامت چت بنویسم توی Yii یه مشکلی دارم دوستان . یه کنترلر دارم به اسم chat و با اکشن load برای دریافت پیامها ( کد این قسمت رو براتون گذاشتم ) . میدونید که توی کامت چت یک حلقه وجود داره که کوئری داخلش اجرا میشه و اگه پیامی وجود داشت پیام رو برمیگردونه واگر پیامی نبود چند لحظه بعد دوباره چک میکنه ... تا وقتی که زمانی که براش تعیین کردیم تموم بشه ... ( من توی این کد زمان حداکثر رو 20 ثانیه تعیید کردم )



public function actionLoad()
{

$startTime = strtotime('now');
$maxLoopTime = 20;

$sql = "select * from chat_message where msg_recieverid=:uid and msg_userid=:sid and msg_id>:max";
$command = Yii::app()-> dblite -> createCommand($sql);
$command->bindValue(":uid" , Yii::app()->user->id , PDO::PARAM_INT );
$command->bindValue(":max" , $_POST['max'] , PDO::PARAM_INT );
$command->bindValue(":sid" , $_POST['uid'] , PDO::PARAM_INT );


$rw=0;
while( strtotime('now') - $startTime < $maxLoopTime && $rw<1 ){
$ret = $command->queryAll();
$rw=count($ret);
if ($rw==0)
sleep(1);
else
break;
}

$arr=array();
foreach ($ret as $row){
$arr[]['id'] = $row['msg_id'] ;
$arr[]['msg'] = $row['msg_text'] ;
}
echo json_encode($arr);


}


حالا مشکل من اینه : وقتی صفحه رو باز میکنم چند ثانیه ( حدود 10 الی 20 ثانیه ) در حالت لودینگ میمونه و بعد بارگذاری میشه ... قسمت while رو که برمیدارم درست میشه ... ولی اگه while رو بردارم که دیگه کامت چت نیست

MMSHFE
جمعه 28 آذر 1393, 09:14 صبح
یه شرط بگذارین که اگه تایم صفر بود sleep اجرا نشه. بطور کلی توی اولین نمایش صفحه باید محتوا رو نشون بدین و برای درخواستهای بعدی این متد رو با ajax صدا بزنین.

beh3000
جمعه 28 آذر 1393, 10:47 صبح
برای بار اول مشکلی ندارم محتوا نشون داده میشه چون 2 ثانیه بعد از بارگذاری دریافت پیامها شروع میشه ... دو سه تا پیام که ارسال و دریافت شد این مشکل بوجود میاد برای تمام صفحات سایت ... بعد اینکه بخش چت رو میبندم چند ثانیه بعد همه چی درسته

MMSHFE
شنبه 29 آذر 1393, 13:00 عصر
بهتره توی COMET درخواستهای AJAX رو بصورت Synchronous استفاده کنید (async: false توی jQuery) تا ارسال درخواست بعدی بعد از دریافت جواب درخواست قبلی انجام بشه.

beh3000
شنبه 29 آذر 1393, 16:35 عصر
به این شکل async رو اضافه کردم کلا هنگ میکنه ... صفحه چت رو که باز میکنم اصلا نمیشه توی تکست باکس چیزی نوشت


<script>


var mx=0;
function getmsg(csrf)
{
$.ajax({
type: 'POST',
url: 'http://localhost/online/chat/load/',
data:{__yctn:csrf,uid:12,max:mx},
async: false,
success: function(data){
alert(data);
setTimeout(function(){ getmsg(csrf); },2000);
},
dataType:'html'
});
}




setTimeout(function(){ getmsg(csrf); },2000);
</script>

beh3000
چهارشنبه 03 دی 1393, 09:20 صبح
دقیقا نمیدونم مشکلش از کجاست ولی وقتی قسمت دریافت پیامها رو خارج از کنترلر ها با php خام مینویسم مشکلی نداره و براحتی همه چیز کار میکنه ... احتمال میدم وقتی داخل Yii از sleep استفاده میکنیم چونکه در یک صفحه تمامی قسمت ها درگیر هستند ( Yii.php , config.php , ... ) روی اونها هم تاثیر میذاره ... نمیدونم شاید ... حالا من اینجوری نوشتم که توی چت قسمت نمایش صفحه و ارسال پیام با Yii نوشته شده . قسمت دریافت پیام با php خام

MMSHFE
چهارشنبه 03 دی 1393, 09:43 صبح
نه مشکل از اون نیست (البته حدس میزنم اگه PHP بصورت Non Thread Safe نصب بشه، با sleep به مشکل برخورد میکنید - بخاطر تنظیمات سرور - ولی مطمئن نیستم). اگه کارها درست انجام بشه فرقی نمیکنه که با Yii کار کنید یا PHP خام.