विवरण

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)

$worker = new Worker('http://0.0.0.0:8080');
$worker->onMessage = function($connection, $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 डेटा भेजना

  • पहले एक Response प्रतिक्रिया जिसे Transfer-Encoding: chunked हेडर के साथ हो, क्लाइंट को भेजना आवश्यक है
  • बाद के chunk डेटा भेजने के लिए Workerman\Protocols\Http\Chunk वर्ग का उपयोग करें
  • अंत में प्रतिक्रिया समाप्त करने के लिए एक खाली 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 हेडर वाली Response प्रतिक्रिया भेजें
    $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();