برنامهنویسی PHP با مدل Asynchronous (نامتقارن – غیرهمزمان)
۱۷ تیر ۱۳۹۹
در برنامههای PHP، کدها بهصورت متقارن اجرا میشوند. برای درک بهتر اینموضوع، هر خط کد را یک بلاک یا مسدودساز درنظر بگیرید که درهنگام اجرای برنامه، ابتدا خط شماره یک اجرا میشود، درقدم بعد خط شماره دو و اینتوالی به همین شکل تا پایان کدها ثابت میماند. اینیکی از مدلهای برنامهنویسی است که PHP را از زبانهایی مانند Go، NodeJs و چندی دیگر از زبانها متمایز میسازد.
برنامهنویسی با مدل نامتقارن (Asynchronous)، به شما این اجازه را میدهد که بدون انتظار برای انجام عملیات دیگر، کدهای خود را در زمان مورد نیاز، بصورت همزمان اجرا کنید. یک مثال از اتفاقهای واقعی زندگی روزمره ما اهمیت اینمدل را بهتر نمایان میکند: شما یک ایمیل برای دوستان خود میفرستید، بعد از آن به انجام دیگر کارها میپردازید و تا وقتی دوستانتان برای شما پاسخی ارسال نکردند، به سراغ ایمیلهایتان نمیآیید یا به عبارت دیگر شما مجبور نیستید بیکار بمانید تا پاسخی دریافت کنید.
برای دستیابی به اینمدل در وبسرور، شما میتوانید از رشتهها (thread) یا فرایندهای (process) مختلف جداگانه، در زمانی که برنامه شما، درحال انجام کارهای دیگر روی رشته اصلی است، استفاده کنید. برای مثال، یک عملیات را برای اجرا در صف اپلیکیشن لاراولی خود قرار میدهید که به شما اجازه میدهد، در زمانی که فراینداصلی برنامه توان بیشتری از پردازشگر را اشغال کردهاست، عملیات خود را به یک worker process بسپارید.
مقایسه رشته با فرایند (thread vs process):
فرایند یک واحد مجزا، دربخش اجرایی به شمار میآید. فرایندها منابعی از پردازشگر را به خود اختصاص میدهند و آن را با دیگر فرایندها به اشتراک نمیگذارند. بااینحال، یک فرایند واحد میتواند از رشتههای متعددی تشکیل شدهباشد، تمامی رشتهها، بصورت اشتراکی از توان پردازشگر، که به فرایند مورد نظر اختصاص داده شده استفاده میکنند. برای کوتاه تر شدن مقاله، باید بگویم: زبان PHP به کمک افزونه جداگانهای به نام pthreads از برنامهنویسی چندنخی پشتیبانی میکند، درحالحاضر اینافزونه بایگانی شدهاست.
Call stack و Event loop:
برای شروع باید بگویم در زبان فارسی event loop را حلقهرویداد و call stack را فراخوانیپشته مینامند. یکی دیگر از راهحلهای موجود برای دستیابی به مدل برنامهنویسی نامتقارن در PHP، استفاده از حلقهرویداد است. با این دیدگاه به موضوع نگاه کنید که حلقهای مانند یک worker، توابع در صف انتظار برای اجرا را، مداوما دریافت میکند و درصورتی که call stack خالی باشد توابع را اجرا میکند. فراخوانیپشته، یک جریان همزمان عادی در برنامه شماست.
پس بصورت زیر میتوان به مدل اجرای نامتقارن کدها در php دست پیدا کرد:
use Symfony\Component\Process\Process;
$process = new Process(['php', 'artisan', 'task:run']);
$process2 = new Process(['php', 'artisan', 'anothertask:run']);
$process->start();
$process2->start();
// انجام برخی کارها
// سپس منتظر میمانیم فرآیند فرعی تمام شود
while ($process->isRunning() || $process2->isRunning()){
sleep(1);
}
// در پایان پاسخ را برگشت میدهیم
return response();
با استفاده از کدبالا، ما ۲ فرایند فرعی را برای اجرای task:run و anothertask:run توسط artisan، در زمانی که برخی کارها درحال انجام هستند، بوجود آوردهایم. قبل از به انجام رسیدن عملیات پدر، ما برای به اتمام رسیدن عملیات فرزند صبر میکنیم.
این یک مثال ساده، برای پیاده سازی مدل اجرای کدهای نامتقارن است. برای موارد پیشرفتهتر، Spatie یک پکیج به نام spatie/async ساخته است. به کمک این بسته نرمافزاری شما میتوانید، چندین فرایند با مدل نامتقارن، در کدهای PHP خود داشته باشید و همچنین آنها را مدیریت کنید.
فرایند اصلی برنامه شما، فرایندهای فرعی متعددی را شروع میکند و برروی اجرای آنها درحالی که به کار خود ادامه میدهند نظارت دارد. برای مدیریت ارتباط بین فرآیند والد و فرزند از سیگنالهای PHP’s async استفاده میکند. برای اطلاع بیشتر از نحوه کار این بسته، مقاله آقای Brent Roose را مشاهده بفرمایید.
منبع: https://divinglaravel.com/authentication-and-laravel-airlock
توسعهدهندگان دربارهی ما چه میگویند
تجربه کار باliara_cloud@امروز خیلی خوب بود. یکی از سرویس هام رو منتقل کردم روش و راضیم. انقد سریع و جذاب کارم راه افتادم اصن باورم نمیشد! برعکس سرویس های PaaS دیگه با اون همه پیچیدگیشون. دمتون گرم
...
MohammadReza
keikaavousi
بعد از بسته شدن @fandoghpaas و ناراحتی همهمون از اینکه یه سرویس خوب و صادق نمیتونه از پس هزینهها بر بیاد، سرویسم رو منتقل کردم به پاس لیارا (https://liara.ir @liara_cloud) . تجربه راحت و خوب. تفاوتهایی داشت که کمی کار میخواست ولی تا الان کاملا راضی.
jadi
jadi
یه خسته نباشید باید به تصمیمliara_cloud@بگم،
بعد از چندین روز سرکله زدن با سرویس های مشابه بالاخره تصمیم گرفتم لیارا رو امتحان کنم و باور نمیشه ۱۰ دقیقه بیشتر وقت نبرد،
دمتون گرم.
Arch
EbadiDev
واسه سرویس PaaS با اختلاف لیارا بهترین رابط کاربری داره و یکی از مزیتهای سرویس دیتابیسشون اینه که خودشون به صورت دورهای بکآپ میگیرن.
...
Ali Najafi
me_ali_najafi
یکی از کارهای خوبی که جدیداً میکنم اینه که یه دیتابیس روی لیارا میسازم و به پروژه وصل میکنم اینطوری هم خونه و هم محل کار دیتابیس بروز رو دارم و راحت میتونم ادامه بدم کار روliara_cloud@
Navid
1navid
عاشقliara_cloud@شدم درسته در حد AWS نیست ولی خب تجربه خوبی واسه پروژه های داخل ایران ارائه میده، میتونم رو CD هم اجراش کنم
Amir H Shekari
vanenshi