رفتن به متن راهنما
همه‌ی راهنماها

پرسش‌های متداول

پاسخ کوتاه به پرسش‌های رایج دربارهٔ نصب Reqtide، کارهایی که می‌کند و نمی‌کند، خطاها، آزمون، و جای گزارش اشکال یا درخواست قابلیت.

برنامه Reqtide PHP 0.1.0آخرین بررسی زمان خواندن 5 دقیقه

در این صفحه

نصب و وضعیت

آیا در Packagist هست؟

بله: composer require enaxon/reqtide، از نسخهٔ 0.1.0. نصب را ببینید.

آیا برای محیط تولید آماده است؟

ادعایی نمی‌کنیم. نام‌ها و رفتار هنوز ممکن است تغییر کنند و بستهٔ اصلی حالت خود را در یک پردازه نگه می‌دارد. آن را با خط فرمان و در Docker اجرا کرده‌ایم و در laneهای CI زیر PHP-FPM هم آزموده‌ایم. محدودیت‌های Reqtide را ببینید.

با کدام نسخه‌های PHP کار می‌کند؟

نسخهٔ 8.3 یا بالاتر PHP، روی ساخت 64 بیتی. آزمون‌ها و مثال‌ها در Docker روی 8.3، 8.4 و 8.5 اجرا شده‌اند.

آیا به بستهٔ دیگری نیاز دارد؟

خیر. فایل composer.json فقط php و php-64bit را لازم دارد. ابزارهای آزمون در همان بسته هستند.

آیا با Guzzle، PSR-18 یا Symfony HTTP Client کار می‌کند؟

یکپارچگی با Guzzle بستهٔ جداگانه‌ای به نام enaxon/reqtide-guzzle در Packagist است. آن را در Docker و در CI با Guzzle 7.15.5 و PHP 8.3 تا 8.5 روی خط فرمان اجرا کرده‌ایم.

برای PSR-18 و Symfony HTTP Client یکپارچگی‌ای وجود ندارد. فراخوانی با یکی از این client‌ها را باید خودتان در یک پایپ‌لاین (pipeline) بپیچید. درخواست‌های Guzzle با Reqtide و محدودیت‌های Reqtide را ببینید.

آیا از Redis پشتیبانی می‌کند؟

در بستهٔ اصلی نه، چون حالت آن در حافظهٔ یک پردازهٔ PHP است. بستهٔ جداگانهٔ enaxon/reqtide-redis حالت را بین پردازه‌ها مشترک می‌کند. این بسته در Packagist است و در Docker و در CI با Redis 7.4.11 و 8.2.10 و PHP 8.3 تا 8.5 روی خط فرمان و در lane‌های PHP-FPM اجرا شده است. Sentinel، Cluster و Valkey پشتیبانی نمی‌شوند. حالت مشترک با Redis و محدودیت‌های Reqtide را ببینید.

رفتار

آیا POST را تلاش مجدد می‌کند؟

فقط اگر به آن بگویید تکرار فراخوانی ایمن است. تلاش مجدد سه چیز لازم دارد: اعلام ایمنی تکرار برای فراخوانی، سهمیهٔ تلاش مجدد و یک کلاس استثنای قابل تلاش مجدد. Reqtide هیچ‌وقت ایمنی را حدس نمی‌زند و از HTTP چیزی نمی‌داند. شروع به کار را ببینید.

آیا محدودیت‌ها بین worker‌ها یا سرورهای PHP-FPM مشترک‌اند؟

خیر. حالت مخصوص هر پردازه است. پایپ‌لاینی که داخل یک درخواست ساخته شود، هر درخواست را با سهمیهٔ کامل و مدار بسته شروع می‌کند. بستهٔ Redis حالت را بین پردازه‌ها مشترک می‌کند. محدودیت‌های Reqtide را ببینید.

آیا اجرای طولانی یک callback را متوقف می‌کند؟

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

آیا اجرای دقیقاً یک‌بار را تضمین می‌کند؟

خیر. عملیات را طوری طراحی کنید که تکرارش بی‌خطر باشد، یا برایش تلاش مجدد تعریف نکنید.

چرا مهلت یا محدودیت پیش‌فرض ندارد؟

هر پیش‌فرض حدسی دربارهٔ وابستگی شما است. هر عدد را خودتان انتخاب می‌کنید و سازنده می‌گوید کدام تصمیم الزامی هنوز گرفته نشده.

چرا برای فراخوانی‌ای که هرگز اجرا نشد، از محدودیت نرخ من کم شد؟

هزینهٔ نرخ هیچ‌وقت پس داده نمی‌شود. اگر فراخوانی بعد از پذیرش و پیش از ارسال لغو شود، واحد مصرف‌شده برنمی‌گردد. محدودیت‌های Reqtide را ببینید.

خطاها

استثناهای خودم را از تصمیم‌های Reqtide چطور تشخیص بدهم؟

استثناهای شما بدون تغییر بیرون می‌آیند. هر رد شدن از سوی Reqtide یک ReqtideException است. آن‌هایی که تصمیم یک سیاست را توصیف می‌کنند، ProblemCarrier را هم پیاده می‌کنند و یک ReasonCode پایدار و یک Problem پاک‌سازی‌شده دارند. شرط‌هایتان را روی آن‌ها بگذارید، نه روی متن پیام. مدیریت خطا را ببینید.

کد rate.exhausted یا circuit_open یعنی چه؟

محدودیت نرخ یا مدارشکن فراخوانی را پیش از اجرای کد شما رد کرده است. شیء Problem مشخص می‌کند باید صبر کنید، تلاش مجدد کنید یا تنظیم را درست کنید. مدیریت خطا را ببینید.

آزمون

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

از ساعت مجازی و runtime برنامه‌ریزی‌شده در Enaxon\Reqtide\Testing استفاده کنید. زمان فقط وقتی جلو می‌رود که خودتان جلو ببرید، و هر تلاش همان چیزی را برمی‌گرداند که از پیش تعیین کرده‌اید. آزمون با ساعت مجازی را ببینید.

آیا ابزارهای آزمون را در کد محیط تولید به کار ببرم؟

این ابزارها برای آزمون‌اند. در همان بسته می‌آیند، پس در نصب‌های محیط تولید هم هستند، ولی کد محیط تولید نباید آن‌ها را صدا بزند.

مثال‌ها و کمک

آیا مثال‌های کد واقعاً اجرا می‌شوند؟

بله. هر بلوک PHP که در این راهنماها خروجی دارد، از اسکریپتی در examples/ (opens in a new tab) یا در پوشهٔ examples یکی از بسته‌ها آمده است. خروجی ثبت‌شده کنار هر بلوک، خروجی همان اسکریپت است. اسکریپت‌ها در Docker و با خط فرمان اجرا شده‌اند.

فهرست کلاس‌ها و متدها کجاست؟

در سورس. کلاس‌های بستهٔ اصلی در src/ (opens in a new tab) هستند و دو بستهٔ دیگر زیر packages/ (opens in a new tab) پوشهٔ خودشان را دارند.

اشکال را چطور گزارش کنم یا قابلیتی بخواهم؟

یک issue باز کنید (opens in a new tab). داده‌های محرمانه یا داده‌های محیط تولید را در آن نگذارید. مشکل‌های امنیتی را خصوصی گزارش کنید، همان‌طور که در سیاست امنیتی (opens in a new tab) آمده است.