ডেভেলপমেন্টের আগে পড়ুন

Workerman ব্যবহার করে অ্যাপ্লিকেশন ডেভেলপ করতে, আপনাকে নিচের বিষয়গুলো জানতে হবে:

এক, Workerman ডেভেলপমেন্ট এবং সাধারণ PHP ডেভেলপমেন্টের মধ্যে পার্থক্য

HTTP প্রোটোকলের সাথে সম্পর্কিত ভেরিয়েবল ফাংশন সরাসরি ব্যবহার করা সম্ভব না হলেও, Workerman ডেভেলপমেন্ট এবং সাধারণ PHP ডেভেলপমেন্টের মধ্যে তেমন কিছু পার্থক্য নেই।

1, অ্যাপ্লিকেশন স্তরের প্রোটোকল ভিন্নতা

  • সাধারণ PHP ডেভেলপমেন্ট সাধারণত HTTP অ্যাপ্লিকেশন স্তরের প্রোটোকলের উপর ভিত্তি করে, WebServer ইতিমধ্যেই ডেভেলপারকে প্রোটোকলের বিশ্লেষণ সম্পন্ন করে দিয়েছে।
  • Workerman বিভিন্ন প্রোটোকল সমর্থন করে, বর্তমানের মধ্যে HTTP, WebSocket প্রোটোকল অন্তর্ভুক্ত। Workerman ডেভেলপারদের আরও সহজ সাঁকো প্রোটোকল যোগাযোগের জন্য ব্যবহারের পরামর্শ দেয়।

2, অনুরোধের চক্রের পার্থক্য

  • PHP ওয়েব অ্যাপ্লিকেশনে একবার অনুরোধ হলে সব ভেরিয়েবল এবং সম্পদ মুক্ত হয়ে যায়।
  • Workerman ডেভেলপ করা অ্যাপ্লিকেশন প্রথমবার লোড হওয়ার পর মেমরিতে স্থায়ী থাকে, ফলে ক্লাসের সংজ্ঞা, গ্লোবাল অবজেক্ট, ক্লাসের স্ট্যাটিক সদস্য মুক্ত হয় না, যা পরবর্তী পুনরায় ব্যবহারের জন্য সুবিধাজনক।

3, ক্লাস এবং কনস্ট্যান্টের পুনরাবৃত্তি সংজ্ঞা এড়িয়ে চলুন

  • যেহেতু Workerman কম্পাইল করা PHP ফাইল ক্যাশ করে, তাই একই ক্লাস বা কনস্ট্যান্টের সংজ্ঞার ফাইল পুনরায় require/include করার চেষ্টা করবেন না। ফাইল লোড করতে require_once/include_once ব্যবহার করার পরামর্শ দেওয়া হয়।

4, সিঙ্গেলটন প্যাটার্নের সংযোগ সম্পদের মুক্তির বিষয়ে সতর্ক হোন

  • যেহেতু Workerman প্রতি অনুরোধের পর গ্লোবাল অবজেক্ট এবং ক্লাসের স্ট্যাটিক সদস্য মুক্ত করে না, ডাটাবেজের মতো সিঙ্গেলটন প্যাটার্নে, সাধারণত ডাটাবেজের ইনস্ট্যান্স (যার মধ্যে একটি ডাটাবেজ সোকেট সংযোগ থাকে) ডাটাবেজের স্ট্যাটিক সদস্যে সংরক্ষণ করা হয়, ফলে Workerman প্রক্রিয়ার জীবনচক্র জুড়ে এই ডাটাবেজ সোকেট সংযোগটি পুনরায় ব্যবহার করে। লক্ষ্য রাখতে হবে যে, যখন ডাটাবেজ সার্ভার দেখবে যে একটি সংযোগ নির্দিষ্ট সময়ে সক্রিয় নেই তখন এটি সক্রিয়ভাবে সোকেট সংযোগ বন্ধ করতে পারে, তখন আবার সেই ডাটাবেজ ইনস্ট্যান্স ব্যবহার করলে একটি ত্রুটি পাওয়া যাবে, (ত্রুটির তথ্য mysql gone away এর মতো)। Workerman একটি ডাটাবেজ ক্লাস প্রদান করেছে, যা পুনরায় সংযোগের কার্যকারিতা রয়েছে, ডেভেলপাররা এটি সরাসরি ব্যবহার করতে পারেন।

