مقایسه NodeJS و PHP ، نبرد برتری و بقا !

قبل از اینکه به مقایسه php و  nodejs بپردازیم در مرحله اول باید بفهمیم که چرا یک همچین مقوله ای در بین جوامع برنامه نویس به وجود آمده است مخصوصا در بین برنامه نویس های backend . همه این بحث ها بر سر استفاده از php  و یا Nodejs از افزایش تقاضای کاربران برای استفاده از برنامه های گوشی های هوشمند آغاز شد.به طوری که apple store شرکت اپل دربرگیرنده 2 میلیون برنامه و play store شرکت Google دربرگیرنده بیش از 2.2 میلیون برنامه می باشند.موفقیت بسیاری از این برنامه ها، بازی ها و مسنجرها باعث شده است که برنامه نویسان backend  مجبور شوند خود را با جدیدترین تکنولوژی که بتواند درخواست های همزمان را بهتر مدیریت کند انطباق دهند.میلیون ها نفر از کاربران این برنامه ها اقدام به مبادله نوعی از این داده ها می کنند به همین دلیل پردازش این حجم وسیع از داده نیازمند یک زیرساخت قوی و مقیاس پذیر و سریع هست .

با یادگیری زبان ماشین و داده های بزرگ(Big-data) که به سرع در حال پیشرفت و توسعه هستند می توانیم خود به سرعت در این مسیر قرار دهیم و شطح خود را به سطوح بالاتر و جدیدتر ارتقاء دهیم.

پیش درآمدی بر مباحث فنی :

فرانت-اند(front-end) : تمامی نرم افزار های موبایلی و یا تحت وبی که از نزدیک در تعامل با آن ها قرار می گیرد و از ویژگی هایی که در اختیار شما قرار می دهند استفاده می کنید. مانند نرم افزار های موبایلی که بر روی گوشی های هوشمند خود نصب دارید.

بک-اند(back-end) : بخش نرم افزاری یک برنامه که شاید شما هیچ نشانه ای از آن را به ظاهر نمی بینید ولی با اجرای آن یک سری فرآیند اجرا شده و اطلاعات مورد نیاز فرانت-اند را ارسال می کند و  فرآیندهایی که شما در بخش فرانت-اند انجام می دهید مانند ذخیر یک عکس را مدیریت کرده و این کار را برای شما انجام می دهند. و می توان گفت بخشی است که ارتباط فرانت-اند با سرور را برقرار می کند و سرور نیز یک ماشین با پردازش های مختلف است که درنهایت یک ارتباط پایدار را با اینترنت و پایگاه داده برقرار می کند.

معروف ترین تکنولوژی های بک-اند(سمت سرور) :

فرانت-اند یک وب سایت و یا یک اپلیکیشن در صورتی کارایی خود را خواهد داشت که با یک تکنولوژی سمت سرور ترکیب شود و بک-اند ترکیبی از سرور و اپلیکیشن و پایگاه داده است و یک برنامه نویس بک-اند استفاده و نگهداری می کند از تکنولوژی همه این موارد را با هم داشته باشد.

  • زبان های سمت سرور مانند : PHP , RUBY , PHYTON , JAVA , .NET , NODEJS
  • پایگاه داده : MYSQL(RDBMS) , NOSQL(DYNAMIC DATABASE LIKE MONGODB)

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

در زبان های برنامه نویسی سمت سرور زبان php زودتر از NODEJS منتشر شده و مورد استفاده قرار گرفته است از طرفی پی اچ پی برای مدیریت تمامی وظایفی که در سمت سرور باید انجام شود از پورت 80 استفاده می نماید و همچنین از دیتابیس MYSQL جهت انجام فرآیندهای مربوطه استفاده می شود.

