PDA

View Full Version : ساخت چت آنلاین



n0o0b_sina
سه شنبه 09 دی 1393, 01:16 صبح
سلام
دوستان میدونید چطوری میشه با php چت آنلاین درست کرد؟ البته درست کردنه چته ساده مشکلی نداره مشکله اصلی من توی اطلاع رسانی هاست، مثلا من یه پیام به کاربر x ارسال کردم چطوری کاربر x از این پیام من مطلع بشه؟ البته دلم نمیخواد با ajax مثلا هر 5 ثانیه پیام هارو چک کنم به نظرم راهه منطقی تری هم باید باشه. البته با websocket میشه اینکارو کرد ولی توی راهنمای راه اندازیش نیاز به دستور SSh داشته که توی هاست های اشتراکی ما بهش دسترسی نداریم. یا من خوب متوجه نشدم.
ممنون میشم یه راهنمایی بکنید.

H:Shojaei
سه شنبه 09 دی 1393, 10:30 صبح
سلام
دربازه node.js جستجو کنید...

n0o0b_sina
سه شنبه 09 دی 1393, 11:39 صبح
سلام ممنون، ولی میدونم با
node.js میشه ولی سواله من در رابطه با php بود :)

H:Shojaei
سه شنبه 09 دی 1393, 13:38 عصر
با نود راحت ترید اگه بلدین کامل با همین به نظر من انجام بدین به نفعتونه...

n0o0b_sina
سه شنبه 09 دی 1393, 13:56 عصر
من میخوام توی یه سیستم php ازش استفاده کنم، و خیلی علاقمندم چگونگیشو توی php یاد بگیرم

beh3000
سه شنبه 09 دی 1393, 15:58 عصر
توی هاست های اشتراکی 99% nodejs نمیشه استفاده کرد باید با php نوشته بشه ... در php هم میتونید از روش کامت استفاده کنید ... بجای اینکه بیاید هر 5 ثانیه رفت و آمد کنید بین سرور و کلاینت باید یک بار برید به سرور اگه پیامی نبود همون جا بمونید 5 ثانیه بعد دوباره چک کنید ... چندبار که چک کردید برمیگردید به کلاینت میگید پیامی پیدا نکردم 5 ثانیه بعد کلاینت شما رو دوباره میفرسته به سرور و دوباره ... در کل رفت و آمد ها بین سرور و کلاینت کم میشه

n0o0b_sina
سه شنبه 09 دی 1393, 17:01 عصر
توی هاست های اشتراکی 99% nodejs نمیشه استفاده کرد باید با php نوشته بشه ... در php هم میتونید از روش کامت استفاده کنید ... بجای اینکه بیاید هر 5 ثانیه رفت و آمد کنید بین سرور و کلاینت باید یک بار برید به سرور اگه پیامی نبود همون جا بمونید 5 ثانیه بعد دوباره چک کنید ... چندبار که چک کردید برمیگردید به کلاینت میگید پیامی پیدا نکردم 5 ثانیه بعد کلاینت شما رو دوباره میفرسته به سرور و دوباره ... در کل رفت و آمد ها بین سرور و کلاینت کم میشه
سلام
ممنون از راهنماییتون بله nodejs توی بیشتر هاست های اشتراکی نصب نیست. این روش رو که گفتید چطوری امکان پذیره؟! یعنی چطوری یه بار بریم و بر نگردیم؟ برای اینکه بتونیم بفهمیم پیامی برای کاربر x فرستاده شده یا نه خب باید هر 5 ثانیه با ajax یه در خواست بفرستیم و خروجی رو مثلا با json برگردونیم و یا اگه پیامی نبود false برگردونیم، نمیشه که بفرستیم ولی بر نگردیم متوجه نشدم کلا :D
البته من نمیخواستم هر x ثانیه پیام هارو چک کنم انتظار داشتم php با این عظمتش یه چیزی داشته باشه در این رابطه که انگار نداره :D کله سایتای خارجی رو هم گشتم راهی جز انجام عمل بررسی به صورت مکرر و دستورات ssh نبود! خسته نباشه

Mohammadsgh
سه شنبه 09 دی 1393, 18:42 عصر
با ajax هم میتونید کار کنید

beh3000
سه شنبه 09 دی 1393, 22:42 عصر
این تابع ایجکس


function getmsg()
{
$.ajax({
type: 'POST',
url: 'http://localhost/......./getchat.php/',
data:{data},
success: function(data){
// namayesh payam
setTimeout(function(){ getmsg(); },5000);
},
dataType:'html'
});
}

