برنامهنویسی 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