برنامه نویسی

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

مدیریت همزمانی و موازی سازی در برنامه های PHP

همزمانی و موازی بودن اغلب به جای یکدیگر استفاده می شوند، اما معانی متمایز دارند، به ویژه در زمینه عملکرد برنامه. در برنامه های PHP، مدیریت این مفاهیم به دلیل مدل اجرای همزمان PHP می تواند چالش برانگیز باشد. با این حال، چندین تکنیک و ابزار وجود دارد که بسته به نیازهای برنامه، می‌توان از آنها برای مدیریت همزمان و موازی به طور مؤثر استفاده کرد.


1. همزمانی در مقابل موازی سازی

  • همزمانی به توانایی یک برنامه کاربردی برای رسیدگی به چندین کار به طور همزمان با جابجایی بین آنها اشاره دارد. لزوماً شامل اجرای همزمان وظایف نیست، اما این توهم انجام این کار را، معمولاً با درهم کردن اجرا، ایجاد می کند.
  • موازی سازی به اجرای همزمان چندین کار، به معنای واقعی کلمه به صورت موازی، با استفاده از چندین هسته CPU اشاره دارد.

در PHP، از آنجایی که در درجه اول یک زبان تک رشته ای است، دستیابی به موازی سازی معمولاً به کتابخانه ها یا ابزارهای اضافی نیاز دارد. با این حال، همزمانی را می توان در مدل سنکرون پی اچ پی با رویکرد درست مدیریت کرد.


2. مدیریت همزمانی در PHP

همزمانی در PHP را می توان به روش های مختلفی به دست آورد:

الف استفاده از Multi-Process (Forking) با pcntl_fork()

PHP فراهم می کند pcntl (کنترل فرآیند) پسوند برای مدیریت فرآیندها. این برنامه افزودنی به شما امکان می دهد فرآیندهای جدیدی را که هر کدام می توانند همزمان کار جداگانه ای انجام دهند، انجام دهید.

مثال:


if (pcntl_fork() == -1) {
    die('Could not fork');
} elseif ($pid == 0) {
    // Child process logic
    echo "Child process\n";
    exit;
} else {
    // Parent process logic
    echo "Parent process\n";
    pcntl_wait($status); // Wait for child process to finish
}
?>
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

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

محدودیت ها:

  • این pcntl پسوند در تمام تنظیمات PHP (مثلاً محیط های میزبانی مشترک) در دسترس نیست.
  • برای کارهایی که به دلیل سربار فرآیند نیاز به محاسبات سنگین دارند، ایده آل نیست.

ب با استفاده از pthreads برای چند رشته (منسوخ شده)

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

جایگزین ها: برای نسخه های جدیدتر PHP، باید از تکنیک های مدرن تری مانند parallel (به زیر مراجعه کنید) یا خدمات خارجی مانند صف پیام.


3. مدیریت موازی سازی در PHP

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

الف با استفاده از parallel پسوند (توصیه شده برای PHP 7.2+)

این parallel پسوند یک راه حل مدرن برای چند رشته در PHP است. این به اسکریپت های PHP اجازه می دهد تا وظایف موازی ایجاد کرده و آنها را به طور همزمان در هسته های مختلف CPU اجرا کنند.

مثال:


use parallel\Runtime;
use parallel\Future;

$runtime = new Runtime();

$future = $runtime->run(function () {
    return "Task executed in parallel";
});

echo $future->value();
?>
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این به شما امکان می دهد تا وظایف را به صورت موازی اجرا کنید و از پردازنده های چند هسته ای بهره ببرید. این parallel پسوند بسیار کارآمدتر و راحت تر از آن است pthreads.

مزایا:

  • این توازی واقعی را با نسخه های مدرن PHP ارائه می دهد.
  • API ساده برای اجرای موازی و ارتباط بین رشته ها.

محدودیت ها:

  • این parallel پسوند در همه محیط های PHP در دسترس نیست.
  • در اصل برای PHP خط فرمان طراحی شده است و ممکن است با درخواست های وب به خوبی کار نکند.

