English | العربية | বাংলা | Bosanski | Deutsch | Español | Français | हिन्दी | Italiano | 日本語 | 한국어 | मराठी | Português | Русский | Kiswahili | தமிழ் | తెలుగు | Türkçe | اردو | Tiếng Việt | 中文
- পরিচিতি
- ইনস্টলেশন
- ব্যবহার
- কনফিগারেশন
- উন্নত ব্যবহার
- অপ্টিমাইজেশন
- সাধারণ প্যাটার্ন
- সীমাবদ্ধতা
- সমর্থন নির্দেশিকা
- লাইসেন্স - MIT লাইসেন্স
পরিচিতি
Recall হল Laravel-এর জন্য একটি উচ্চ-দক্ষতা Redis ক্লায়েন্ট-সাইড ক্যাশিং প্যাকেজ। এটি Redis 6-এর ক্লায়েন্ট-সাইড ক্যাশিং বৈশিষ্ট্যটি স্বয়ংক্রিয় অশুদ্ধতার সাথে ব্যবহার করে Redis-এর রাউন্ড ট্রিপ এবং ল্যাটেন্সি নাটকীয়ভাবে কমাতে। বিশেষভাবে Laravel Octane পরিবেশের জন্য তৈরি, এটি APCu বা Swoole Table ব্যবহার করে একটি স্থানীয় ক্যাশ লেয়ার হিসাবে, যা অশুদ্ধতার বার্তার মাধ্যমে Redis-এর সাথে সিঙ্ক্রোনাইজ থাকে।
যখন আপনি Redis থেকে একটি মান এনেছেন, Recall তা স্থানীয়ভাবে সংরক্ষণ করে। যখন সেই মানটি Redis-এ পরিবর্তিত হয় (যেকোন ক্লায়েন্ট থেকে), Redis স্বয়ংক্রিয়ভাবে Recall-কে স্থানীয় কপি অশুদ্ধ করার জন্য জানায়। এটি আপনাকে ইন-মেমরি ক্যাশিংয়ের গতি দেয় Redis-এর সংগতি গ্যারান্টির সাথে।
মূল বৈশিষ্ট্য
- স্বয়ংক্রিয় অশুদ্ধতা: ক্যাশ করা কীগুলি পরিবর্তিত হলে Redis আপনার অ্যাপ্লিকেশনকে জানায়, ক্যাশ কনসিস্টেন্সি নিশ্চিত করে
- জিরো কনফিগারেশন: যুক্তিসঙ্গত ডিফল্ট নিয়ে বাক্স থেকে বেরিয়ে আসে
- Octane ইন্টিগ্রেশন: স্বয়ংক্রিয় সংযোগ উষ্ণীকরণ, অনুরোধ-ভিত্তিক অশুদ্ধতা প্রক্রিয়াকরণ, এবং সুন্দরভাবে বন্ধ করা
- ডুয়াল ড্রাইভার সমর্থন: সমস্ত Octane সার্ভারের জন্য APCu, Swoole/OpenSwoole পরিবেশের জন্য Swoole Table
- নির্বাচনী ক্যাশিং: স্থানীয়ভাবে ক্যাশ করার জন্য কোন কী প্রিফিক্স কনফিগার করুন
- রেস কন্ডিশন সুরক্ষা: মুলতুবি অনুরোধ ট্র্যাকিং স্বতন্ত্র অশুদ্ধতার সময় পুরানো তথ্য ক্যাশ করতে বাধা দেয়
উদাহরণ
// ক্যাশ ড্রাইভার হিসেবে Recall কনফিগার করুন// config/cache.php'stores' => [ 'recall' => [ 'driver' => 'recall', ],], // এটি যে কোনও Laravel ক্যাশের মতো ব্যবহার করুনuse Illuminate\Support\Facades\Cache; // প্রথম কল: Redis থেকে নিয়ে আসে, স্থানীয়ভাবে সংরক্ষণ করে$user = Cache::store('recall')->get('user:1'); // পরবর্তী কল: স্থানীয় APCu/Swoole Table (মাইক্রোসেকেন্ড) থেকে দেওয়া হয়$user = Cache::store('recall')->get('user:1'); // যখন user:1 কোথাও আপডেট হয়, Redis Recall-কে স্থানীয় কপি অশুদ্ধ করার জন্য জানায়Cache::store('recall')->put('user:1', $newUserData, 3600);// সমস্ত কর্মীদের উপর স্থানীয় ক্যাশ স্বয়ংক্রিয়ভাবে অশুদ্ধ হয়
ইনস্টলেশন
Composer-এর মাধ্যমে প্যাকেজটি ইনস্টল করুন:
composer require defectivecode/laravel-recall
প্রয়োজনীয়তা
- PHP >= 8.4
- Laravel 11.x অথবা 12.x
- Laravel Octane
- Redis 6.0+ (ক্লায়েন্ট-সাইড ক্যাশিং সমর্থনের জন্য)
- ext-apcu অথবা ext-swoole (স্থানীয় ক্যাশের জন্য অন্তত একটি প্রয়োজন)
ব্যবহার
বেসিক সেটআপ
- আপনার
config/cache.phpএ Recall ক্যাশ স্টোর যোগ করুন:
'stores' => [ // ... অন্যান্য স্টোর 'recall' => [ 'driver' => 'recall', ],],
- আপনার অ্যাপে ক্যাশ স্টোর ব্যবহার করুন:
use Illuminate\Support\Facades\Cache; // একটি মান সংরক্ষণ করুন (Redis-এ লেখে)Cache::store('recall')->put('key', 'value', 3600); // একটি মান অনুসন্ধান করুন (প্রথম কল Redis-এ হিট করে, পরবর্তী কলগুলি স্থানীয় ক্যাশ ব্যবহার করে)$value = Cache::store('recall')->get('key'); // একটি মান মুছুনCache::store('recall')->forget('key');
কিভাবে এটি কাজ করে
- প্রথম পড়া: মানটি Redis থেকে আনে এবং স্থানীয় APCu/Swoole Table ক্যাশে সংরক্ষণ করে
- পরবর্তী পড়া: মানটি সরাসরি স্থানীয় মেমরির থেকে (সাব-মিলিসেকেন্ড) পরিবেশন করা হয়
- যে কোন জায়গায় লিখুন: যখন কোন ক্লায়েন্ট Redis-এ কীটি পরিবর্তন করে, Redis একটি অশুদ্ধতা বার্তা পাঠায়
- স্বয়ংক্রিয় অশুদ্ধতা: Recall বার্তাটি গ্রহণ করে এবং স্থানীয় ক্যাশ থেকে কী মুছে ফেলে
- পরবর্তী পড়া: নতুন মানটি Redis থেকে পুনরায় আনা হয় এবং পুনরায় স্থানীয়ভাবে ক্যাশ করা হয়
এই প্যাটার্নটি বিশেষভাবে শক্তিশালী Laravel Octane পরিবেশে যেখানে কর্মীরা অনুরোধের মধ্যে স্থায়ী থাকে, স্থানীয় ক্যাশটি তৈরি করতে এবং অনেক অনুরোধ মেমরি থেকে পরিবেশন করতে সক্ষম হয়।
Octane ইন্টিগ্রেশন
Recall উপলব্ধ থাকলে Laravel Octane-এর সাথে স্বয়ংক্রিয়ভাবে ইন্টিগ্রেট হয়:
- কর্মী শুরু: Redis অশুদ্ধতা সংযোগ স্থাপন করে (উষ্ণ শুরু)
- অনুরোধ প্রাপ্ত: কোনও মুলতুবি অশুদ্ধতা বার্তা প্রক্রিয়া করে
- কর্মী বন্ধ করা: সুন্দরভাবে সংযোগ বন্ধ করে
কোনও অতিরিক্ত কনফিগারেশন প্রয়োজন। Octane ইনস্টল করা হলে ইন্টিগ্রেশন স্বয়ংক্রিয়।
কনফিগারেশন
কনফিগারেশন ফাইল প্রকাশ করুন:
php artisan vendor:publish --tag=recall-config
এটি config/recall.php তৈরি করে নিম্নলিখিত বিকল্পগুলির সাথে:
সক্ষম/অক্ষম
'enabled' => env('RECALL_ENABLED', true),
যখন অক্ষম হয়, Recall সরাসরি Redis-এ চলে যায় স্থানীয় ক্যাশ লেয়ার ব্যবহার না করে। ডিবাগিং বা ধীরে ধীরে রোলআউটের জন্য উপকারী।
Redis স্টোর
'redis_store' => env('RECALL_REDIS_STORE', 'redis'),
Redis অপারেশনের জন্য ব্যবহৃত Laravel ক্যাশ স্টোরটি। এটি আপনার config/cache.php এ কনফিগার করা Redis স্টোরের সাথে উল্লেখ করা উচিত।
ক্যাশ প্রিফিক্স
'cache_prefixes' => [],
এই প্রিফিক্সগুলি স্থানীয়ভাবে ক্যাশ করা কীগুলি শুধুমাত্র। সমস্ত কীগুলি ক্যাশ করতে খালি ছেড়ে দিন।
// শুধুমাত্র ব্যবহারকারী এবং সেটিংস কীগুলি স্থানীয়ভাবে ক্যাশ করুন'cache_prefixes' => ['users:', 'settings:', 'config:'],
এটি তখন কার্যকর যখন আপনার উচ্চ-ভলিউম কীগুলি প্রায়ই পরিবর্তিত হয় এবং স্থানীয়ভাবে ক্যাশ করা উচিত নয়।
স্থানীয় ক্যাশ কনফিগারেশন
'local_cache' => [ // ড্রাইভার: "apcu" বা "swoole" 'driver' => env('RECALL_LOCAL_DRIVER', 'apcu'), // স্থানীয় ক্যাশ কীগুলির জন্য প্রিফিক্স 'key_prefix' => env('RECALL_LOCAL_PREFIX', 'recall:'), // ডিফল্ট TTL সেকেন্ডে (অশুদ্ধতা মিস হলে নিরাপত্তা নিচে) 'default_ttl' => (int) env('RECALL_LOCAL_TTL', 3600), // Swoole Table আকার (2 এর শক্তি, শুধুমাত্র swoole ড্রাইভারের জন্য) 'table_size' => (int) env('RECALL_SWOOLE_TABLE_SIZE', 65536), // Swoole Table এ সর্বাধিক বাইট প্রতি মান (শুধুমাত্র swoole ড্রাইভারের জন্য) 'value_size' => (int) env('RECALL_SWOOLE_VALUE_SIZE', 8192),],
APCu ড্রাইভার (ডিফল্ট)
APCu ড্রাইভার সমস্ত PHP পরিবেশ এবং Octane সার্ভার (Swoole, RoadRunner, FrankenPHP) এর সাথে কাজ করে। এটি ক্যাশ করা মানগুলিকে শেয়ার করা মেমরিতে সংরক্ষণ করে যা সমস্ত PHP প্রক্রিয়ার জন্য অ্যাক্সেসযোগ্য।
প্রয়োজনীয়তা:
- ext-apcu ইনস্টল করা এবং সক্ষম
- CLI ব্যবহারের জন্য php.ini তে
apc.enable_cli=1
Swoole Table ড্রাইভার
Swoole Table ড্রাইভার Swoole-এর শেয়ার করা মেমরি টেবিলগুলি ব্যবহার করে, একই কর্মীটির মধ্যে সহানুভূতির মধ্যে সঙ্গতিপূর্ণ অ্যাক্সেস প্রদান করে। Swoole/OpenSwoole পরিবেশের জন্য সেরা।
কনফিগারেশন টিপস:
table_size: অবশ্যই 2 এর শক্তি হতে হবে (যেমন, 65536, 131072)। সর্বাধিক এন্ট্রির সংখ্যা নির্ধারণ করে।value_size: সিরিয়ালাইজ করা মানগুলির জন্য সর্বাধিক বাইট। বৃহত্তর মানগুলি নীরবে কাটা হয়।
Octane লিসেনার
'listeners' => [ // কর্মী শুরুতে উষ্ণ সংযোগ (প্রথম অনুরোধের ল্যাটেন্সি কমায়) 'warm' => env('RECALL_LISTEN_WARM', true), // টিক ইভেন্টগুলিতে অশুদ্ধতা প্রক্রিয়া (অধিক প্রতিক্রিয়াশীল, সামান্য অতিরিক্ত ব্যয়) 'tick' => env('RECALL_LISTEN_TICK', false),],
উষ্ণ সংযোগ
যখন সক্ষম করা হয়, Recall Octane কর্মী শুরু হলে Redis অশুদ্ধতা সাবস্ক্রিপশন স্থাপন করে। এটি প্রথম অনুরোধে সংযোগের ল্যাটেন্সি কমায়।
টিক প্রক্রিয়াকরণ
যখন সক্ষম করা হয়, Recall অনুরোধের ইভেন্টগুলির পাশাপাশি Octane টিক ইভেন্টগুলিতে অশুদ্ধতা বার্তা প্রক্রিয়া করে। এটি সামান্য অতিরিক্ত ব্যয়ের বিপরীতে আরও প্রতিক্রিয়াশীল ক্যাশ অশুদ্ধতা প্রদান করে।
উন্নত ব্যবহার
ম্যানুয়াল অশুদ্ধতা প্রক্রিয়াকরণ
যদি আপনাকে ম্যানুয়ালি অশুদ্ধতা প্রক্রিয়া করতে হয় (যেমন, একটি দীর্ঘস্থায়ী প্রক্রিয়ায়):
use DefectiveCode\Recall\RecallManager; $manager = app(RecallManager::class);$manager->processInvalidations();
স্থানীয় ক্যাশ ফ্লাশ করা
Redis প্রভাবিত না করে শুধুমাত্র স্থানীয় ক্যাশ পরিষ্কার করতে:
use DefectiveCode\Recall\RecallManager; $manager = app(RecallManager::class);$manager->flushLocalCache();
সংযোগ ব্যবস্থাপনা
use DefectiveCode\Recall\RecallManager; $manager = app(RecallManager::class); // চেক করুন যে অশুদ্ধতা সাবস্ক্রিপশন সংযুক্ত আছে কিনাif ($manager->isConnected()) { // ...} // ম্যানুয়ালি সংযোগ বিচ্ছিন্ন করুন$manager->disconnect();
অপ্টিমাইজেশন
কর্মী অনুরোধ সীমা
Laravel Octane কনফিগারযোগ্য অনুরোধের সংখ্যা পরে কর্মীদের চক্রাবর্তন করে মেমরি লিক প্রতিরোধ করতে। যখন একটি কর্মী চক্রকাল স্থির হয়, তার স্থানীয় ক্যাশ পরিষ্কার হয়। এই সীমাটি বাড়ালে Recall-এর স্থানীয় ক্যাশ দীর্ঘ সময়ের জন্য স্থায়ী হতে দেয়, ক্যাশ হিটের হার উন্নত করে।
আপনার config/octane.php এ:
// চক্রাবর্তনের আগে ডিফল্ট 500 অনুরোধ'max_requests' => 10000,
উচ্চ মানের অর্থ সবচেয়ে ভাল ক্যাশ ব্যবহার কিন্তু আপনার অ্যাপ্লিকেশন যে মেমরি লিক নেই সে বিষয়ে আত্মবিশ্বাসের প্রয়োজন। এই মানটি পরিবর্তন করার সময় আপনার কর্মীর মেমরি ব্যবহারের নজর রাখুন।
প্রিফিক্স দ্বারা নির্বাচনী ক্যাশিং
স্থানীয়ভাবে যে কীগুলি ক্যাশ করা হয় তা নিয়ন্ত্রণ করতে cache_prefixes ব্যবহার করুন। এটি তখন মূল্যবান যখন:
- উচ্চ-চারণ কীগুলি: কিছু কী এত দ্রুত পরিবর্তিত হয় যে স্থানীয় ক্যাশিং সামান্য উপকার দেয়
- বৃহৎ মান: ছোট, প্রায়ই-পঠিত কীগুলি কেবল ক্যাশ করে মেমরি চাপ কমান
- সংবেদনশীল ডেটা: সুরক্ষা বা সম্মতি কারণে কিছু ডেটা শুধুমাত্র Redis-এ রাখুন
// config/recall.php'cache_prefixes' => [ 'users:', // স্থানীয়ভাবে ব্যবহারকারীর তথ্য ক্যাশ করুন 'settings:', // অ্যাপ্লিকেশনের সেটিংস ক্যাশ করুন 'products:', // পণ্য তালিকা ক্যাশ করুন],
এই প্রিফিক্সগুলির সাথে মেলানো না হওয়া কীগুলি এখনও কাজ করবে কিন্তু স্থানীয় ক্যাশিং পাশ করবে, সরাসরি Redis-এ যাবে।
মেমরি বিবেচনা
APCu মেমরি
APCu সমস্ত PHP প্রক্রিয়ার মধ্যে মেমরি শেয়ার করে। php.ini এ মেমরি সীমা কনফিগার করুন:
; ডিফল্ট 32MB, বৃহত্তর ক্যাশ প্রয়োজনের জন্য বাড়ানapc.shm_size = 128M
apcu_cache_info() দিয়ে APCu ব্যবহারের নজর রাখুন:
$info = apcu_cache_info();$memory = $info['mem_size']; // বর্তমান মেমরির ব্যবহার বাইটে
Swoole Table আকার
Swoole Tables তৈরি করার সময় নির্ধারিত নির্দিষ্ট ক্ষমতা থাকে। আপনার প্রত্যাশিত ক্যাশ আকারের জন্য পরিকল্পনা করুন:
'local_cache' => [ // সর্বাধিক এন্ট্রি (2 এর শক্তি হতে হবে) 'table_size' => 65536, // 64K এন্ট্রি // বাইটে সর্বাধিক সিরিয়ালাইজড মানের আকার 'value_size' => 8192, // প্রতিটি মানের জন্য 8KB],
মেমরি ব্যবহারের হিসাব: table_size × (value_size + overhead)। একটি 65536 এন্ট্রি এবং 8KB মানের টেবিল প্রায় 512MB ব্যবহার করে।
সাধারণ প্যাটার্ন
অ্যাপ্লিকেশন কনফিগারেশন
// ক্যাশ বৈশিষ্ট্যের পতাকা এবং সেটিংস$features = Cache::store('recall')->remember('config:features', 3600, function () { return Feature::all()->pluck('enabled', 'name')->toArray();}); // যখন সেটিংস পরিবর্তিত হয়, সমস্ত কর্মীরা স্বয়ংক্রিয়ভাবে আপডেট পায়
প্রায়শই অ্যাক্সেস করা রেফারেন্স ডেটা
// পণ্য শ্রেণী ক্যাশ করুন$categories = Cache::store('recall')->remember('categories:all', 3600, function () { return Category::with('children')->whereNull('parent_id')->get();}); // মুদ্রার বিনিময় হার ক্যাশ করুন$rates = Cache::store('recall')->remember('rates:exchange', 300, function () { return ExchangeRate::all()->pluck('rate', 'currency')->toArray();});
ক্যাশ ট্যাগগুলোর বিকল্প
Recall ক্যাশ ট্যাগগুলি সমর্থন করে না, তবে আপনি প্রিফিক্সের সাহায্যে একই কার্যকারিতা অর্জন করতে পারেন:
// ট্যাগের পরিবর্তে, উপযুক্ত প্রিফিক্স ব্যবহার করুনCache::store('recall')->put("blog:posts:{$id}", $post, 3600);Cache::store('recall')->put("blog:comments:{$postId}", $comments, 3600); // প্রিফিক্স দ্বারা সমস্ত ব্লগ-সম্পর্কিত ক্যাশ মুছুন (ম্যানুয়াল বাস্তবায়ন প্রয়োজন)// অথবা ডেটা পরিবর্তিত হলে স্বয়ংক্রিয় অশুদ্ধতায় নির্ভর করুন
সীমাবদ্ধতা
Redis ক্লাস্টার মোড
Recall Redis ক্লাস্টার মোড সমর্থন করে না। CLIENT TRACKING আদেশের REDIRECT বিকল্পটির জন্য ডেটা সংযোগ এবং অশুদ্ধতাকারী সাবস্ক্রাইবার সংযোগকে একই Redis নোডে থাকতে হবে। একটি ক্লাস্টারে, কীগুলি হ্যাশ স্লটের ভিত্তিতে একাধিক নোডের মধ্যে বিতরণ করা হয়, এটি বিভিন্ন নোডে সংরক্ষিত কীগুলির জন্য অশুদ্ধতা প্রাপ্তিকে অসম্ভব করে তোলে।
ক্লাস্টারযুক্ত Redis স্থানে, বিবেচনা করুন:
- ক্লায়েন্ট-সাইড ক্যাশিংয়ের সুবিধা পেতে ক্যাশ করা ডেটার জন্য একটি একক Redis ইনস্ট্যান্স ব্যবহার করা
- অন্যান্য ডেটার জন্য Redis ক্লাস্টার ব্যবহার করুন যখন প্রায়শই-পঠিত স্থিতিশীল ডেটাগুলি একটি স্বতন্ত্র ইনস্ট্যান্সে রাখা হয়
সমর্থন নির্দেশিকা
আমাদের ওপেন সোর্স প্যাকেজটি নির্বাচন করার জন্য ধন্যবাদ! দয়া করে এই সমর্থন নির্দেশিকাগুলি অন্বেষণ করতে একটি মুহূর্ত নিন। এগুলি আপনাকে আমাদের প্রকল্প থেকে সর্বাধিক উপকার পেতে সহায়তা করবে।
সম্প্রদায়ের দ্বারা পরিচালিত সমর্থন
আমাদের ওপেন-সোর্স প্রকল্পটি আমাদের অসাধারণ সম্প্রদায় দ্বারা চালিত। আপনার যদি প্রশ্ন থাকে অথবা সহায়তার প্রয়োজন হয়, StackOverflow এবং অন্যান্য অনলাইন সম্পদ আপনার জন্য সেরা।
ত্রুটি এবং বৈশিষ্ট্য অগ্রাধিকার
একটি ওপেন-সোর্স প্রকল্প পরিচালনার বাস্তবতা মানে আমরা প্রতিবেদন করা প্রতিটি ত্রুটি বা বৈশিষ্ট্য অনুরোধ অবিলম্বে সমাধান করতে পারি না। আমরা সমস্যা সমাধানে নিম্নলিখিত ক্রমে অগ্রাধিকার দিই:
১. আমাদের অর্থপ্রদান করা পণ্যগুলি প্রভাবিতকারী ত্রুটি
যে ত্রুটিগুলি আমাদের অর্থপ্রদান করা পণ্যে প্রভাব ফেলে সেগুলি সর্বদা আমাদের শীর্ষ অগ্রাধিকার। কিছু ক্ষেত্রে, আমরা শুধু সেই ত্রুটিগুলি সমাধান করতে পারি যা আমাদের সরাসরি প্রভাবিত করে।
২. সম্প্রদায়ের পুল রিকুইস্ট
যদি আপনি একটি ত্রুটি সনাক্ত করেছেন এবং তার সমাধান আছে, তাহলে দয়া করে একটি পুল রিকুইস্ট জমা দিন। আমাদের পণ্যগুলিকে প্রভাবিতকারী সমস্যাগুলোর পরে, আমরা এই সম্প্রদায়-চালিত সমাধানগুলিতে পরবর্তী সর্বাধিক অগ্রাধিকার দিই। একবার পর্যালোচনা করে অনুমোদিত হলে, আমরা আপনার সমাধানটি একত্রিত করবো এবং আপনার অবদানের জন্য কৃতিত্ব দেবো।
৩. আর্থিক সমর্থন
উল্লেখিত বিভাগগুলির বাইরের সমস্যার জন্য, আপনি তাদের সমাধানের জন্য অর্থায়ন করতে পারেন। প্রতিটি ওপেন ইস্যু একটি অর্ডার ফরমের সাথে সংযুক্ত, যেখানে আপনি আর্থিকভাবে অবদান রাখতে পারেন। আমরা প্রদত্ত অর্থায়ন পরিমাণ অনুযায়ী এই সমস্যাগুলিতে অগ্রাধিকার দিই।
সম্প্রদায়ের অবদান
ওপেন সোর্স তখনই পুষ্টি পায় যখন এর সম্প্রদায় সক্রিয় থাকে। আপনি যদি ত্রুটি সমাধান না-ও করেন, তবুও কোড উন্নয়ন, ডকুমেন্টেশন আপডেট, টিউটোরিয়াল, অথবা সম্প্রদায়ের চ্যানেলে অন্যদের সহায়তা করার মাধ্যমে অবদান রাখার কথা বিবেচনা করুন। আমরা সবাইকে, একটি সম্প্রদায় হিসেবে, ওপেন-সোর্স কাজ সমর্থনে সহায়তা করতে তীব্রভাবে উৎসাহিত করি।
আবার উল্লেখ করতে, DefectiveCode আমাদের অর্থপ্রদান করা পণ্যগুলিতে ত্রুটিগুলির প্রভাব, সম্প্রদায়ের পুল রিকুইস্ট এবং সমস্যার জন্য প্রাপ্ত আর্থিক সমর্থনের ভিত্তিতে ত্রুটিগুলিকে অগ্রাধিকার দেবে.
লাইসেন্স - MIT লাইসেন্স
কপিরাইট © Defective Code, LLC। সকল অধিকার সংরক্ষিত
এই সফ্টওয়্যার এবং সংশ্লিষ্ট ডকুমেন্টেশন ফাইল (যাকে "সফ্টওয়্যার" বলা হয়) এর একটি কপি প্রাপ্ত যেকোনো ব্যক্তিকে বিনা শর্তে, বিনামূল্যে, সফ্টওয়্যারটি ব্যবহার, কপি, পরিবর্তন, মিশ্রণ, প্রকাশ, বিতরণ, উপলাইসেন্স এবং/অথবা সফ্টওয়্যার-এর কপি বিক্রি করার অধিকার দেওয়া হয়, এবং যাদের কাছে সফ্টওয়্যারটি প্রদান করা হয় তাদের এটি করতে অনুমতি দেওয়া হয়, নিম্নলিখিত শর্তাবলীর অধীনে:
উপরে উল্লিখিত কপিরাইট নোটিস এবং এই অনুমতি নোটিস সমস্ত কপি বা সফ্টওয়্যার-এর গুরুত্বপূর্ণ অংশে অন্তর্ভুক্ত করা হবে।
সফ্টওয়্যারটি "যেমন আছে" প্রদান করা হয়, কোন প্রকারের গ্যারান্টি ছাড়া, স্পষ্ট বা অভ্যাসগত, যার মধ্যে আছে কিন্তু সীমিত নয় বাণিজ্যযোগ্যতা, নির্দিষ্ট উদ্দেশ্যের জন্য উপযুক্ততা এবং অধিকার লঙ্ঘনের গ্যারান্টি। কোনো পরিস্থিতিতেই লেখক বা কপিরাইট অধিকারীরা সফ্টওয়্যার বা সফ্টওয়্যার ব্যবহারের সাথে সংশ্লিষ্ট যেকোনো দাবি, ক্ষতি বা অন্যান্য দায়বদ্ধতার জন্য দায়ী থাকবে না, তা চুক্তির একটি পদক্ষেপ, অপ্রীতিকর বা অন্যথায় হোক।