মন্তব্য
workerman এর 4.x সংস্করণ থেকে HTTP পরিষেবার সমর্থন বৃদ্ধি করা হয়েছে। এটি অনুরোধ শ্রেণী, প্রতিক্রিয়া শ্রেণী, সেশন শ্রেণী এবং SSE নিয়ে এসেছে। যদি আপনি workerman এর HTTP পরিষেবা ব্যবহার করতে চান, তবে workerman4.x অথবা তার উপরের উন্নত সংস্করণ ব্যবহার করার জন্য অত্যন্ত সুপারিশ করা হচ্ছে।
দয়া করে লক্ষ্য করুন, নিচে দেওয়া সমস্ত উদাহরণ workerman4.x সংস্করণের ব্যবহার, যা workerman3.x এর সাথে অ-সঙ্গতিপূর্ণ।
注意
- যদি chunk বা SSE প্রতিক্রিয়া পাঠানো না হয় তবে একটি অনুরোধে একাধিকবার প্রতিক্রিয়া পাঠানো অনুমোদিত নয়, অর্থাৎ একটি অনুরোধে একাধিকবার
$connection->send()কল করা যাবে না। - প্রতিটি অনুরোধের জন্য অবশেষে একটি
$connection->send()কল করতে হবে, অন্যথায় ক্লায়েন্ট সমাপ্তির জন্য অপেক্ষা করবে।
দ্রুত প্রতিক্রিয়া
যখন HTTP অবস্থার কোড (ডিফল্ট 200) পরিবর্তন করার অথবা কাস্টম হেডার, কুকি সেট করার প্রয়োজন নাই, তখন সরাসরি ক্লায়েন্টকে একটি স্ট্রিং পাঠিয়ে প্রতিক্রিয়া সম্পন্ন করা যেতে পারে।
উদাহরণ
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('http://0.0.0.0:8080');
$worker->onMessage = function(TcpConnection $connection, Request $request)
{
// সরাসরি ক্লায়েন্টকে this is body পাঠানো হচ্ছে
$connection->send("this is body");
};
// ওয়ার্কার চালান
Worker::runAll();
状态码 পরিবর্তন
যখন কাস্টম অবস্থার কোড, হেডার, কুকি সেট করার প্রয়োজন হয়, তখন Workerman\Protocols\Http\Response প্রতিক্রিয়া শ্রেণীটি ব্যবহার করতে হয়। উদাহরণস্বরূপ, নিচের উদাহরণে /404 পাথে প্রবেশ করলে 404 এর অবস্থার কোড ফেরত দেওয়া হয়, যার প্যাকেজের বিষয়বস্তু <h1>দুঃখিত, ফাইল নেই</h1>।
উদাহরণ
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
use Workerman\Protocols\Http\Response;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('http://0.0.0.0:8080');
$worker->onMessage = function(TcpConnection $connection, Request $request)
{
if ($request->path() === '/404') {
$connection->send(new Response(404, [], '<h1>দুঃখিত, ফাইল নেই</h1>'));
} else {
$connection->send('this is body');
}
};
// ওয়ার্কার চালান
Worker::runAll();
যখন Response শ্রেণীটি ইতিমধ্যে ইনিশিয়ালাইজ করা হয়েছে, অবস্থার কোড পরিবর্তন করতে নিচের পদ্ধতি ব্যবহার করুন।
$response = new Response(200);
$response->withStatus(404);
$connection->send($response);
হেডার পাঠানো
একইভাবে, হেডার পাঠানোর জন্য Workerman\Protocols\Http\Response প্রতিক্রিয়া শ্রেণীটি ব্যবহার করতে হয়।
উদাহরণ
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
use Workerman\Protocols\Http\Response;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('http://0.0.0.0:8080');
$worker->onMessage = function(TcpConnection $connection, Request $request)
{
$response = new Response(200, [
'Content-Type' => 'text/html',
'X-Header-One' => 'Header Value'
], 'this is body');
$connection->send($response);
};
// ওয়ার্কার চালান
Worker::runAll();
যখন Response শ্রেণীটি ইতিমধ্যে ইনিশিয়ালাইজ করা হয়েছে, হেডার যোগ বা পরিবর্তন করতে নিচের পদ্ধতি ব্যবহার করুন।
$response = new Response(200);
// একটি হেডার যোগ বা পরিবর্তন করা হচ্ছে
$response->header('Content-Type', 'text/html');
// একাধিক হেডার যোগ বা পরিবর্তন করা হচ্ছে
$response->withHeaders([
'Content-Type' => 'application/json',
'X-Header-One' => 'Header Value'
]);
$connection->send($response);
রিডিরেক্ট
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
use Workerman\Protocols\Http\Response;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('http://0.0.0.0:8080');
$worker->onMessage = function(TcpConnection $connection, Request $request)
{
$location = '/test_location';
$response = new Response(302, ['Location' => $location]);
$connection->send($response);
};
Worker::runAll();
কুকি পাঠানো
একইভাবে, কুকি পাঠানোর জন্য Workerman\Protocols\Http\Response প্রতিক্রিয়া শ্রেণীটি ব্যবহার করতে হয়।
উদাহরণ
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
use Workerman\Protocols\Http\Response;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('http://0.0.0.0:8080');
$worker->onMessage = function(TcpConnection $connection, Request $request)
{
$response = new Response(200, [], 'this is body');
$response->cookie('name', 'tom');
$connection->send($response);
};
// ওয়ার্কার চালান
Worker::runAll();
ফাইল পাঠানো
একইভাবে, ফাইল পাঠানোর জন্য Workerman\Protocols\Http\Response প্রতিক্রিয়া শ্রেণীটি ব্যবহার করতে হয়।
ফাইল পাঠানোর জন্য নীচের পদ্ধতি অনুসরণ করুন।
$response = (new Response())->withFile($file);
$connection->send($response);
- workerman বড় ফাইল পাঠাতে সমর্থন করে
- বড় ফাইলের জন্য (2M এর বেশি), workerman পুরো ফাইলটি একবারে মেমরিতে পড়বে না, বরং সঠিক সময়ে ভাগ করে ফাইলটি পড়ে এবং পাঠাবে
- workerman ক্লায়েন্টের গ্রহণের গতি অনুসারে ফাইল পড়া প্রেরনের গতি অপ্টিমাইজ করবে, যত দ্রুত সম্ভব ফাইল পাঠানোর সময় মেমরি খরচ কম রাখবে
- ডেটা পাঠানো অ-বন্ধক, অন্য অনুরোধের প্রক্রিয়াকরণকে প্রভাবিত করবে না
- ফাইল পাঠানোর সময় স্বয়ংক্রিয়ভাবে
Last-Modifiedহেডার যুক্ত করা হয়, যাতে পরের অনুরোধে সার্ভার 304 প্রতিক্রিয়া পাঠানোর জন্য ফাইলের স্থিতি পরীক্ষা করতে পারে, ফাইল স্থানান্তর যা কার্যক্ষমতা বাড়ায় - পাঠানো ফাইল স্বয়ংক্রিয়ভাবে ব্রাউজারে উপযুক্ত
Content-Typeহেডার সহ পাঠানো হয় - যদি ফাইল না থাকে, তবে এটি স্বয়ংক্রিয়ভাবে 404 প্রতিক্রিয়াতে রূপান্তরিত করবে
উদাহরণ
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
use Workerman\Protocols\Http\Response;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('http://0.0.0.0:8080');
$worker->onMessage = function(TcpConnection $connection, Request $request)
{
$file = '/your/path/of/file';
// if-modified-since হেডার চেক করে ফাইল পরিবর্তিত হয়েছে কি না যাচাই করা হচ্ছে
if (!empty($if_modified_since = $request->header('if-modified-since'))) {
$modified_time = date('D, d M Y H:i:s', filemtime($file)) . ' ' . \date_default_timezone_get();
// ফাইল পরিবর্তিত না হলে 304 পাঠানো হচ্ছে
if ($modified_time === $if_modified_since) {
$connection->send(new Response(304));
return;
}
}
// ফাইল পরিবর্তিত হয়েছে অথবা if-modified-since হেডার নেই, তাই ফাইল পাঠানো হচ্ছে
$response = (new Response())->withFile($file);
$connection->send($response);
};
// ওয়ার্কার চালান
Worker::runAll();
HTTP chunk ডেটা পাঠানো
- প্রথমে একটি
Transfer-Encoding: chunkedহেডার সহ একটি Response প্রতিক্রিয়া ক্লায়েন্টকে পাঠাতে হবে - পরবর্তী chunk ডেটা পাঠানোর জন্য
Workerman\Protocols\Http\Chunkশ্রেণী ব্যবহার করুন - অবশেষে একটি খালি চঙ্ক পাঠানো আবশ্যক যাতে প্রতিক্রিয়া সমাপ্ত হয়
উদাহরণ
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
use Workerman\Protocols\Http\Response;
use Workerman\Protocols\Http\Chunk;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('http://0.0.0.0:8080');
$worker->onMessage = function(TcpConnection $connection, Request $request)
{
// প্রথমে Transfer-Encoding: chunked হেডার সহ একটি প্রতিক্রিয়া পাঠানো হচ্ছে
$connection->send(new Response(200, array('Transfer-Encoding' => 'chunked'), 'hello'));
// পরবর্তী chunk ডেটা Workerman\Protocols\Http\Chunk শ্রেণী ব্যবহার করে পাঠানো হচ্ছে
$connection->send(new Chunk('প্রথম টুকরা ডেটা'));
$connection->send(new Chunk('দ্বিতীয় টুকরা ডেটা'));
$connection->send(new Chunk('তৃতীয় টুকরা ডেটা'));
// শেষের দিকে একটি খালি chunk পাঠানো আবশ্যক
$connection->send(new Chunk(''));
};
// ওয়ার্কার চালান
Worker::runAll();