5, exit, die নির্দেশনা ব্যবহার করবেন না

  • Workerman PHP কমান্ড লাইন মোডে চলে, যখন exit, die নির্দেশনা কল করা হয়, তখন বর্তমান প্রক্রিয়া বন্ধ হয়ে যায়। যদিও সাব-প্রক্রিয়া বন্ধ হওয়ার পর ফোরেন্ডে একটি নতুন সাব-প্রক্রিয়া পুনরায় তৈরি হয় এবং পরিষেবা অব্যাহত রাখে, তবুও এটি ব্যবসায়ে প্রভাব ফেলতে পারে।

6, কোড পরিবর্তন করার পর পরিষেবা পুনরায় চালু করতে হবে

যেহেতু Workerman মেমরিতে অবস্থিত, php ক্লাস বা ফাংশনের সংজ্ঞা একবার লোড হলে মেমরিতে স্থায়ী থাকে, এটি আর ডিস্ক থেকে পুনরায় লোড হবে না, তাই প্রতিবার ব্যবসায়ের কোড পরিবর্তন করার পর পরিষেবা পুনরায় চালু করতে হবে।

দুই, জানার জন্য মৌলিক ধারণাগুলি

1, TCP ট্রান্সপোর্ট লেয়ার প্রোটোকল

TCP একটি সংযোগ ভিত্তিক, নির্ভরযোগ্য, IP ভিত্তিক ট্রান্সপোর্ট লেয়ার প্রোটোকল। TCP ট্রান্সপোর্ট লেয়ার প্রোটোকলের একটি গুরুত্বপূর্ণ বৈশিষ্ট্য হল TCP ডেটা প্রবাহের উপর ভিত্তি করে, ক্লায়েন্টের অনুরোধ সার্ভারে নিরলসভাবে পাঠানো হয়, সার্ভারে প্রাপ্ত ডেটা হয়তো একটি সম্পূর্ণ অনুরোধ নয়, অথবা একাধিক অনুরোধ একসঙ্গে থাকতে পারে। তাই আমাদের এই নিরলস ডেটা প্রবাহে প্রতিটি অনুরোধের সীমানা আলাদা করতে হবে। এবং অ্যাপ্লিকেশন স্তরের প্রোটোকলের উদ্দেশ্য হল অনুরোধের সীমার জন্য একটি নিয়মাবলী সংজ্ঞায়িত করা, যাতে অনুরোধের ডেটা গণ্ডগোণ্ড না হয়।

2, অ্যাপ্লিকেশন স্তরের প্রোটোকল

অ্যাপ্লিকেশন স্তরের প্রোটোকল (application layer protocol) বিভিন্ন শেষ সিস্টেমে (ক্লায়েন্ট, সার্ভার) চলমান অ্যাপ্লিকেশন প্রক্রিয়াগুলি কিভাবে একযোগে বার্তা আদান প্রদান করে তা সংজ্ঞায়িত করে, যেমন HTTP, WebSocket অ্যাপ্লিকেশন স্তরের প্রোটোকল। একটি সাধারণ অ্যাপ্লিকেশন স্তরের প্রোটোকল এরূপ হতে পারে {"module":"user","action":"getInfo","uid":456}\n"। এই প্রোটোকলটি "\n" দ্বারা (দয়া করে মনে রাখবেন যে এখানে "\n" স্ট্রিংয়ের ব্রেক নির্দেশিত করে) অনুরোধের শেষ চিহ্নিত করে, বার্তা শরীরটি স্ট্রিং।