جاوااسکریپت تنها چیزی است که شما به طور مستقیم در ارتباط با آن هستید و توسط مرورگر به طور مثال مدیریت می شود.بسیاری از  سیستم های مدیریت محتوا از PHP برای اجرای فرآیندها در سطح سرور استفاده می کنند ولی با ظهور نود جی اس(NODEJS) در سال 2009 میلادی توسط رایان دال(ryan dahl) می توان گفت نبرد بین بقا و برتری میان این دو ساختار آغاز شد.در حال حاضر هر دوی این ها نقش خود را برای اینکه برنامه نویس را متقاعد به استفاده از خود کنند تلاش می نمایند و این درحالی است که یکی مخزنی از تجربه های بسیار شگفت انگیز و تاریخچه ای چند ده ساله و دیگری چراغ خاموش با سرعت و برتری در حال عبور از آن است .

اجازه دهید هر یک از این ساختارهای برنامه نویسی سمت سرور را با توجه به پارامترهای زیر با یگدیگر مقایسه نماییم :

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

انتخاب php  یا nodejs تماما بستگی به ساختار پروژه حال چه سایت و چه اپلیکیشن دارد اما اگر قرار است دیتای بزرگی را در سطح سرور جابه جا کنیم و یا نیاز به ارتباط های همزمان سریع داریم نود جی اس بهترین گزینه می باشد  و همه این موارد به دلیل ساختار رویدارمحور(event-driven) و مسدود ناپذیر(non-blocking) نود جی اس انجام می شود.

با توجه به گزارش ها در ساختار سمت سرور برنامه موبایلی سرکت linkdin این شرکت توانسته بود تعدادسرورهای خود را از 30 به 3 کاهش دهد و این درحالی است که هم اکنون ظرفیت کافی برای برای مدیریت زیرساخت و منابعی که در اختیار دارد را دارا می باشد  و همه این ها به دلیل تغییر زیرساخت از ROR به nodejs است. و پی پال نیز مشابه linkedin همچین رویه ای را طی کرد و از java به nodejs تغییر وضعیت داد. نود جی اس تقریبا دو برابر سریع تر به واسطه افراد کمتری و البته از 33% کاهش کد و 40% فایل های ایجادی کمتر توسعه داده شده است.

عملکرد :

استاندارد php zend runtime از ساختار interpreted compilation strategy جهت اجرای کد کمتر و بهینه شده استفاده می کند و این درحالی است که نود جی اس از تلفیقی از JIT و موتور جاوااسکریپv8 گوگل کروم استفاده می کند و این استراتژی برای زبان های پویا خود را اثبات کرده است اما اغلب زمان شروع را افزایش می دهد.

Multitasking  :

همانطور که گفتیم نود جی اس کارآمدی فوق العاده ای در مدیریت چندین درخواست همزمان را دارد و این امکان پذیر است زیرا نود جی اس از ساختارهای رویداد محور که مسدود نمی شوند و بر روی یک ترد اجرا می شوند بهره برده است اما در عوض php از ساختاری استفاده می کند که مسدود پذیر است (Blocking) و با توجه به این محدودیت پاسخ به درخواست ها بستگی به پردازش های Thread دارد. در این شرایط اگر یک عملیات سنگین همراه با چندیدن درخواست همزمان توسط کاربر درخواست شود سرور از منابع موجود برای پردازش درخواست ها (request) استفاده کرده و انجام این پردازش ها با تاخیرهایی در ارسال response مناسب برای اپلیکیشن و یا سایت کاربر همراه است.وب سرور هایی همچون Apache و Nginx راهکارهایی برای اینکه php عملکرد بهتری را در مواجهه با multi-taskingها داشته باشد در نظر گرفته اند. ولی همه اینها محدودیت هایی بیشتر از آنکه خود زبان از multi-tasking پشتیبانی کند دارند.

دسترسی به کامند لاین (command-line) :

پی اچ پی (php) : $php –i

نود جی اس (nodejs) : $node

فرآینده های سنکرون و آسنکرون (synchronous or asynchronous) :

