الشرح
تم تعزيز دعم خدمة HTTP في Workerman بدءًا من الإصدار 4.x. تم إدخال فئات الطلبات، الاستجابات، الجلسات، وSSE. إذا كنت ترغب في استخدام خدمة HTTP الخاصة بـ Workerman، يُنصح بشدة باستخدام Workerman 4.x أو إصدار أعلى.
الحصول على كائن الجلسة
$session = $request->session();
مثال
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)
{
$session = $request->session();
$session->set('name', 'tome');
$connection->send($session->get('name'));
};
// تشغيل العامل
Worker::runAll();
ملاحظات
- يجب التعامل مع الجلسة قبل استدعاء
$connection->send(). - يتم حفظ التغييرات تلقائياً عند تدمير كائن الجلسة، لذا لا تقوم بتخزين كائن
$request->session()في مصفوفة عالمية أو كأعضاء في الفئة حيث لن يتم حفظ الجلسة. - يتم تخزين الجلسة بشكل افتراضي في ملفات على القرص، إذا كنت تريد أداءً أفضل، يُنصح باستخدام Redis.
الحصول على جميع بيانات الجلسة
$session = $request->session();
$all = $session->all();
الإرجاع هو مصفوفة. إذا لم يكن هناك أي بيانات للجلسة، فسيتم إرجاع مصفوفة فارغة.
مثال
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)
{
$session = $request->session();
$session->set('name', 'tom');
$connection->send(var_export($session->all(), true));
};
// تشغيل العامل
Worker::runAll();
الحصول على قيمة معينة من الجلسة
$session = $request->session();
$name = $session->get('name');
إذا كانت البيانات غير موجودة، سيتم إرجاع null.
يمكنك أيضاً تمرير قيمة افتراضية كمعامل ثاني لطريقة get، فإذا لم يتم العثور على القيمة المقابلة في مصفوفة الجلسة، سيتم إرجاع القيمة الافتراضية. على سبيل المثال:
$session = $request->session();
$name = $session->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)
{
$session = $request->session();
$connection->send($session->get('name', 'tom'));
};
// تشغيل العامل
Worker::runAll();
تخزين الجلسة
للتخزين قيمة معينة، استخدم طريقة set.
$session = $request->session();
$session->set('name', 'tom');
لا ترجع طريقة set قيمة، وسيتم حفظ الجلسة تلقائيًا عند تدمير كائن الجلسة.
عند تخزين عدة قيم، استخدم طريقة put.
$session = $request->session();
$session->put(['name' => 'tom', 'age' => 12]);
مرة أخرى، لا ترجع put قيمة.
مثال
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)
{
$session = $request->session();
$session->set('name', 'tom');
$connection->send($session->get('name'));
};
// تشغيل العامل
Worker::runAll();
حذف بيانات الجلسة
لحذف قيمة معينة أو بعض القيم من الجلسة، استخدم طريقة forget.
$session = $request->session();
// حذف عنصر واحد
$session->forget('name');
// حذف عناصر متعددة
$session->forget(['name', 'age']);
بالإضافة إلى ذلك، يُوفر النظام طريقة delete، والفرق مع forget هو أن delete يمكنها حذف عنصر واحد فقط.
$session = $request->session();
// مساوي لـ $session->forget('name');
$session->delete('name');
مثال
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->session()->forget('name');
$connection->send('ok');
};
// تشغيل العامل
Worker::runAll();
الحصول على وحذف قيمة معينة من الجلسة
$session = $request->session();
$name = $session->pull('name');
النتيجة متطابقة مع الكود التالي
$session = $request->session();
$value = $session->get($name);
$session->delete($name);
إذا كانت الجلسة المقابلة غير موجودة، فسيتم إرجاع 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)
{
$connection->send($request->session()->pull('name'));
};
// تشغيل العامل
Worker::runAll();
حذف جميع بيانات الجلسة
$request->session()->flush();
لا ترجع قيمة، وسيتم حذف الجلسة تلقائيًا من التخزين عند تدمير كائن الجلسة.
مثال
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->session()->flush();
$connection->send('ok');
};
// تشغيل العامل
Worker::runAll();
التحقق مما إذا كانت بيانات الجلسة موجودة
$session = $request->session();
$has = $session->has('name');
إلى الأعلى، إذا كانت الجلسة المقابلة غير موجودة أو كانت قيمة الجلسة المقابلة null، فإنه يتم إرجاع false، وإلا سيتم إرجاع true.
$session = $request->session();
$has = $session->exists('name');
تستخدم الشيفرة أعلاه أيضًا للتحقق من وجود بيانات الجلسة، والفرق هو أن القيمة المقابلة للجلسة إذا كانت null، سيتم إرجاع true أيضًا.
ملاحظات
عند استخدام الجلسة، لا يُنصح بتخزين كائنات فئة مباشرة، خاصةً كائنات الفئة غير القابلة للتحكم، حيث يمكن أن تسبب مشاكل أمان محتملة عند فك تسلسلها.