PDA

View Full Version : سوال: ساخت اتاق چت



ravand
چهارشنبه 17 آبان 1391, 15:52 عصر
سلام
من تا حالا اتاق چت نساختم. کسی هست یه کم در موردش برام توضیح بده؟
الان کاربر وقتی متنی ارسال میکنه. توی دیتابیس ثبت میشه که فرد مقابل می تونه ببینه؟ یا از روش دیگه ای استفاده میشه. آخه می بینم وقتی توی اتاق های چت تحت وب پنجره ی چت رو می بندم و بعد باز میکنم دیگه متن های قبلی که نوشتم نیست. از این لحاظ میگم شاید از روش دیگه ای استفاده میشه.
اگه توضیح بدید ممنون میشم.
متشکرم.

black_binary
چهارشنبه 17 آبان 1391, 17:55 عصر
سلام کدهای نمونه ش توی codeproject.com راحت پیدا میکنی

ravand
چهارشنبه 17 آبان 1391, 18:00 عصر
کدهای نمونه اش رو ولش کن . چیزی که زیاده اسکریپته. من میخوام بدونم کلیتش چجوریه؟ یه توضیح مختصر یکی بده منم شروع کنم. اینا هر کدومشون یه جوری ان.

imanitc
پنج شنبه 18 آبان 1391, 08:13 صبح
من يدونه ساده ساختم ولي استفاده نکردم اول يوزر ها بايد لاگين کنن بعد ليست همه کاربران آنلاين رو بايد نمايش بدي بعد وقتي روي يکي کليک ميکنن يه فرم ارسال پيام باز ميشه
اصل کار اينه کار شما با آژاکس بايد همه اين کار ها رو بکني يعني مدام بايد سرور چک بکني ميتوني مثلا 2 يا 3 ثانيه يه بار يه رکوئست به سرور بفرستي که پيامي چيزي اومده يا نه
ولي سيستم هاي چت مهم مثل گوگل برعکس عمل ميکنن يعني اگر توي سروري تغييري ايچاد بشه سرور ميفرسته به کلاينت اينطور ي سرور بي خودي اشغال نميشه ولي ما نميتونيم از اين روش استفاده کنيم

ravand
پنج شنبه 18 آبان 1391, 08:49 صبح
پس هر پیامی که کاربر ارسال میکنه باید در دیتابیس ثبت بشه بعد از طرف کاربر مقابل هر به چند ثانیه پیامی ارسال بشه که ببینه در دیتابیس چیزی هست یا نه؟

imanitc
پنج شنبه 18 آبان 1391, 09:34 صبح
دقيقا همينطور هست پيام حتما بايد ثبت بشن باقي قضايا ديگه سليقه اي ميشه به همراه امکانات و ابزارهايي که ميخاي اضافه کني

ravand
پنج شنبه 18 آبان 1391, 09:39 صبح
من برای این ، این سوال رو پرسیدم چونکه دیدم وقتی پنجره ی چت رو می بندم و دوباره باز میکنم پیام های قبلیم نیست. برای همین گفتم لابد توی دیتابیس ذخیره نمیشه. به نظر شما چجوری این کارو کردن؟
متشکرم.

imanitc
پنج شنبه 18 آبان 1391, 10:11 صبح
ببينيد توي تعريف تيبيل پيام احتمالا يه فلگ مشاهده يا نمايش به کاربر گذاشتن که پس از نمايش اونو آپديت ميکنن که دفعه بعد نمايش داده نشه

ravand
پنج شنبه 18 آبان 1391, 10:15 صبح
یه چیز دیگه ام هست وقتی کاربر جدید هم میاد توی اتاق چت مطالب قبلی که اون کاربر ارسال کرده براش نمایش داده نمیشه.

MMSHFE
پنج شنبه 18 آبان 1391, 17:12 عصر
ولي سيستم هاي چت مهم مثل گوگل برعکس عمل ميکنن يعني اگر توي سروري تغييري ايچاد بشه سرور ميفرسته به کلاينت اينطور ي سرور بي خودي اشغال نميشه ولي ما نميتونيم از اين روش استفاده کنيم
چرا نمیتونیم؟ درباره COMET جستجو کنید.

MMSHFE
پنج شنبه 18 آبان 1391, 17:13 عصر
من برای این ، این سوال رو پرسیدم چونکه دیدم وقتی پنجره ی چت رو می بندم و دوباره باز میکنم پیام های قبلیم نیست. برای همین گفتم لابد توی دیتابیس ذخیره نمیشه. به نظر شما چجوری این کارو کردن؟
متشکرم.

یه چیز دیگه ام هست وقتی کاربر جدید هم میاد توی اتاق چت مطالب قبلی که اون کاربر ارسال کرده براش نمایش داده نمیشه.
کار سختی نیست. میتونید زمان ورود کاربر رو توی Session ذخیره کنید و از دیتابیس فقط مطالبی رو که بعد از اون زمان توی دیتابیس ثبت شدن استخراج کنید.

soroush.r70
جمعه 19 آبان 1391, 08:47 صبح
حالا اگه یه سیستم چت روم خوب با امکانات خوب رو نصب کنیم چی رو پیشنهاد می کنید می تونید معرفی کنید...؟

