ساخت چت روم با php توسط WebSocket

ساخت چت روم با php

در این آموزش ، قصد داریم نحوه ساخت یک چت روم ساده با php و سوکت پروگرمینگ ایجاد کنیم . ساخت چت روم با php و قابلیت HTML5 ساده و جالب است . WebSocket یکی از قابلیت های جالب HTML5 برای ایجاد یک ارتباط (connection) بین یک مرورگر وب و سرور است .

در اینجا درواقع از WebSocket برای ایجاد پلی برای ارسال یا دریافت پیام ها از سرور چت php استفاده می کنیم.

برای ساخت یک ارتباط سوکت بین سرور و کلاینت ، ما از پروتکل WebSocket (ws://) برای ایجاد یک ارتباط دو طرفه بین سرور و کلاینت با اسکریپت php استفاده می کنیم. بعد از ساخت WebSocket ، توابع بازگشتی برای مدیریت رویداد های بین سرور و کلاینت حین پروسه چت وجود داردند . اولین بار که یک کانکشن با سرور ایجاد شد , همه داده های WebSocket که بصورت frame است به جای ارسال درخواست های HTTP , به صورت مستقیم از یک سوکت رد می شود.. این قابلیت به ما امکان پیاده سازی کانکشن های پایدار بین مرورگر و سرور را می دهد.

ساخت چت روم با php

ساخت WebSocket و مدیریت رویدادها

اسکریپت زیر برای ساخت یک webSocket کلاینت ساید و تعریف توابع بازگشتی برای مدیریت رویداد های مختلف چت ها استفاده می شود. این هندل ها به ما اطلاعاتی در مورد وضعیت اتصال ، پیام ها و هر نوع خطای دیگری را می دهند. پیام ها با فرمت داده JSON کد شده و به سمت سرور ارسال می شوند.

 

برنامه نویسی سوکت برای ساخت چت روم با php

کد php زیر درخواست یک کانکشن جدید سوکت را برررسی می کند . اگر هر درخواست اتصال جدید پیدا شد ، بعد با ایجاد یک ارتباط سه طرفه یک سوکت را ایجاد می کند و سپس اطلاعاتی در مورد اتصال به صورت اینکد شده ارسال می کند.

بعد از دریافت اطلاعات از اتصال فعلی و دیکد کردن ، آن را به کلاینت چت ارسال میکند . همه این موارد توسط کلاس ChatHandler مدیریت می شود.

 

و کلاس ChatHandler به اینصورت است :

 

برقراری اتصال توسط خط فرمان (command line)

تصویر زیر عکسی از خط فرمان برای ایحاد یک کانکشن با سیستم چت را نشان می دهد :

ساخت چت روم با php

خروجی ساخت چت روم با php :

ساخت چت روم با php

هرگونه سوال یا مشکلی داشتید یا اینکه قصد توسعه اسکریپت را دارید لطفا از قسمت نظرات با ما در ارتباط باشید . ممنونم . موفق باشید

 

حسن شفیعی توسعه دهنده وب و موبایل مدیر سایت علاقه خاصی به برنامه نویسی وب و موبایل دارم و هر روز تلاش می کنم به این حوزه مسلط تر شوم و اطلاعاتم را به شکل کاربردی برای علاقه مندان در وب به اشتراک بگذارم. اگر نیاز به برنامه نویس برای انجام پروژه و نوشتن اسکریپت های سمت وب, اپلیکیشن های اندروید و ios, پیدا کردن راه حل توسعه و غیره داشتید حتما از طریق تماس با ما/ واتساپ/ تلگرام بهم پیام بدید. برایتهیه هاست مطمین و پرسرعت کلیک کنید
مطالب زیر را حتما بخوانید
دیدگاه کاربران (۷۸)

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

  1. هاشم شیخی ۱۹ اسفند ۱۳۹۹

    سلام
    ممنون از آموزش خوبتون
    درپاسخ به یکی از سوالات شما فرمودید بجای command line از cronjob استفاده کنیم
    در پاسخ به سوال دیگری فرمودید در هاست اشتراکی از این برنامه نمی شه استفاده کرد و حتما باید از سرور مجازی استفاده کنیم
    من ratchet websocket رو در xampp به خوبی اجرا کردم و از هاستی استفاده می کنم که به ssh و terminal دسترسی دارم و می تونم فایل server.php رو اجرا کنم . با ترمینال اجرا می کنم اما بدلیل بسته بودن پورتها برنامه من کار نمی کند.
    اینطور که متوجه شدم در هاست اشتراکی پورتها باز نیستند.
    آیا هیچ راهی برای استفاده از سوکت در هاست اشتراکی وجود ندارد؟
    از پاسخ های شما به سوالات متوجه نشدم به هر حال از برنامه ای که شما در این آموزش قرار دادید در هاست اشتراکی می شود استفاده کرد یا خیر؟

    پاسخ
    1. حسن شفیعی ۱۹ اسفند ۱۳۹۹

      سلام.
      بله روی هاست اشتراکی نمیتونید استفاده کنید

      پاسخ
  2. محمد مهدی شجاعیان ۲۷ دی ۱۳۹۹

    سلام
    http://uplod.ir/au5x35vg60d5/2021-01-16_215435.png.htm
    من این فایلارو آپلود کردم ولی سایت لینکی به من نمیده
    من قبلا توی این سایت فایلامو آپلود می کردم لینک میداد ( منظورم فایل های html هست)
    بعد پسوند فایل index.php رو به html تغییر میدم لینک میده ولی پیام ها ارسال نمیشه!
    تروخدا بگید چیکار کنم.

    پاسخ
    1. حسن شفیعی ۲۷ دی ۱۳۹۹

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

      پاسخ
  3. امید ۶ شهریور ۱۳۹۹

    سلام و خسته نباشید . این ران کردم پیام ها ارسال نمیشن چرا

    پاسخ
    1. حسن شفیعی ۶ شهریور ۱۳۹۹

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

      پاسخ
  4. ویکتور هوگو ۲۴ اردیبهشت ۱۳۹۹

    سلام میخواستم بپرسم این برنامه رو دایرکت ادمین هاست اجرا میشه
    چون محیط command برای php -q http://localhost/demo/php-socket.php
    نداره
    با تشکر

    پاسخ
    1. حسن شفیعی ۲۵ اردیبهشت ۱۳۹۹

      سلام. خیر ولی میتونید از cron job برای اجرای این دستور استفاده کنید

      پاسخ
  5. ایمان آزادی ۱۴ آذر ۱۳۹۸

    سلام آقای شفیعی
    میخواستم بدونم دقیقا کار تابع doHandshake چیه ؟؟؟

    و اینکه چطوری میتونم resource سوکت کاربرانی که متصل شده اند رو ببینم یا در یک فایل text بنویسم (میخوام بدونم چی به چیه) ؟
    این کار رو انجام میدم ولی فایل خام هست و چیزی توش نوشته نمیشه

    این کد ها رو بعد از خط socket_accept اضافه میکنم ولی جواب نمیده و فایل خالی ذخیره میشه

    $h = fopen(“d:\socket.txt”, “a+”);
    fwrite($h, json_encode($socketResource));
    fwrite($h, PHP_EOL);
    fwrite($h, json_encode($spawn));
    fclose($h);

    پاسخ
    1. حسن شفیعی ۲۱ آذر ۱۳۹۸

      سلام.
      در فایل جزییات تابع doHandshake قابل مشاهده است و اگر ببینید متوجه می شوید که با تابع socket_write یک سوکت را باز و اطلاعات به آن پاس داده می شود.
      آدرس دهی رو چک کنید و قبل ذخیره حتما $socketResource رو بررسی کنید که آیا مقداری دارد یا خیر.
      موفق باشید.

      پاسخ
  6. آرش آهمند ۲۳ خرداد ۱۳۹۸

    سلام وقتتون بخیر باشه .
    اول از همه ممنون بخاطر توضیحات خوبتون . من تونستم کد رو اجرا کنم که این به لطف شماست

    دو تا سوال داشتم
    ۱- سایت هایی که خدمات پشتیبان آنلاین میدن ( چت آنلاین با کاربر سایت ها ) از سوکت استفاده می کنن ؟ چون با آجاکس به نظرم به سخت افزار بالایی نیاز باشه
    ۲- من میخوام برای سایت خودم که قبلا با سیستم آجاکس سیستم پشتیبان آنلاین طراحی کردم با استفاده از سوکت این سیستم رو دوباره طراحی کنم .
    پیشنهاد شما برای بهترین نوع طراحی سیستم پشتیبان آنلاین برای سایتم چی هست ؟

    من این کد رو خوندم اما خوب بدون شک نیاز به مطالعه ی بیشتر داره . برای هر کاربری که آنلاین میشه یک فیلد جدید تو بانک داده ی خودم میسازم و اون کد رو توی سیشن میریزم تا این کاربر یک کلید برای چت آنلاین با پشتیبان داشته باشه .

    حالا ثبت اطلاعات اتفاق سختی نیست با کدی که دادین اما میخوام کاربر رسیو اطلاعاتش رو ( مثل سیستم آجاکس که هر ۵ ثاتیه رفرش میکرد ) هر زمان پشتیبان مثلا متنی رو براش نوشت همون زمان با استفاده از این سیستم دریافت اطلاعات از بانک داده انجام بشه . ) یکم در هم نوشتم . ممنون میشم به شکل کلی راهنمایی کنین

    پاسخ
    1. حسن شفیعی ۲۴ خرداد ۱۳۹۸

      سلام. ممنون. خوشحالیم که مفید واقع شده.
      ۱. بله می تونید استفاده کنید البته برای کارایی بیشتر از زبان های nodejs یا python برای همچنین سیستم های real-time استفاده میشه که خب با php مطمینا کمی سخت افزار رو باید ارتقا بدید.
      از کتابخانه ratchat متعلق به socketo.me برای طراحی چت آنلاین استفاده کنید تا از حداکثر کارایی این امکان بهره ببرید و داکیومنت هم واقعا کامل و جامع است و سوال و جواب های مربوطه فراوان که خیلی در مرحله توسعه میتونه کمک کنه.

      موفق باشید.

      پاسخ
      1. آرش آهمند ۲۵ خرداد ۱۳۹۸

        سلام مجدد آقای شفیعی عزیز .
        ممنون بخاطر راهنماییتون .
        و شرمنده به خاطر اینکه باز هم دارم وقتتون رو میگیرم .
        ۱- بین نود جی اس و پایتون کدوم رو انتخاب کنم بهتره ؟ یعنی کدومشون توی سیستم های ریل تایم بهتر جواب میده ؟ و دوم اینکه راه اندازی کدوم روی سرور بهتر هست ؟

        برای شروع این کار بهتره یادگیری رو از کجا شروع کنم ؟ از مقدماتی نود جی اس ؟

        پاسخ
      2. حسن شفیعی ۲۵ خرداد ۱۳۹۸

        سلام. خواهش می کنم.
        نود جی اس از هر لحاظر گزینه بهتری برای ریل تایم هست.
        بله از مقدماتی nodejs شروع کنید https://www.tutorialspoint.com/nodejs/
        موفق باشید.

        پاسخ
  7. جواد هادی نژاد ۱۵ اسفند ۱۳۹۷

    یه سوال دیگه هم دارم.
    میشه با وب سوکت عکس هم ارسال کرد ؟

    پاسخ
    1. حسن شفیعی ۱۹ اسفند ۱۳۹۷

      سلام. بله میتونید تصویر رو بصورت base64 اینکد و بعد در فرمت صحیح آن در کد HTML بصورت embed شده ارسال و نمایش بدید.
      به جای [CODE] باید کد base64 تصویر را ارسال کنید که این کد را با یک زبان سمت سرور مثل php یا ابزار آنلاین https://www.base64-image.de می توانید بدست بیارید.

      موفق باشید.

      پاسخ
  8. جواد هادی نژاد ۱۵ اسفند ۱۳۹۷

    سلام وقتتون بخیر خسته نباشید.
    بنده سرور ابنتو خریدم.
    و لمپ را نصب کردم. و در مشخصات phpinfo() وب ساکت enabeld می باشد.
    و در پوشه /var/www/html هر سه فایلی که در لب تاب خودم به خوبی کارمیکرد رو برای چت قرار دادم.
    و در فایل index.php به جای localhost در متن زیر آی پی سرور را قرار دادم.
    new WebSocket(“ws://localhost:8090/php-socket.php”);
    و در فایل php-socket.php به جای localhost آی پی سرور را در متن زیر را قرار دادم.
    define(‘HOST_NAME’,”localhost”);
    اما وقتی در مرورگر برای اجرا باز میکنم عمل نمیکند.
    در قسمت چت روم بالا هیچ متنی اعم از وصل شدن یا نشدن ارسال نمیشود.
    کارهایی که انجام دادم درست نبوده است ؟
    یا کار دیگه ای هم باید انجام میدادم ؟
    ممنون از پاسخگویی

    پاسخ
    1. حسن شفیعی ۱۹ اسفند ۱۳۹۷

      سلام ممنون.
      ابتدا باید اطمینان حاصل کنید که پورت مورد نظر ۸۰۹۰ به درستی در سرور اوپن شده و قابل استفاده است و ورودی ها توسط فایروال ریجکت نمیشه که معمولا با باز کردن پورت و حالت listen گذاشتن پورت این مشکل حل میشه
      اگر مشکل پورت مورد نظر باشه مطمینا بعد از باز کردن آن با اجرای ws://IP:8090/file.php نتیجه را خواهید دید.
      موفق باشید.

      پاسخ
  9. جواد هادی نژاد ۸ اسفند ۱۳۹۷

    سلام وقت بخیر بنده ند های بالا رو داخل زمپ اجرا گردم و کار کرد.
    ولی داخل هاست اشتراکی اجرا نشد.
    وب ساکت فعاله.
    از طریق کرون جاب هم فایل رو اجرا کردم ولی نشد.
    اگه امکان داره یه آموزش مختصر برای اجرای گدهای بالا در هاست منتشر کنید.
    ممنون.
    یه پروژه هم دارم اگر وقت برای انجامش دارین به شماره بنده پیام بدین ممنون.

    پاسخ
    1. حسن شفیعی ۸ اسفند ۱۳۹۷

      سلام ممنون. داخل هاست اشتراکی چون یک سرور بین کلاینت های زیادی از جمله شما مشترک است برای همین اجازه ست کردن پورت های ورودی incomming به لوکال سرور رو نمی دن .
      همچنین شما برای اینکار نیاز به دسترسی به شل دارید که بعضی بسته به شرکت هاستینگ این گزینه هم ممکن است وجود نداشته باشه یا برای انجام این کار نیز محدود باشه.
      پس نیاز که یک سرور مجازی یا اختصاصی رو برای اینکار انتخاب کنید.

      پاسخ
  10. علیرضا ۱۷ آبان ۱۳۹۷
    1. حسن شفیعی ۱۷ آبان ۱۳۹۷

      شما باید بتونید با سرچ کردن ارور ها با نحوه رفع انها آشنا باشید . این توی برنامه نویسی جز موارد پایه است و بهتره دیباگینگ رو یاد بگیرید.
      به هر حال پورت مورد نظر اشغال است که با این دستور netstat -an میتوانید ببنید پورت ها توسط چه سرویسی در حال استفاده هستند. پس با تغییر پورت مشکل شما حل میشه
      موفق باشید.

      پاسخ
  11. علیرضا ۱۷ آبان ۱۳۹۷

    سلام
    من به این مشکل برخوردم
    http://uploader.vcn.ir/download/uuil8pvzkvyb8ccwxqjb0uyx0

    پاسخ
    1. حسن شفیعی ۱۷ آبان ۱۳۹۷

      سلام . نیاز است که extension=php_sockets.dll را از طریق فایل php.ini فعال و بعد وب سرور را ریستارت کنید.

      موفق باشید.

      پاسخ
  12. رضا ۲۲ تیر ۱۳۹۷

    سلام

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

    پاسخ
    1. حسن شفیعی ۲۲ تیر ۱۳۹۷

      سلام . هیچ مشکلی نداره . سورس کد کامل رو دانلود و اون رو اجرا کنید.
      موفق باشید.

      پاسخ
  13. ارشیا ۱۰ تیر ۱۳۹۷

    سلام
    ممنون بابت مطلب خوبتون
    اما من توی پروژه که با php میخوام وقتی x دیتابیس رو آپدیت کرد بدون اینکه y ریکوست بزنه آپدیتو به y بفرسته چند جا خوندم که سوکت ای او و نود جی اس اما اونا برای چت بود آیا میشه همچین سندی از سرور بدون ریکوست کاربر در موقع آپدیت دیتابیس سرور داشت؟
    میشه لینک مطلب بهم بدین؟

    پاسخ
    1. حسن شفیعی ۱۰ تیر ۱۳۹۷

      سلام . خوشحالم که مفید واقع شده.
      دقیقا متوجه نشدم چه موردی رو قصد دارید پیاده کنید . اگر واضح تر توضیح میدادید من و یا دوستان میتونیم پاسخ مناسبی رو براتون ارسال کنیم.

      پاسخ
  14. جواد ۲۸ خرداد ۱۳۹۷

    سلام
    ممنون از سایت خوبتون
    برنامه رو اجرا کردم خیلی عالی بود چطوری میشه با سوکت پیام خصوصی به یکی از کاربر ها ارسال کرد؟

    پاسخ
    1. حسن شفیعی ۲۸ خرداد ۱۳۹۷

      سلام . خوشحالم که مفید واقع شده .
      هر کلاینتی که متصل می شود یک id و یک آبجکت حاوی اطلاعاتی از کانکشن را دارد که با دسترسی به آن می توانید به هر یوزر خاصی پیامی خصوصی بفرستید که فقط از کانکشن کلاینت مورد نظر رد میشه و به شخص میرسه .
      موفق باشید.

      پاسخ
  15. حمیدرضا ۱۸ بهمن ۱۳۹۶

    سلام حسین جان
    وبسایت و مطالبت خیلی عالیه من در قسمت‌هایی از php که کار نکردم وقتی سرچ می‌کنم یکی از وبسایت‌هایی که مطالب جدیدی از php ارائه داده این وبسایته.
    راستش من در قسمت streams یا همون جریان‌ها در php مشکل دارم و ازش سردرنمیارم در سطح وب فارسی هم مطلبی در موردش پیدا نکردم اگر امکان داره در این مورد مطلب قرار بدید.
    ممنون.

    پاسخ
    1. حسن شفیعی ۱۸ بهمن ۱۳۹۶

      سلام . ممنون . خیلی خوشحالم که مورد رضایت شما دوست عزیز قرار گرفته
      در یکی از نظرات بصورت خلاصه در این مورد توضیح دادم که میتوانید مطالعه کنید.
      https://netparadis.com/access-form-data-from-php/
      حتما انشالا بزودی مطلب کاملی در این مورد تهیه و اطلاع رسانی خواهد شد
      موفق و پیروز باشید.

      پاسخ
  16. جواد ۲۴ دی ۱۳۹۶

    سرور مجازی دارم و این افزونه ها هم نصب هستن و فعال هم هستن اما نمی دونم چطوری باید تنظیمشون کنم
    همین مورد رو در سایتهای خارجی هم گفته بودن و یک مثال هم زده بودن اما تست کردم جواب نداد.
    اگر بتونید در این مورد کمک کنید خیلی ممنون میشم چون وجود ssl برام ضروری هست.

    پاسخ
    1. حسن شفیعی ۲۴ دی ۱۳۹۶

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

      پاسخ
      1. جواد احشامیان ۲۴ دی ۱۳۹۶

        به ایمیل سایتتون ارسال کردم:

        totalsec99{@}gmail.com

        پاسخ
      2. جواد احشامیان ۲۵ دی ۱۳۹۶

        سلام منتظر اعلام نتیجه هستم

        پاسخ
      3. حسن شفیعی ۲ بهمن ۱۳۹۶

        سلام شرمنده فرصت نشد برزسی کنم . از طریق تلگرام اطلاع میدم
        موفق و پیروز باشید

        پاسخ
      4. جواد احشامیان ۱۹ بهمن ۱۳۹۶

        درود بر شما؛ همچنان منتظر تماس تلگرامی شما هستم.
        ۰۹۱*****۰۴

        پاسخ
      5. حسن شفیعی ۱۹ بهمن ۱۳۹۶

        سلام
        پاسخ ارسال شد .

        پاسخ
      6. جواد احشامیان ۲۴ بهمن ۱۳۹۶

        سلام مجدد، تلگرام خودتون رو چک کنید اطلاعات مورد نیاز رو ارسال کردم.
        با تشکر

        پاسخ
  17. جواد احشامیان ۲۴ دی ۱۳۹۶

    با سلام
    آموزش مفیدی هست
    ازتون می خوام در مورد هماهنگ سازی وب سوکت با ssl راهنمایی بفرمایید هر چقدر روی سایتهای خارجی بررسی کردم نتیجه نگرفتم.

    پاسخ
    1. حسن شفیعی ۲۴ دی ۱۳۹۶

      سلام . خوشحالم که مفید واقع شده .
      برای اینکار باید یک سری تنظیمات در وب سرور خودتون انجام بدید . اگر از سرور اشتراکی استفاده می کنید معمولا این دسترسی را ندارید و لی اگر سرور مجازی و یا اختصاصی دارید میتوانید ماژول های
      mod_proxy.so
      mod_proxy_wstunnel.so
      و از ProxyPass در فایل کانفیگ httpd.conf بهره ببرید .
      موفق باشید.

      پاسخ
  18. صالح ۲۸ مهر ۱۳۹۶

    با سلام
    ضمن تشکر از مطالب بسیار مفید شما.یه سوال از خدمتتون داشتم.فرض کنید همه کلاینت ها آنلاین هستند و ارتباطشون برقراره و توی همین موقعیت برای چندتا از همین کاربرها توی سرور یک رویداد جدید بوجود میاد و لازمه به اونها خبر بدین ، چطور می تونیم به متد Send یک کلاینت توی وب سوکت از یکجای دیگه کدهای php دسترسی داشته باشیم تا بتونیم برای این کلاینت ها رویداد رو بفرستیم(به طور ساده تر یعنی سرور بدون نیاز به کلاینت و متد Onmessage خودش بتونه هروقت خواست برای کلاینت های متصل دیتا ارسال کنه؟) سوال و کدهای من توی سایت استک آور فلوو هست ، لطفا راهنمایی بفرمایید واقعا به این موضوع نیاز دارم. باتشکر
    https://stackoverflow.com/questions/46846645/how-to-send-data-to-some-clients-in-ratchet-websocket-from-out-of-messagecompone

    پاسخ
    1. حسن شفیعی ۳۰ مهر ۱۳۹۶

      سلام . خواهش میکنم . این مورد رو حقیقتا تست نکردم . بعد از بررسی پاسخ رو ارسال می کنم .
      موفق باشید.

      پاسخ
    2. جواد ۲۴ دی ۱۳۹۶

      این مورد هم کار سختی نیست کافیه با یک حلقه for به تمام کلاینتهای متصل پیامت مورد نظر رو Send کنید

      پاسخ
  19. sohrab ۲۷ مهر ۱۳۹۶

    دوست عزیز، فناوری WebSocket فقط برای درست کردن چت نیست، هزاران کاربرد بزرگتر و بیشتری داره
    درضمن چیزی بنام ارتباط ۳ طرفه وجود نداره، مگر اینکه منظورت دوطرفه همزمان باشه

    مطلب رو اصلاح کنید و از انتشار مطالب اشتباه خودداری کنید!

    پاسخ
    1. حسن شفیعی ۲۷ مهر ۱۳۹۶

      در این مقاله به هیچ وجه سعی در تشریح تمام قابلیت های websocket نداشتم . فقط از آن برای ساخت یک ارتباط بین کلاینت و سرور برای ارسال و دریافت پیام استفاده کردیم همین !! .همچنین هر کانکشن HTTP باید یک TCP handshake که یک ارتباط ۳ طرفه است داشته باشد بنابراین ما در هنگام استفاده از websocket دو ارتباط ۳ طرفه داریم . برای فهمدین موضوع ارتباط سه طرفه این عبارت را جستجو کنید
      TCP 3-way handshake

      موفق باشید !

      پاسخ
  20. صالح مصلح ۲۶ مهر ۱۳۹۶

    با سلام و تشکر از مطالبتون
    یه سوال داشتم ، من درحال ساخت یه وب سایت فول ajax هستم که تا به الان تقریبا تموم شده و الان برای دریافت realtime رویداد های جدید هر کاربر به صورت نوتیفیکیشن قصد دارم از وب سوکت ratchet استفاده کنم، آیا کانکت بودن وب سوکت با سرور و درخواست های هم زمان ajax یک کلاینت تداخلی ایجاد نمی کنه ؟ از نظر پرفرمنس و سرعت چطور ؟ لطفا راهنمایی بفرمایید.
    تشکر از شما مهندس عزیز

    پاسخ
    1. حسن شفیعی ۲۶ مهر ۱۳۹۶

      سلام . خواهش می کنم .
      نه وب سوکت با ایجاد یک کانکشن tcp پایدار (stable) به شما این اطمینان خاطر را می دهد که به هیچ وجه تداخلی با request های دیگه ای که توسط ajax ارسال و نتیجه آن دریافت می شود ، وجود نخواهد داشت . با خیال راحت از این قابلیت در پروژتون استفاده کنید .

      پاسخ
  21. علیرضا رئیسی ۱۷ مهر ۱۳۹۶

    سلام و عرض ادب و احترام خدمت جناب شفیعی
    آقای شفیعی . بنده قصد دارم کدهای این چت روم رو به گونه تغییر بدم که بتونم به صورت خصوصی پیام ارسال کنم. با توجه به منابعی که در بالا به بنده ارائه دادید قصد داشتم این کار رو انجام بدم. اما هر کاری می کنم نمیشه با این چت روم این کار رو کرد. میشه بنده رو راهنمایی کنید که چطور می تونم این چت روم رو به گونه ای تغییر داد که بشه به صورت خصوصی پیام ارسال کرد ؟

    با تشکر از تمام راهنمایی هاتون …

    پاسخ
  22. حسین رحیمی ۱۷ مهر ۱۳۹۶

    در سایت رسمی php درباره ی socket_select به این صورت توضیح داده :
    socket_select() accepts arrays of sockets and waits for them to change status. Those coming with BSD sockets background will recognize that those socket resource arrays are in fact the so-called file descriptor sets. Three independent arrays of socket resources are watched.
    اما دقیق متوجه نمیشم که منظورش چیه !!!

    پاسخ
    1. حسن شفیعی ۱۷ مهر ۱۳۹۶

      کار تابع socket_select مدیریت کانکشن ها است تا اینکه بررسی کند آیا یک سوکت قابل خواندن است یا نه آیا مشکلی برای یک سوکت پیش اومده یا نه که همانطور که میبینید در یک حلقه قرار دادیم . بنابراین تابع socket_select برای مانیتور کلاینت ها استفاده می شود و ببیند کدوم کلاینت چه پیامی را ارسال کرده است

      پاسخ
  23. حسین رحیمی ۱۷ مهر ۱۳۹۶

    با تشکر از جناب مهندس .
    امکانش هست به بنده نیز توضیح بدید که کار تایع socket_select در خط ۱۷ چیه ؟
    ممنون

    پاسخ
  24. حسین رحیمی ۱۷ مهر ۱۳۹۶

    مطلب خیلی خوبی بود . خیلی به دردم خورد . تشکر .
    جناب مهندس ! این برنامه چت توانایی چت کردن گروهی برای چند نفر رو داره ؟ به طور کلی در بحث سوکت ، چند نفر می تونن به سوکت کانکت بشن و باهم به تبادل اطلاعات بپردازن ؟ آیا این مسئله به سخت افزار سرور نیز مرتبط هست ؟

    پاسخ
    1. حسن شفیعی ۱۷ مهر ۱۳۹۶

      خواهش می کنم . بله کاملا بستگی به میزان ریسورس های سرور از قبیل cpu و memory داره ولی سیستم های لینوکسی امروزی با این دیزاین خوب کرنل می تونند با یک رم ۳۰گیگاباتی تا ۱ میلیون کانکشن TCP فعال را به طور همزمان handle یا مدیریت کنند . حالا بر حسب اگر ۱۰۰هزار کلاینت فعال داشته باشید این مقدار منابع سخت افزاری بسیار بسیار پایین تر خواهد بود . پس مطمین باشید اگر تعداد کاربران فعال بیشتر از حد نباشه می تونید با یک سرور معمولی یک ارتباط stable (پایدار) را ایجاد کنید . همچنین خود وب سرور ها و php به طور پیش فرض مقادیری برای محدودیت کانکشن های TCP دارند که برای کانکشن های بسیار زیاد باید این مقدار پیش فرض رو تغییر بدید . در آپاچی این مقادیر با تغییر MaxClients و ServerLimit امکان پذیر است .

      http://httpd.apache.org/docs/2.2/mod/mpm_common.html#maxclients

      پاسخ
  25. علیرضا رئیسی ۱۶ مهر ۱۳۹۶

    ممنون و تشکر بابت راهنمایی های عالی تون .
    شما نیز موفق و پیروز باشید …

    پاسخ
  26. علیرضا رئیسی ۱۶ مهر ۱۳۹۶

    بسیار بسیار از لطف تون ممنونم . منابع واقعا عالی بودن جناب شفیعی. باز هم تشکر.
    جناب شفیعی . سوال دیگه ای هم داشتم که ممنون میشم راهنماییم کنید. البته این سوال می تونه سوال خیلی از مخاطبین شما که این مطلب را در سایت شما مطالعه می کنن نیز باشه.
    شما در پایان مطلب ( مقاله ) تون ، نحوه ی برقراری اتصال توسط خط فرمان (command line) رو توضیح دادید. خب این برای زمانی هست که ما بخواهیم این چت روم رو در کامپیوتر خودمون یعنی در لوکال هاست اجرا کنیم. اگر بنده بخواهم همین چت روم رو به هاست واقعی ببرم چطور باید این کار رو انجام بدم ؟ آیا در هاست واقعی نیز command line وجود داره ؟
    ممنون میشم در این باره توضیحاتی رو ارائه بدید.
    با تشکر از زحماتتون …

    پاسخ
    1. حسن شفیعی ۱۶ مهر ۱۳۹۶

      خواهش می کنم . در هاستینگ مقوله ای به اسم cronjob وجود دارد که می توانید کد مورد نظر را از اونجا اجرا کنید . دسترسی به این ابزار از طریق cpanel هم ممکن هستش .
      همچنین اگر توابع اجرای دستورات مثل exec , shell_exec , passthru که از قسمت خروجی تابع phpinfo() و بخش disable_function می توانید ببینید (اگر none باشید ینی تمام توابع قابل اجرا است) , فعال باشد , می توانید command مورد نظر را اجرا کنید .
      موفق و پیروز باشید.

      پاسخ
  27. علیرضا رئیسی ۱۶ مهر ۱۳۹۶

    با تشکر از راهنمایی تون جناب شفیعی.
    حقیقتش من چند روز هست دارم دراین باره تحقیق می کنم اما مقاله ای که به این موضوع بپردازه رو پیدا نکردم .
    ممنون میشم منبعی رو به بنده معرفی کنید که به این موضوع یعنی ارسال پیام خصوصی توسط سوکت بپردازه.

    با تشکر از راشما

    پاسخ
    1. حسن شفیعی ۱۶ مهر ۱۳۹۶

      دو اسکریپت بسیار عالی که با این سوکت پیاده سازی شدن را می تونید از github دانلود کنید . امکانات زیادی دارند . همچنین نحوه ارسال پیام خصوصی رو هم نیز در کنار آنها قرار دادم که میتونید استفاده کنید

      https://github.com/ratchetphp/Ratchet
      https://github.com/ratchetphp/Ratchet/issues/261

      https://github.com/ghedipunk/PHP-Websockets
      https://github.com/ghedipunk/PHP-Websockets/issues/101

      پاسخ
  28. علیرضا رئیسی ۱۶ مهر ۱۳۹۶

    ممنون از راهنمایی تون جناب شفیعی .
    جناب شفیعی . این برنامه ی چت مثل یک چت گروهی هست . یعنی هرکسی که متصل شود می تونه به همه ی کسانی که اتصال شون برقرار هست پیام ارسال کنه.
    سوال من اینه که :
    در بحث سوکت ما چطور می تونیم به یک کاربر خاص پیام ارسال کنیم ؟
    مثلا در نرم افزاری مثل تلگرام و … ، آیا برای ارسال پیام بین مخاطبین از سوکت استفاده می شه ؟ اگر از سوکت استفاده میشه چطور ما می تونیم پیام خصوصی ارسال کنیم ؟
    ممنون میشم بنده رو راهنمایی کنید .
    با تشکر …

    پاسخ
    1. حسن شفیعی ۱۶ مهر ۱۳۹۶

      خواهش می کنم . بله هر کسی که به این سوکت متصل می شود به صورت یک چت گروهی میتواند پیام ها را ببینید و پیام ارسال کند.
      هر کلاینتی که متصل می شود یک id و یک آبجکت حاوی اطلاعاتی از کانکشن را دارد که با دسترسی به آن می توانید به هر یوزر خاصی پیامی خصوصی بفرستید که فقط از کانکشن کلاینت مورد نظر رد میشه و به شخص میرسه .
      websocket یک از قابلیت های html5 است با جستجو می توانید نمونه کد های این مورد را به راحتی پیدا کنید .
      موفق باشید

      پاسخ
  29. علیرضا رئیسی ۱۶ مهر ۱۳۹۶

    با تشکر از مطلب خوب تون. من اجراش کردم و به خوبی کار کرد.
    جناب شفیعی ؟ به نظرتون امنیت کدهای بالا در چه حده ؟
    من می خوام از سوکت به صورت ارتباط سه طرفه در پروژه ی خودم استفاده کنم . قصد دارم از این کدها در پروژه ام استفاده کنم. می خوام بدونم این کدها از دیدگاه شما امنیت لازم رو داره ؟

    پاسخ
    1. حسن شفیعی ۱۶ مهر ۱۳۹۶

      سلام . خواهش می کنم . خیلی خوشحال شدم که تونستید با موفقیت کد ها رو اجرا کنید و نتیجه بگیرید .
      از لحاظ امنیتی کد ها مشکلی ندارد . با خیال راحت می توانید این کد ها رو در پروژه خودتون استفاده کنیدو آن را گسترش بدید .
      برای امنیت بیشتر در اتصالات می توانید از ssl استفاده کنید که البته نیاز به تغییراتی در فایل پیکربندی وب سرور داره .
      موفق باشید

      پاسخ
  30. hassan ۱۱ مهر ۱۳۹۶

    با تشکر از مطلب خوبتون
    من در لوکال اجرا کردم و اوکی بود ولی برای اجرا در سرور مجازی لینوکسی اجرا نمیشه
    آموزشی در دسترس دارید شما؟

    پاسخ
    1. حسن شفیعی ۱۱ مهر ۱۳۹۶

      خیلی ممنون .
      دقیقا به چه مشکل یا اروری برخوردید چونکه من در هر دو مورد تست کردم و کاملا جواب می داد . امکان داد تنظیمات وب سرور و ورژن های php سرور لینوکسی شما متفاوت تر از لوکال هاست شما باشد . همچنین از برقراری اتصال و باز بودن پورت ها و مشخص کردت ip و دایرکتری مورد نظر در اسکریپت هم اطمینان حاصل پیدا کنید
      این موارد را بررسی کنید . اگر هم اروری بود اینحا بفرستید چک کنم
      بعد از بررسی دوباره نتیجه رو اعلام کنید
      موفق باشید

      پاسخ
دوره های آموزشی