3, শর্ট কানেকশন

শর্ট কানেকশন এর অর্থ হল যোগাযোগের সময় উভয় পক্ষ একটি সংযোগ প্রতিষ্ঠা করে, ডেটা পাঠানো শেষ হলে এই সংযোগ বিচ্ছিন্ন হয়ে যায়, অর্থাৎ প্রতিটি সংযোগ শুধুমাত্র একটি ব্যবসায়িক কার্যকলাপ সম্পন্ন করে। সাধারণভাবে ওয়েব সাইটের HTTP পরিষেবাগুলিতে শর্ট কানেকশন ব্যবহার করা হয়।

শর্ট কানেকশন অ্যাপ্লিকেশন ডেভেলপমেন্টের জন্য মৌলিক ডেভেলপমেন্ট প্রক্রিয়া অধ্যায়ের দিকে তাকান

4, লং কানেকশন

লং কানেকশন, বোঝাচ্ছে একটি সংযোগে একাধিক ডেটা প্যাকেট ধারাবাহিকভাবে পাঠানো সম্ভব।

মনে রাখবেন: লং কানেকশন অ্যাপ্লিকেশনের জন্য হার্টবিট যুক্ত করা আবশ্যক, অন্যথায় সংযোগ দীর্ঘ সময় নিষ্ক্রিয় থাকার কারণে রাউটার নোড ফায়ারওয়াল দ্বারা বিচ্ছিন্ন হতে পারে।

লং কানেকশন সাধারণত ঘন ঘন অপারেশন, পয়েন্ট-টু-পয়েন্ট যোগাযোগের পরিস্থিতিতে ব্যবহৃত হয়। প্রতিটি TCP সংযোগ তিনটি স্টেপ প্যাকেট এক্সচেঞ্জের জন্য সময় নিতে হয়, যদি প্রতিটি অপারেশন সংযোগ করে তারপর অপারেশন করে তবে প্রক্রিয়াকরণের গতি অনেক কমে যাবে। তাই লং কানেকশন প্রতিটি অপারেশন শেষ করার পর বিচ্ছিন্ন হয় না, পরবর্তী প্রক্রিয়াকরণে সরাসরি ডেটা প্যাকেট পাঠাতে হয়। উদাহরণস্বরূপ: ডাটাবেজের সংযোগ লং কানেকশনের জন্য ব্যবহৃত হয়, যদি শর্ট কানেকশন দিয়ে ঘন ঘন যোগাযোগ করা হয় তবে সোকেট ত্রুটি ঘটবে, এবং ঘন ঘন সোকেট তৈরি করা সম্পদের অপচয়।

যখন ক্লায়েন্টে সক্রিয়ভাবে ডেটা পাঠাতে হয় যেমন চ্যাট, তাত্ক্ষণিক গেমস, মোবাইল পুশ ইত্যাদি অ্যাপ্লিকেশনে লং কানেকশন প্রয়োজন।
লং কানেকশন অ্যাপ্লিকেশন ডেভেলপমেন্টের জন্য Gateway/Worker ডেভেলপমেন্ট প্রক্রিয়ার দিকে তাকান

5, স্মুথ রিস্টার্ট

সাধারণ পুনরায় চালুর প্রক্রিয়ায় সব প্রক্রিয়া সম্পূর্ণভাবে বন্ধ করে তারপর নতুন পরিষেবা প্রক্রিয়া তৈরি করা হয়। এই প্রক্রিয়াতে একটি স্বল্প সময়ের জন্য কোন প্রক্রিয়া বাইরে পরিষেবা প্রদান করে না, এর ফলে পরিষেবা আপাতত অকার্যকর হবে, যা উচ্চ সমান্তরাল সময়ে অনুরোধ ব্যর্থতার কারণ হয়ে দাঁড়ায়।

