الشرح
منذ الإصدار 4.x، قامت workerman بتحسين دعم خدمات HTTP. تم إدخال فصول الطلب، الاستجابة، الجلسة، بالإضافة إلى SSE. إذا كنت ترغب في استخدام خدمة HTTP من workerman، فنوصي بشدة باستخدام workerman 4.x أو إصدار أعلى.
يرجى ملاحظة أن كل ما يلي ينطبق على استخدام workerman 4.x، ولا يتوافق مع workerman 3.x.
الحصول على كائن الطلب
يتم الحصول على كائن الطلب دائماً في دالة الاستدعاء onMessage، حيث يقوم الإطار تلقائيًا بتمرير كائن Request كوسيط ثانٍ في دالة الاستدعاء.
مثال
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)
{
// $request هو كائن الطلب، هنا لا نقوم بأي عملية على كائن الطلب، نعود مباشرة بـ hello للمتصفح
$connection->send("hello");
};
// تشغيل الworker
Worker::runAll();
عند زيارة المتصفح لـ http://127.0.0.1:8080، سيتم إرجاع hello.
الحصول على معلمات الطلب GET
الحصول على مصفوفة GET كاملة
$get = $request->get();
إذا لم يكن هناك معلمات GET في الطلب، سيتم إرجاع مصفوفة فارغة.
الحصول على قيمة معينة من مصفوفة GET
$name = $request->get('name');
إذا كانت مصفوفة GET لا تحتوي على هذه القيمة، سيتم إرجاع null.
يمكنك أيضًا تمرير قيمة افتراضية كوسيط ثانٍ لطريقة get، إذا لم يتم العثور على القيمة المطابقة في مصفوفة GET، سيتم إرجاع القيمة الافتراضية. على سبيل المثال:
$name = $request->get('name', 'tom');
مثال
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)
{
$connection->send($request->get('name'));
};
// تشغيل الworker
Worker::runAll();
عند زيارة المتصفح لـ http://127.0.0.1:8080?name=jerry&age=12، سيتم إرجاع jerry.
الحصول على معلمات الطلب POST
الحصول على مصفوفة POST كاملة
$post = $request->post();
إذا لم يكن هناك معلمات POST في الطلب، سيتم إرجاع مصفوفة فارغة.
الحصول على قيمة معينة من مصفوفة POST
$name = $request->post('name');
إذا كانت مصفوفة POST لا تحتوي على هذه القيمة، سيتم إرجاع null.
مثل طريقة get، يمكنك أيضًا تمرير قيمة افتراضية كوسيط ثانٍ لطريقة post، إذا لم يتم العثور على القيمة المطابقة في مصفوفة POST، سيتم إرجاع القيمة الافتراضية. على سبيل المثال:
$name = $request->post('name', 'tom');
مثال
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)
{
$post = $request->post();
$connection->send(var_export($post, true));
};
// تشغيل الworker
Worker::runAll();
الحصول على جسم الطلب POST الأصلي
$post = $request->rawBody();
تعمل هذه الوظيفة مشابهة لعملية file_get_contents("php://input"); في php-fpm. تُستخدم للحصول على جسم الطلب HTTP الأصلي. هذا مفيد جدًا عند الحصول على بيانات POST بتنسيق غير application/x-www-form-urlencoded.
مثال
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)
{
$post = json_decode($request->rawBody());
$connection->send('hello');
};
// تشغيل الworker
Worker::runAll();
الحصول على الرأس
الحصول على مصفوفة الرأس كاملة
$headers = $request->header();
إذا لم يكن هناك معلمات رأس في الطلب، سيتم إرجاع مصفوفة فارغة. جميع المفاتيح تكون حروف صغيرة.
الحصول على قيمة معينة من مصفوفة الرأس
$host = $request->header('host');
إذا كانت مصفوفة الرأس لا تحتوي على هذه القيمة، سيتم إرجاع null. جميع المفاتيح تكون حروف صغيرة.
مثل طريقة get، يمكنك أيضًا تمرير قيمة افتراضية كوسيط ثانٍ لطريقة header، إذا لم يتم العثور على القيمة المطابقة في مصفوفة الرأس، سيتم إرجاع القيمة الافتراضية. على سبيل المثال:
$host = $request->header('host', 'localhost');
مثال
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)
{
if ($request->header('connection') === 'keep-alive') {
$connection->send('hello');
} else {
$connection->close('hello');
}
};
// تشغيل الworker
Worker::runAll();
الحصول على الكوكيز
الحصول على مصفوفة الكوكيز كاملة
$cookies = $request->cookie();
إذا لم يكن هناك معلمات كوكيز في الطلب، سيتم إرجاع مصفوفة فارغة.
الحصول على قيمة معينة من مصفوفة الكوكيز
$name = $request->cookie('name');
إذا كانت مصفوفة الكوكيز لا تحتوي على هذه القيمة، سيتم إرجاع null.
مثل طريقة get، يمكنك أيضًا تمرير قيمة افتراضية كوسيط ثانٍ لطريقة cookie، إذا لم يتم العثور على القيمة المطابقة في مصفوفة الكوكيز، سيتم إرجاع القيمة الافتراضية. على سبيل المثال:
$name = $request->cookie('name', 'tom');
مثال
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)
{
$cookie = $request->cookie();
$connection->send(var_export($cookie, true));
};
// تشغيل الworker
Worker::runAll();
الحصول على الملفات المرفوعة
الحصول على مصفوفة الملفات المرفوعة كاملة
$files = $request->file();
الشكل الذي يتم إرجاعه للملف مشابه:
array (
'avatar' => array (
'name' => '123.jpg',
'tmp_name' => '/tmp/workerman.upload.9hjR4w',
'size' => 1196127,
'error' => 0,
'type' => 'application/octet-stream',
),
'anotherfile' => array (
'name' => '456.txt',
'tmp_name' => '/tmp/workerman.upload.9sirSws',
'size' => 490,
'error' => 0,
'type' => 'text/plain',
)
)
حيث:
- name هو اسم الملف
- tmp_name هو موقع الملف المؤقت على القرص
- size هو حجم الملف
- error هو رمز الخطأ
- type هو نوع ملف الـ mine.
ملحوظة:
-
تكون حجم الملفات المرفوعة محكومة بـdefaultMaxPackageSize، والذي يكون افتراضيًا 10M ويمكن تعديله.
-
سيتم حذف الملفات تلقائيًا بعد انتهاء الطلب.
-
إذا لم يكن هناك ملفات مرفوعة في الطلب، سيتم إرجاع مصفوفة فارغة.
الحصول على ملف مرفوع محدد
$avatar_file = $request->file('avatar');
الإرجاع سيكون مشابهًا
array (
'name' => '123.jpg',
'tmp_name' => '/tmp/workerman.upload.9hjR4w',
'size' => 1196127,
'error' => 0,
'type' => 'application/octet-stream',
)
إذا كان الملف المرفوع غير موجود، سيتم إرجاع null.
مثال
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)
{
$file = $request->file('avatar');
if ($file && $file['error'] === UPLOAD_ERR_OK) {
rename($file['tmp_name'], '/home/www/web/public/123.jpg');
$connection->send('ok');
return;
}
$connection->send('فشل الرفع');
};
// تشغيل الworker
Worker::runAll();
الحصول على المضيف
الحصول على معلومات المضيف من الطلب.
$host = $request->host();
إذا كان عنوان الطلب في منفذ غير قياسي مثل 80 أو 443، قد تحمل معلومات المضيف المنفذ أيضًا، مثل example.com:8080. إذا لم تكن بحاجة إلى المنفذ، يمكنك تمرير true كوسيط أول.
$host = $request->host(true);
مثال
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)
{
$connection->send($request->host());
};
// تشغيل الworker
Worker::runAll();
عند زيارة المتصفح لـ http://127.0.0.1:8080?name=tom، سيتم إرجاع 127.0.0.1:8080.
الحصول على طريقة الطلب
$method = $request->method();
قد تكون القيمة المُرجعة إما GET، POST، PUT، DELETE، OPTIONS، أو HEAD.
مثال
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)
{
$connection->send($request->method());
};
// تشغيل الworker
Worker::runAll();
الحصول على URI الطلب
$uri = $request->uri();
ترجع URI الطلب، بما في ذلك جزء path وqueryString.
مثال
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)
{
$connection->send($request->uri());
};
// تشغيل الworker
Worker::runAll();
عندما يزور المتصفح http://127.0.0.1:8080/user/get.php?uid=10&type=2، سيتم إرجاع /user/get.php?uid=10&type=2.
الحصول على مسار الطلب
$path = $request->path();
ترجع جزء المسار من الطلب.
مثال
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)
{
$connection->send($request->path());
};
// تشغيل الworker
Worker::runAll();
عندما يزور المتصفح http://127.0.0.1:8080/user/get.php?uid=10&type=2، سيتم إرجاع /user/get.php.
الحصول على queryString الطلب
$query_string = $request->queryString();
ترجع جزء queryString من الطلب.
مثال
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)
{
$connection->send($request->queryString());
};
// تشغيل الworker
Worker::runAll();
عندما يزور المتصفح http://127.0.0.1:8080/user/get.php?uid=10&type=2، سيتم إرجاع uid=10&type=2.
الحصول على إصدار HTTP للطلب
$version = $request->protocolVersion();
تعود السلسلة 1.1 أو 1.0.
مثال
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)
{
$connection->send($request->protocolVersion());
};
// تشغيل الworker
Worker::runAll();
الحصول على sessionId للطلب
$sid = $request->sessionId();
تعود سلسلة تتكون من أحرف وأرقام.
مثال
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)
{
$connection->send($request->sessionId());
};
// تشغيل الworker
Worker::runAll();