Giới thiệu
workerman từ phiên bản 4.x trở đi đã tăng cường hỗ trợ cho dịch vụ HTTP. Đã giới thiệu lớp yêu cầu, lớp phản hồi, lớp session và SSE. Nếu bạn muốn sử dụng dịch vụ HTTP của workerman, rất được khuyến nghị sử dụng workerman 4.x hoặc phiên bản cao hơn.
Lấy đối tượng session
$session = $request->session();
Ví dụ
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'));
};
// Chạy worker
Worker::runAll();
Lưu ý
- session phải được thao tác trước khi gọi
$connection->send(). - session sẽ tự động lưu các thay đổi khi đối tượng bị hủy, vì vậy đừng lưu đối tượng trả về từ
$request->session()trong mảng toàn cục hoặc trong thành viên lớp, điều này sẽ gây ra session không thể lưu. - session mặc định được lưu trữ trong tệp trên đĩa, nếu muốn hiệu suất tốt hơn thì nên sử dụng redis.
Lấy tất cả dữ liệu session
$session = $request->session();
$all = $session->all();
Trả về một mảng. Nếu không có dữ liệu session nào, sẽ trả về một mảng rỗng.
Ví dụ
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));
};
// Chạy worker
Worker::runAll();
Lấy một giá trị từ session
$session = $request->session();
$name = $session->get('name');
Nếu dữ liệu không tồn tại sẽ trả về null.
Bạn cũng có thể truyền một giá trị mặc định cho tham số thứ hai của phương thức get, nếu không tìm thấy giá trị tương ứng trong mảng session sẽ trả về giá trị mặc định. Ví dụ:
$session = $request->session();
$name = $session->get('name', 'tom');
Ví dụ
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'));
};
// Chạy worker
Worker::runAll();
Lưu trữ session
Để lưu một dữ liệu, sử dụng phương thức set.
$session = $request->session();
$session->set('name', 'tom');
set không trả về giá trị, session sẽ tự động lưu khi đối tượng session bị hủy.
Khi lưu nhiều giá trị, sử dụng phương thức put.
$session = $request->session();
$session->put(['name' => 'tom', 'age' => 12]);
Tương tự, put cũng không trả về giá trị.
Ví dụ
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'));
};
// Chạy worker
Worker::runAll();
Xóa dữ liệu session
Để xóa một hoặc nhiều dữ liệu session, sử dụng phương thức forget.
$session = $request->session();
// Xóa một mục
$session->forget('name');
// Xóa nhiều mục
$session->forget(['name', 'age']);
Ngoài ra, hệ thống cung cấp phương thức delete, khác với phương thức forget ở chỗ delete chỉ có thể xóa một mục.
$session = $request->session();
// Tương đương với $session->forget('name');
$session->delete('name');
Ví dụ
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');
};
// Chạy worker
Worker::runAll();
Lấy và xóa một giá trị từ session
$session = $request->session();
$name = $session->pull('name');
Hiệu quả giống như mã sau
$session = $request->session();
$value = $session->get($name);
$session->delete($name);
Nếu session tương ứng không tồn tại, sẽ trả về null.
Ví dụ
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'));
};
// Chạy worker
Worker::runAll();
Xóa tất cả dữ liệu session
$request->session()->flush();
Không có giá trị trả về, session sẽ tự động bị xóa khỏi lưu trữ khi đối tượng session bị hủy.
Ví dụ
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');
};
// Chạy worker
Worker::runAll();
Kiểm tra xem dữ liệu session tương ứng có tồn tại hay không
$session = $request->session();
$has = $session->has('name');
Nếu session tương ứng không tồn tại hoặc giá trị của session tương ứng là null, sẽ trả về false, ngược lại sẽ trả về true.
$session = $request->session();
$has = $session->exists('name');
Mã trên cũng được sử dụng để kiểm tra xem dữ liệu session có tồn tại hay không, điểm khác là khi giá trị của mục session tương ứng là null, cũng trả về true.
Lưu ý
Khi sử dụng session, không nên lưu trữ trực tiếp các đối tượng lớp, đặc biệt là các đối tượng lớp không thể kiểm soát, việc giải nén có thể gây ra rủi ro tiềm tàng.