অন্যদিকে স্মুথ রিস্টার্ট একবারে সব প্রক্রিয়া বন্ধ করা নয়, বরং এক প্রক্রিয়া একের পর এক বন্ধ করা হয়, প্রতিটি প্রক্রিয়া বন্ধ করার পর নতুন একটি প্রক্রিয়া তাত্ক্ষণিকভাবে তৈরি করা হয়, যতক্ষণ না সমস্ত পুরনো প্রক্রিয়া প্রতিস্থাপিত হয়।

স্মুথ রিস্টার্টে Workerman ব্যবহার করা হয় php your_file.php reload কমান্ড, এটি পরিষেবা গুণমান প্রভাবিত না করেই অ্যাপ্লিকেশন আপডেট করতে সক্ষম।

মনে রাখুন: কেবলমাত্র on{...} কলব্যাকের মাধ্যমে লোড করা ফাইল স্মুথ রিস্টার্টের পর স্বয়ংক্রিয়ভাবে আপডেট হবে, চালানো স্ক্রিপ্টে সরাসরি লোড করা ফাইল বা লিখিত কোড পুনরায় লোডের সময় স্বয়ংক্রিয়ভাবে আপডেট হবে না।

তিন, প্রধান প্রক্রিয়া এবং সাব-প্রক্রিয়ার মধ্যে পার্থক্য

এটি লক্ষ্য করা প্রয়োজন যে কোডটি প্রধান প্রক্রিয়া অথবা সাব-প্রক্রিয়ায় চলমান, সাধারণভাবে বলা যায় Worker::runAll(); কলের আগে চলনশীল কোডগুলো সব প্রধান প্রক্রিয়ায় চলতে থাকে, onXXX কলব্যাক চলনশীল কোডগুলো সব সাব-প্রক্রিয়ায়। লক্ষ্য করুন যে Worker::runAll(); এর পরের কোড কখনো কার্যকর হবে না।

উদাহরণস্বরূপ নিচের কোড

use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

// প্রধান প্রক্রিয়াতে চলমান
$tcp_worker = new Worker("tcp://0.0.0.0:2347");
// অ্যাসাইনমেন্ট প্রক্রিয়া প্রধান প্রক্রিয়ায় চলমান
$tcp_worker->onMessage = function(TcpConnection $connection, $data)
{
    // এই অংশ সাব-প্রক্রিয়ায় চলমান
    $connection->send('hello ' . $data);
};

Worker::runAll();

মনে রাখুন: প্রধান প্রক্রিয়ার মধ্যে ডাটাবেজ, memcache, redis ইত্যাদি সংযোগের উৎস তৈরি করবেন না, যেহেতু প্রধান প্রক্রিয়ায় তৈরি সংযোগ সাব-প্রক্রিয়ায় স্বয়ংক্রিয়ভাবে উত্তরাধিকার হতে পারে (বিশেষত সিঙ্গেলটনে ব্যবহৃত হলে), সব প্রক্রিয়াই এক সংযোগ ধারণ করে, সার্ভার এই সংযোগের মাধ্যমে যে ডেটা ফেরত দেবে সেটি একাধিক প্রক্রিয়াতে পড়া যাবে, যা ডেটা অস্থিরতার কারণ হবে। একইভাবে, যদি কোনো একটি প্রক্রিয়া সংযোগ বন্ধ করে (যেমন ডেমন মোডে চলাকালীন প্রধান প্রক্রিয়া বন্ধ হয়ে সংযোগ বন্ধ করার কারণে), সমস্ত সাব-প্রক্রিয়ার সংযোগও একসাথে বন্ধ হয়ে যাবে এবং অপ্রত্যাশিত ত্রুটি ঘটবে, যেমন mysql gone away ত্রুটি।

onWorkerStart এর মধ্যে সংযোগ সম্পদ ইনিশিয়ালাইজ করার পরামর্শ দেওয়া হয়।