ravand
جمعه 19 آبان 1391, 08:50 صبح
مهندس هر چی گشتم یه مثال ساده از COMET پیدا نکردم. میشه یه مثال ساده اگر دارید بذارید؟
متشکرم.

ravand
جمعه 19 آبان 1391, 08:53 صبح
یعنی یه همچین چیزی منظورتون هست؟
http://stackoverflow.com/questions/5039089/php-comet-how-to-do-it-better

MMSHFE
جمعه 19 آبان 1391, 11:28 صبح
بله تقریباً همینطوریه. البته یکسری نکات رو هم باید رعایت کنید. مثلاً اینکه کلاینت رو نمیتونید زیاد منتظر نگه دارین چون اونوقت Apache خطای Max Execution Time (منظورم همون خطای Timeout Error هست) تولید میکنه. برای حل این مشکل هم راه حلهای ساده ای هست. مثلاً تنظیمات PHP رو برای حداکثر زمان اجرای یک اسکریپت با ویرایش php.ini یا استفاده از تابع ini_set تغییر بدین یا اگه امکانش نبود (توی هاستهای اشتراکی)، اونوقت اگه تا 20 ثانیه رکورد جدیدی ثبت نشده بود، همون رکوردهای قبلی رو بفرستین تا دوباره کلاینت یک اتصال جدید باز کنه. کلاً راه زیاده. مهم خواستنه، توانستن مشکل خاصی نیست!

blackboy
جمعه 19 آبان 1391, 17:56 عصر
سلام من در سایت خودم یک اتاق چت درست کردم ببینید(اول ثیت نام کنید بعد در بخش پورتال وارد شوید).

http://www.saeedsafaee.ir

eshpilen
جمعه 19 آبان 1391, 20:59 عصر
چت هم از اون پروژه های جذاب و متنوع و خلاقه که آدم حرفه ای میخواد.
البته چت هم داریم تا چت. از کوچک و امکانات و امنیت کم میشه تا سطحی که واقعا باید حرفه ای باشی.

imanitc
شنبه 20 آبان 1391, 09:28 صبح
يه مثال راجع به comet
http://www.zeitoun.net/articles/comet_and_php/start

ravand
پنج شنبه 25 آبان 1391, 16:24 عصر
من از این روش استفاده کردم که ببینم متغییر مورد نظر در فایل 8.php تغییر کرده یا نه؟

<!DOCTYPE html>
<html>
<head></head>
<body>
<div id="chatmenu"></div>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
$(function() {
setInterval (function() {
$("#chatmenu").load("8.php");
}, 5000);
});
</script>
</body>
</html>
به نظر شما روش درستیه؟

ravand
پنج شنبه 25 آبان 1391, 17:05 عصر
من فکر میکنم این دستور load در کدی که دادم صفحه 8.php رو رفرش نمیکنه بلکه ما رو از تکمیل شدن و در واقع تغییر در صفحه مطلع میکنه . پس در آینده با افزایش کاربران فشاری به سرور نخواهد امد. نظر شما چیه؟

$("#chatmenu").load("8.php");

MMSHFE
پنج شنبه 25 آبان 1391, 17:09 عصر
دوست گرامی، اینکه هر 5 ثانیه یکبار صفحه رو درخواست میکنید به سرور فشار میاره نه صرفاً درخواست کردن صفحه مربوطه. فرض کنید 1000 کاربر همزمان توی سایت شما باشن. در این حالت هر 5 ثانیه، 1000 درخواست دارین، یعنی بطور متوسط 200 درخواست در ثانیه! این مسئله باعث فشار به سرور میشه و با یک درخواست به تنهایی سرور به مشکل بر نمیخوره. برای همین مسئله هست که میگن از تکنیک COMET استفاده کنید که خودش هم روشهای مختلفی مثل Long Polling و... داره. موفق باشید.

ravand
پنج شنبه 25 آبان 1391, 17:11 عصر
من هر چی گشتم دنبال یه مثال ساده برای این روش COMET که اصلا بفهمم چجوری کار میکنه پیدا نکردم.

ravand
پنج شنبه 25 آبان 1391, 19:54 عصر
بذارید یه بررسی دیگه بکنم. ما میخواستیم با روش comet بررسی بکنیم ببینیم چیزی توی دیتابیس هست یا نه؟
شما گفتید این آموزش یه همچین روشی است:
http://stackoverflow.com/questions/5039089/php-comet-how-to-do-it-better
این آموزش دستور زیر رو داره که صفحه رو رفرش میکنه این فشاری به سرور نمیاره؟
فکر میکنم مجبور باشیم چند بار این کار رو بکنیم.

usleep(5000);
از این اسکریپت های رایگانی که در وب زیاده بگذریم . ببینم اصلا این روش چجوری هست؟
من میخوام خودم یاد بگیرم و وقتی این اسکریپت های رایگان که خیلی مطلب رو پیچونده می بینم حالم بد میشه :لبخند:

eshpilen
جمعه 26 آبان 1391, 08:17 صبح
درباره Comet:

http://www.hamidreza-mz.tk/?p=573
http://www.hamidreza-mz.tk/?p=578
http://www.hamidreza-mz.tk/?p=589
http://www.hamidreza-mz.tk/?p=594