प्रतिक्रिया
प्रतिक्रिया वास्तव में एक support\Response
ऑब्जेक्ट है, इस ऑब्जेक्ट को बनाने के लिए, webman कुछ सहायक फ़ंक्शन प्रदान करता है।
किसी भी प्रतिक्रिया को लौटाएँ
उदाहरण
<?php
namespace app\controller;
use support\Request;
class FooController
{
public function hello(Request $request)
{
return response('hello webman');
}
}
response फ़ंक्शन का कार्यान्वयन इस प्रकार है:
function response($body = '', $status = 200, $headers = array())
{
return new Response($status, $headers, $body);
}
आप पहले एक खाली response
ऑब्जेक्ट भी बना सकते हैं, और फिर उचित स्थान पर $response->cookie()
$response->header()
$response->withHeaders()
$response->withBody()
का उपयोग करके लौटने वाली सामग्री को सेट कर सकते हैं।
public function hello(Request $request)
{
// एक ऑब्जेक्ट बनाना
$response = response();
// .... व्यापारिक तर्क की कटौती
// कुकी सेट करें
$response->cookie('foo', 'value');
// .... व्यापारिक तर्क की कटौती
// HTTP हेडर सेट करें
$response->header('Content-Type', 'application/json');
$response->withHeaders([
'X-Header-One' => 'Header Value 1',
'X-Header-Tow' => 'Header Value 2',
]);
// .... व्यापारिक तर्क की कटौती
// लौटने वाले डेटा को सेट करें
$response->withBody('लौटने वाला डेटा');
return $response;
}
JSON लौटाएँ
उदाहरण
<?php
namespace app\controller;
use support\Request;
class FooController
{
public function hello(Request $request)
{
return json(['code' => 0, 'msg' => 'ok']);
}
}
json फ़ंक्शन का कार्यान्वयन इस प्रकार है
function json($data, $options = JSON_UNESCAPED_UNICODE)
{
return new Response(200, ['Content-Type' => 'application/json'], json_encode($data, $options));
}
XML लौटाएँ
उदाहरण
<?php
namespace app\controller;
use support\Request;
class FooController
{
public function hello(Request $request)
{
$xml = <<<XML
<?xml version='1.0' standalone='yes'?>
<values>
<truevalue>1</truevalue>
<falsevalue>0</falsevalue>
</values>
XML;
return xml($xml);
}
}
xml फ़ंक्शन का कार्यान्वयन इस प्रकार है:
function xml($xml)
{
if ($xml instanceof SimpleXMLElement) {
$xml = $xml->asXML();
}
return new Response(200, ['Content-Type' => 'text/xml'], $xml);
}
दृश्य लौटाएँ
नया फ़ाइल app/controller/FooController.php
इस प्रकार बनाएं
<?php
namespace app\controller;
use support\Request;
class FooController
{
public function hello(Request $request)
{
return view('foo/hello', ['name' => 'webman']);
}
}
नया फ़ाइल app/view/foo/hello.html
इस प्रकार बनाएं
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>webman</title>
</head>
<body>
hello <?=htmlspecialchars($name)?>
</body>
</html>
पुनर्निर्देशन
<?php
namespace app\controller;
use support\Request;
class FooController
{
public function hello(Request $request)
{
return redirect('/user');
}
}
redirect फ़ंक्शन का कार्यान्वयन इस प्रकार है:
function redirect($location, $status = 302, $headers = [])
{
$response = new Response($status, ['Location' => $location]);
if (!empty($headers)) {
$response->withHeaders($headers);
}
return $response;
}
हेडर सेटिंग
<?php
namespace app\controller;
use support\Request;
class FooController
{
public function hello(Request $request)
{
return response('hello webman', 200, [
'Content-Type' => 'application/json',
'X-Header-One' => 'Header Value'
]);
}
}
आप हेडर को एकल या बंडल सेट करने के लिए header
और withHeaders
विधियों का उपयोग भी कर सकते हैं।
<?php
namespace app\controller;
use support\Request;
class FooController
{
public function hello(Request $request)
{
return response('hello webman')
->header('Content-Type', 'application/json')
->withHeaders([
'X-Header-One' => 'Header Value 1',
'X-Header-Tow' => 'Header Value 2',
]);
}
}
आप पहले हेडर सेट कर सकते हैं और फिर लौटने वाले डेटा को सेट कर सकते हैं।
public function hello(Request $request)
{
// एक ऑब्जेक्ट बनाना
$response = response();
// .... व्यापारिक तर्क की कटौती
// HTTP हेडर सेट करें
$response->header('Content-Type', 'application/json');
$response->withHeaders([
'X-Header-One' => 'Header Value 1',
'X-Header-Tow' => 'Header Value 2',
]);
// .... व्यापारिक तर्क की कटौती
// लौटने वाले डेटा को सेट करें
$response->withBody('लौटने वाला डेटा');
return $response;
}
कुकी सेट करना
<?php
namespace app\controller;
use support\Request;
class FooController
{
public function hello(Request $request)
{
return response('hello webman')
->cookie('foo', 'value');
}
}
आप पहले कुकी सेट कर सकते हैं और फिर लौटने वाले डेटा को सेट कर सकते हैं।
public function hello(Request $request)
{
// एक ऑब्जेक्ट बनाना
$response = response();
// .... व्यापारिक तर्क की कटौती
// कुकी सेट करें
$response->cookie('foo', 'value');
// .... व्यापारिक तर्क की कटौती
// लौटने वाले डेटा को सेट करें
$response->withBody('लौटने वाला डेटा');
return $response;
}
कुकी विधि के पूर्ण पैरामीटर इस प्रकार हैं:
cookie($name, $value = '', $max_age = 0, $path = '', $domain = '', $secure = false, $http_only = false)
फ़ाइल स्ट्रीम लौटाएँ
<?php
namespace app\controller;
use support\Request;
class FooController
{
public function hello(Request $request)
{
return response()->file(public_path() . '/favicon.ico');
}
}
- webman बड़े फ़ाइलों को भेजने का समर्थन करता है
- बड़े फ़ाइलों (2M से अधिक) के लिए, webman संपूर्ण फ़ाइल को एक बार में मेमोरी में नहीं पढ़ेगा, बल्कि उपयुक्त समय पर फ़ाइल को खंडों में पढ़ेगा और भेजेगा
- webman क्लाइंट के रिसीविंग स्पीड के आधार पर फ़ाइल पढ़ने और भेजने की गति को अनुकूलित करेगा, ताकि फ़ाइल को सबसे तेज़ी से भेजते समय मेमोरी उपयोग को न्यूनतम रखा जा सके
- डेटा भेजना गैर-अवरोधक है, जो अन्य अनुरोधों की प्रक्रिया को प्रभावित नहीं करेगा
- फ़ाइल विधि अपने आप
if-modified-since
हेडर जोड़ देगी और अगले अनुरोध मेंif-modified-since
हेडर की जांच करेगी, यदि फ़ाइल में कोई परिवर्तन नहीं हुआ है तो सीधे 304 लौटाएगा ताकि बैंडविड्थ की बचत हो सके - भेजी गई फ़ाइल अपने आप उचित
Content-Type
हेडर का उपयोग करके ब्राउज़र को भेजी जाएगी - यदि फ़ाइल मौजूद नहीं है, तो अपने आप 404 प्रतिक्रिया में बदल जाएगी
फ़ाइल डाउनलोड करें
<?php
namespace app\controller;
use support\Request;
class FooController
{
public function hello(Request $request)
{
return response()->download(public_path() . '/favicon.ico', 'फाइलनाम.ico');
}
}
download विधि और file विधि लगभग समान हैं, अंतर है
1, डाउनलोड की गई फ़ाइल का नाम सेट करने पर फ़ाइल डाउनलोड की जाएगी, न कि ब्राउज़र में प्रदर्शित होगी
2, download विधि if-modified-since
हेडर की जांच नहीं करेगी
आउटपुट प्राप्त करें
कुछ पुस्तकालय फ़ाइल सामग्री को सीधे मानक आउटपुट में प्रिंट करते हैं, यानी डेटा कमांड लाइन टर्मिनल में प्रिंट होगा, और ब्राउज़र को भेजा नहीं जाएगा, इस स्थिति में हमें ob_start();
ob_get_clean();
का उपयोग करके डेटा को एक वेरिएबल में कैद करना होगा, फिर डेटा को ब्राउज़र को भेजना होगा, उदाहरण के लिए:
<?php
namespace app\controller;
use support\Request;
class ImageController
{
public function get(Request $request)
{
// छवि बनाना
$im = imagecreatetruecolor(120, 20);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5, 'A Simple Text String', $text_color);
// आउटपुट पर पकड़ शुरू करना
ob_start();
// छवि का आउटपुट
imagejpeg($im);
// छवि सामग्री प्राप्त करना
$image = ob_get_clean();
// छवि भेजना
return response($image)->header('Content-Type', 'image/jpeg');
}
}
खंड प्रतिक्रिया
कभी-कभी हम प्रतिक्रियाएँ खंडों में भेजना चाहते हैं, आप निम्नलिखित उदाहरण को देख सकते हैं।
<?php
namespace app\controller;
use support\Request;
use support\Response;
use Workerman\Protocols\Http\Chunk;
use Workerman\Timer;
class IndexController
{
public function index(Request $request): Response
{
// कनेक्शन प्राप्त करना
$connection = $request->connection;
// नियमित रूप से HTTP पैकेट भेजना
$timer = Timer::add(1, function () use ($connection, &$timer) {
static $i = 0;
if ($i++ < 10) {
// HTTP पैकेट भेजना
$connection->send(new Chunk($i));
} else {
// अनावश्यक टाइमर मिटाना, ताकि टाइमर की अधिकता से मेमोरी लीक न हो
Timer::del($timer);
// शून्य का Chunk पैकेट भेजकर क्लाइंट को प्रतिक्रिया समाप्ति की सूचना देना
$connection->send(new Chunk(''));
}
});
// पहले Transfer-Encoding: chunked का HTTP हेडर भेजें, HTTP पैकेटा असिंक्रोनस रूप से भेजा जाएगा
return response()->withHeaders([
"Transfer-Encoding" => "chunked",
]);
}
}
यदि आप बड़े मॉडल का उपयोग कर रहे हैं, तो नीचे दिए गए उदाहरण को देखें।
composer require webman/openai
<?php
namespace app\controller;
use support\Request;
use Webman\Openai\Chat;
use Workerman\Protocols\Http\Chunk;
class ChatController
{
public function completions(Request $request)
{
$connection = $request->connection;
// https://api.openai.com यदि देश में पहुंचना संभव नहीं है तो आप वैकल्पिक रूप से https://api.openai-proxy.com का उपयोग कर सकते हैं
$chat = new Chat(['apikey' => 'sk-xx', 'api' => 'https://api.openai.com']);
$chat->completions(
[
'model' => 'gpt-3.5-turbo',
'stream' => true,
'messages' => [['role' => 'user', 'content' => 'hello']],
], [
'stream' => function($data) use ($connection) {
// जब openai इंटरफ़ेस डेटा लौटाता है, तो इसे ब्राउज़र को अग्रेषित करें
$connection->send(new Chunk(json_encode($data, JSON_UNESCAPED_UNICODE) . "\n"));
},
'complete' => function($result, $response) use ($connection) {
// प्रतिक्रिया समाप्त होने पर जाँच करें कि क्या कोई त्रुटि है
if (isset($result['error'])) {
$connection->send(new Chunk(json_encode($result, JSON_UNESCAPED_UNICODE) . "\n"));
}
// प्रतिक्रिया समाप्त होने का संकेत देने के लिए शून्य का chunk लौटाएँ
$connection->send(new Chunk(''));
},
]);
// सबसे पहले एक HTTP हेडर लौटाएँ, फिर डेटा असिंक्रोनस रूप से लौटाएँ
return response()->withHeaders([
"Transfer-Encoding" => "chunked",
]);
}
}