ب استفاده از ابزارهای خارجی برای موازی سازی

  • آلمان: Gearman یک سرور شغلی است که می تواند وظایف را بین چندین کارگر توزیع کند. این به برنامه‌های PHP اجازه می‌دهد تا وظایف را به چندین ماشین یا فرآیند بارگذاری کنند و همزمان و موازی‌سازی را فراهم کنند. Gearman برای مشاغلی که می توانند به صورت ناهمزمان توزیع و پردازش شوند به خوبی کار می کند.

  • RabbitMQ: کارگزاران پیام مانند RabbitMQ می توانند به توزیع وظایف بین چندین کارگر کمک کنند. با ارسال وظایف به صف ها، کارگران مختلف می توانند وظایف را همزمان پردازش کنند. این یک راه حل خوب است زمانی که وظایف را می توان مستقل از یکدیگر انجام داد.

  • ReactPHP و Swoole: برای همزمانی رویداد محور، کتابخانه ها مانند ReactPHP و سول می تواند برای انجام وظایف ناهمزمان استفاده شود. ReactPHP به عملیات ورودی/خروجی غیرمسدود اجازه می‌دهد، که می‌تواند درخواست‌های همزمان را در یک برنامه کارآمدتر کند. سول موازی سازی مبتنی بر کوروتین را فراهم می کند و به PHP اجازه می دهد تا چندین رشته اجرا را مدیریت کند.


4. مدیریت I/O همزمان (غیر مسدود کننده)

یکی از حوزه‌های کلیدی که اغلب در برنامه‌های PHP به همزمانی نیاز است، وظایف I/O-bound، مانند کوئری‌های پایگاه داده، فراخوانی‌های API، یا خواندن/نوشتن روی فایل‌ها است. برای غیر مسدود کردن I/O می توانیم از موارد زیر استفاده کنیم:

الف ReactPHP

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

مثال:


require 'vendor/autoload.php';

use React\EventLoop\Factory;
use React\Http\Server;
use React\Http\Response;
use React\Socket\Server as SocketServer;

$loop = Factory::create();

$server = new Server(function (Psr\Http\Message\ServerRequestInterface $request) {
    return new Response(
        200,
        ['Content-Type' => 'text/plain'],
        "Hello World"
    );
});

$socket = new SocketServer('0.0.0.0:8080', [], $loop);
$server->listen($socket);

echo "Server running at http://127.0.0.1:8080\n";

$loop->run();
?>
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در این مثال، ReactPHP اجازه می دهد تا درخواست های HTTP را به طور همزمان بدون مسدود کردن اجرای اصلی مدیریت کند.

ب سول

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


5. ملاحظاتی برای همزمانی و موازی سازی در PHP

در حالی که PHP ذاتاً برای مدیریت همزمانی و موازی سازی ساخته نشده است، این تکنیک ها و کتابخانه ها می توانند به شما در مدیریت چندین کار به صورت همزمان یا موازی کمک کنند. در اینجا چند نکته در هنگام برخورد با همزمانی و موازی سازی در PHP وجود دارد:

  • مدیریت منابع: مدیریت همزمانی و موازی سازی معمولاً به منابع حافظه و CPU بیشتری نیاز دارد، بنابراین باید استفاده از منابع برنامه را از نزدیک نظارت کنید.
  • رسیدگی به خطا: مدیریت خطاها در فرآیندهای همزمان یا موازی می تواند مشکل باشد. مطمئن شوید که استثناها و خطاها را در هر فرآیند یا رشته به درستی مدیریت می کنید.
  • اتصالات پایگاه داده: اگر وظایف موازی شما شامل پرس و جوهای پایگاه داده است، مطمئن شوید که هر فرآیند/رشته اتصال پایگاه داده خود را دارد یا از ادغام اتصال برای جلوگیری از مشاجره استفاده کنید.
  • محیط زیست: برخی از تکنیک های همزمانی و موازی (به عنوان مثال، parallel پسوند، pcntlو غیره) ممکن است در سرورهای وب با زمان اجرا یا حافظه محدود (مانند میزبانی مشترک) کار نکند. این ابزارها معمولاً برای برنامه های PHP مبتنی بر CLI مناسب تر هستند.

نتیجه گیری

هندلینگ همزمانی و موازی سازی در PHP نیاز به درک نحوه عملکرد PHP با چندین فرآیند و رشته دارد. با استفاده از پسوندهایی مانند pcntl، parallel، یا کتابخانه هایی مانند ReactPHP و سول، توسعه دهندگان می توانند چندین کار را همزمان یا به صورت موازی انجام دهند، در نتیجه عملکرد وظایف I/O-bound و CPU را بهبود می بخشند.

انتخاب ابزار مناسب به نیازهای برنامه شما بستگی دارد، مانند اینکه آیا با وظایف I/O-bound (ReactPHP یا Swoole) سر و کار دارید، یا اینکه آیا باید وظایف را در چندین هسته CPU انجام دهید (با استفاده از parallel یا pcntl).

نوشته های مشابه

دیدگاهتان را بنویسید

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

دکمه بازگشت به بالا