setTimeout(function(){ getmsg(); },1000);


این هم فایل php ... توضیحاتش رو جلوشون نوشتم ببخشید اگه شلوغ شد




ini_set('max_execution_time' , 28 ); // تععین زمان حداکثر اجرای یک کوئری
$startTime = strtotime('now'); // زمان شروع اجرای اسکریپت رو میگیرم
$maxLoopTime = 25; // میگم حداکثر میخوام 25 ثانیه توی سرور بمونم


while( strtotime('now') - $startTime < $maxLoopTime ){

$ret = "Run Your SQL Query"; // اجرای کوئری برای یافتن پیام
$arr=array();
foreach ($ret as $row){ // اگه پیامی پیدا کرده بود اون مواردی که لازم داریم رو توی آرایه ای قرار میدیم
$arr[]['id'] = $row['msg_id'] ;
$arr[]['msg'] = htmlspecialchars($row['msg_text'], ENT_QUOTES, 'UTF-8');
}


$rw=count($arr);
if ($rw==0)
sleep(5); // اسکریپت 5 ثانیه به خواب عمیق فرو میره اگه پیامی نبود
else
break; // اگه پیامی پیدا کرد از حلقه خارج میشه
}

echo json_encode($arr); // وقتی از حلقه خارج شدیم آرایه نتیجه رو حالا چ خالی باشه چ پر باشه جیسون میکنیم میفرستیم برای کلاینت


اگه خط اول رو ننویسید فکر میکنم به طور پیش فرض 30 ثانیه باشه ... یعنی اگه خط اول رو ننویسید نمیتونید بگید 40 ثانیه میخواید توی سرور بمونید برا خودتون بچرخید زمان اجرای اسکریپت چداکثر داره که اون رو باید تعیین کنید اگه از اون زمان اضافه تر بمونید توی سرور با خطا مواجه میشید ... برا همین گفتم زمان حداکثر اجرا 28 باشه زمانی که من میمونم توی سرور 25 .

توی این مثال با یک بار رفت و آمد 5 بار پیام ها رو چک کردین ( در 25 ثانیه هر 5 ثانیه یکبار )

n0o0b_sina
سه شنبه 09 دی 1393, 23:26 عصر
ممنون واقعا مفید بود با این روش میتونیم خیلی کمتر رفت آمد کنیم. ولی آیا میشه این کد رو کمی بهینه تر کرد؟!
به نظره من کلا 3 تا خط اول نیاز نیست.
فکر کنم در این صورت هر بار که پیامی پیدا نکرد بعد از 5 ثانیه حلقه دوباره تکرار میشه و دیگ لازم نیست هر 25 ثانیه دوباره درخواست بفرستیم. ممنون میشم نظرتون رو بگید.
یعنی این جوری:

$rw = 0;
while($rw < 1) {

$ret = "Run Your SQL Query"; // اجرای کوئری برای یافتن پیام
$arr = array();
foreach ($ret as $row){ // اگه پیامی پیدا کرده بود اون مواردی که لازم داریم رو توی آرایه ای قرار میدیم
$arr[]['id'] = $row['msg_id'] ;
$arr[]['msg'] = htmlspecialchars($row['msg_text'], ENT_QUOTES, 'UTF-8');
}


$rw = count($arr);
if ($rw == 0)
sleep(5); // اسکریپت 5 ثانیه به خواب عمیق فرو میره اگه پیامی نبود
else
break; // اگه پیامی پیدا کرد از حلقه خارج میشه
}

echo json_encode($arr);


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

beh3000
چهارشنبه 10 دی 1393, 08:16 صبح
اگه میشد خوب بود ولی نمیشه اون توضیحاتی که پائین کد نوشتم رو بخونید ... هر اسکریپت مدت زمان معینی میتونه اجرا بشه این زمان به طور پیش فرض 30 ثانیه است ... کدی که شما نوشتین اگه به مدت 30 ثانیه پیامی پیدا نکرد خطا میده

n0o0b_sina
چهارشنبه 10 دی 1393, 11:39 صبح
خب اگه ما مقدار تایم لیمیت رو صفر قرار بدیم مشکل حل میشه :)
یعنی اینجوری:
ini_set('max_execution_time',0);
یا:
set_time_limit(0);
اینو توی یه اسکریپ تست کردم 1 هفته هم بمونه ارور نمیده.

فرزند کوروش
چهارشنبه 10 دی 1393, 12:16 عصر
set_time_limit(0); روی بعضی هاستها بسته است