سنکرون () : کدها خط به خط اجرا می شوند به طوری که بعد از اینکه  فرآیند یک خط انجام شد فرآیند اجرای خط بعد آغاز می شود.

آسنکرون () : همه خطوط برنامه در یک زمان اجرا می شوند.

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

در عوض فرآیندها در نود جی اس با توجه به ساختار آسنکرون اجرا می شوند.به این معنی که موتور جاوااسکریپت تمامی کدها را در یک زمان و بدون انتظار برای بازگشت respose از سایر توابع و فرآیندها اجرا می نماید.همین مسئله باعث عملکرد بهتر و سرعت بیشتر در فرآیندهای همزمان شده است.

توجه : برنامه ممکن است در بخشی از اجرای فرآیند گیر کند اگر تعدادی از توابع نیاز داشته باشند به اینکه داده ای از یک تابع دیگر به آنها پاس داده شود. این مشکل هم در نود جی اس با وجود ویژگی Async/await که کمک می کند بلاکی که نیاز است به صورت saynchronous اجرا شود.

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

در پی اچ پی کاربر دائما بین زبان ها با ساختار های متفاوت جا به جا شده و اقدام به نوشتن برنامه مد نظر خود می کند. به طوری که ما عمدتا از بخش های متفاوتی مانند mysql برای دیتابیس  و php برای سمت سرور استفاده می نماییم و از طرفی دانستن مواردی همچون html,css و js  مزیت محسوب می شود.

این درحالی است که پلتفرم نود جی اس ساختاری مبتنی بر جاوااسکریپت دارد. پس زمانی که شما جاوااسکریپت و استانداردهای (ٍES6…) آن را بدانید در نهایت هم فرانت-اند را خواهید داشت و هم با کمی تلاش برای آشنایی با متودهای نود جی اس می توانید به بک-اند هم مسلط شده و دیگر نیازی نیست که برای اجرای پروژه های خود بین زبان ها و ساختارهای مختلف برنامه نویسی جا به جا شوید زیرا دیگر شما با دانش جاوااسکریپتی خود می توانید و فرانت-اند و هم بک-اند را کار کنید.

ماژول ها :

در پی اچ پی برای اینکه از ماژول های مختلف در پروژتان استفاده کنید می توانید از سرویس هایی همچون PEAR و COMPOSER استفاده و ماژول مدنظرتان را نصب و مدیریت نمایید.

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

فریمورک ها :

پی اچ پی یکی از زبان های سمت سرور محبوب و پر کاربرد می باشد. که به همین دلیل فریمورک های مختلف با ویژگی های شگفت انگیزی برای آن وجود دارد مانند Laravel , Cakephp ,codeigniter و … باعث افزایش سرعت کارایی و امنیت بیشتر در پروژه ها می شوند.

نود جی اس هم مشابه پی اچ پی دربردارنده فریمورک هایی همچون Express , meteor , koa ,hapi , sails و …. می باشد

دیتابیس :

پی اچ پی از نوعی دیتابیس رابطه ای مانند Mysql , MariaDB , PostgreSQL و … استفاده می کند و این درحالی است که می توان با کمک از ابزارهایی خاص از دیتابیس NoSql استفاده کرد هرچند که عمومیت ندارد.نکته ای که باید به آن اشاره شود این است که اکثرا این نوع دیتابیس ها مورد هجوم حملات sql injection و XSS قرار می گیرند.

نود جی اس به صورت اختصاصی و مدیریت شده با دیتابیس های NoSql کار می کند مانند MongoDB , couchDB و … که هرکدام از طریق NPM در دسترس هستند و می توان به راحتی آنها را نصب و مورد استفاده قرار داد.برای این نوع دیتابیس هم حملات nosql injection وجود دارد ولی نه به اندازه دیتابیس های  رابطه ای  plghj sql injection البته امری طبیعی است در ساختار این نوع از دیتابیس ها از کدهایی استفاده شده است که در برابر اینگونه حملات مقاوم باشند.

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