Giới thiệu
workerman từ phiên bản 4.x đã tăng cường hỗ trợ dịch vụ HTTP. Giới thiệu các lớp yêu cầu, phản hồi, session và SSE. Nếu bạn muốn sử dụng dịch vụ HTTP của workerman, chúng tôi khuyên bạn nên sử dụng workerman 4.x hoặc phiên bản cao hơn.
Lưu ý rằng tất cả các cú pháp dưới đây đều thuộc phiên bản workerman 4.x, không tương thích với workerman 3.x.
Lấy đối tượng yêu cầu
Đối tượng yêu cầu luôn được lấy trong hàm callback onMessage, framework sẽ tự động truyền đối tượng Request qua tham số thứ hai của hàm callback.
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 là đối tượng yêu cầu, ở đây không thực hiện bất kỳ thao tác nào với đối tượng yêu cầu, trực tiếp trả về hello cho trình duyệt
$connection->send("hello");
};
// Chạy worker
Worker::runAll();
Khi trình duyệt truy cập http://127.0.0.1:8080, nó sẽ trả về hello.
Lấy tham số yêu cầu GET
Lấy toàn bộ mảng GET
$get = $request->get();
Nếu yêu cầu không có tham số GET thì sẽ trả về một mảng rỗng.
Lấy giá trị của một phần tử trong mảng GET
$name = $request->get('name');
Nếu mảng GET không chứa giá trị này, sẽ trả về null.
Bạn cũng có thể truyền một giá trị mặc định vào 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 GET sẽ trả về giá trị mặc định. Ví dụ:
$name = $request->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)
{
$connection->send($request->get('name'));
};
// Chạy worker
Worker::runAll();
Khi trình duyệt truy cập http://127.0.0.1:8080?name=jerry&age=12, nó sẽ trả về jerry.
Lấy tham số yêu cầu POST
Lấy toàn bộ mảng POST
$post = $request->post();
Nếu yêu cầu không có tham số POST thì sẽ trả về một mảng rỗng.
Lấy giá trị của một phần tử trong mảng POST
$name = $request->post('name');
Nếu mảng POST không chứa giá trị này, sẽ trả về null.
Giống như phương thức get, bạn cũng có thể truyền một giá trị mặc định vào tham số thứ hai của phương thức post, nếu không tìm thấy giá trị tương ứng trong mảng POST sẽ trả về giá trị mặc định. Ví dụ:
$name = $request->post('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)
{
$post = $request->post();
$connection->send(var_export($post, true));
};
// Chạy worker
Worker::runAll();
Lấy nội dung gói POST gốc
$post = $request->rawBody();
Chức năng này tương tự như php-fpm với thao tác file_get_contents("php://input");. Được sử dụng để lấy nội dung gói yêu cầu gốc HTTP. Điều này rất hữu ích khi lấy dữ liệu POST không ở định dạng application/x-www-form-urlencoded.
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)
{
$post = json_decode($request->rawBody());
$connection->send('hello');
};
// Chạy worker
Worker::runAll();
Lấy header
Lấy toàn bộ mảng header
$headers = $request->header();
Nếu yêu cầu không có tham số header thì sẽ trả về một mảng rỗng. Lưu ý rằng tất cả các key đều là chữ thường.
Lấy giá trị của một phần tử trong mảng header
$host = $request->header('host');
Nếu mảng header không chứa giá trị này, sẽ trả về null. Lưu ý rằng tất cả các key đều là chữ thường.
Giống như phương thức get, bạn cũng có thể truyền một giá trị mặc định vào tham số thứ hai của phương thức header, nếu không tìm thấy giá trị tương ứng trong mảng header sẽ trả về giá trị mặc định. Ví dụ:
$host = $request->header('host', 'localhost');
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)
{
if ($request->header('connection') === 'keep-alive') {
$connection->send('hello');
} else {
$connection->close('hello');
}
};
// Chạy worker
Worker::runAll();
Lấy cookie
Lấy toàn bộ mảng cookie
$cookies = $request->cookie();
Nếu yêu cầu không có tham số cookie thì sẽ trả về một mảng rỗng.
Lấy giá trị của một phần tử trong mảng cookie
$name = $request->cookie('name');
Nếu mảng cookie không chứa giá trị này, sẽ trả về null.
Giống như phương thức get, bạn cũng có thể truyền một giá trị mặc định vào tham số thứ hai của phương thức cookie, nếu không tìm thấy giá trị tương ứng trong mảng cookie sẽ trả về giá trị mặc định. Ví dụ:
$name = $request->cookie('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)
{
$cookie = $request->cookie();
$connection->send(var_export($cookie, true));
};
// Chạy worker
Worker::runAll();
Lấy tệp tải lên
Lấy toàn bộ mảng tệp tải lên
$files = $request->file();
Định dạng tệp trả về giống như:
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',
)
)
Trong đó:
- name là tên tệp
- tmp_name là vị trí tệp tạm trên đĩa
- size là kích thước tệp
- error là mã lỗi
- type là loại mine của tệp.
Lưu ý:
-
Kích thước tệp tải lên bị giới hạn bởi defaultMaxPackageSize, mặc định là 10M, có thể điều chỉnh.
-
Tệp sẽ được tự động xóa sau khi yêu cầu kết thúc.
-
Nếu yêu cầu không có tệp tải lên sẽ trả về một mảng rỗng.
Lấy tệp tải lên cụ thể
$avatar_file = $request->file('avatar');
Trả về dạng tương tự
array (
'name' => '123.jpg',
'tmp_name' => '/tmp/workerman.upload.9hjR4w',
'size' => 1196127,
'error' => 0,
'type' => 'application/octet-stream',
)
Nếu tệp tải lên 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)
{
$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('upload fail');
};
// Chạy worker
Worker::runAll();
Lấy host
Lấy thông tin host của yêu cầu.
$host = $request->host();
Nếu địa chỉ yêu cầu không phải là cổng chuẩn 80 hoặc 443, thông tin host có thể chứa cổng, ví dụ example.com:8080. Nếu không cần cổng, tham số đầu tiên có thể được truyền vào giá trị true.
$host = $request->host(true);
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->host());
};
// Chạy worker
Worker::runAll();
Khi trình duyệt truy cập http://127.0.0.1:8080?name=tom, nó sẽ trả về 127.0.0.1:8080.
Lấy phương thức yêu cầu
$method = $request->method();
Giá trị trả về có thể là một trong các giá trị: GET, POST, PUT, DELETE, OPTIONS, HEAD.
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->method());
};
// Chạy worker
Worker::runAll();
Lấy uri yêu cầu
$uri = $request->uri();
Trả về uri của yêu cầu, bao gồm phần path và queryString.
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->uri());
};
// Chạy worker
Worker::runAll();
Khi trình duyệt truy cập http://127.0.0.1:8080/user/get.php?uid=10&type=2, nó sẽ trả về /user/get.php?uid=10&type=2.
Lấy đường dẫn yêu cầu
$path = $request->path();
Trả về phần path của yêu cầu.
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->path());
};
// Chạy worker
Worker::runAll();
Khi trình duyệt truy cập http://127.0.0.1:8080/user/get.php?uid=10&type=2, nó sẽ trả về /user/get.php.
Lấy queryString yêu cầu
$query_string = $request->queryString();
Trả về phần queryString của yêu cầu.
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->queryString());
};
// Chạy worker
Worker::runAll();
Khi trình duyệt truy cập http://127.0.0.1:8080/user/get.php?uid=10&type=2, nó sẽ trả về uid=10&type=2.
Lấy phiên bản HTTP yêu cầu
$version = $request->protocolVersion();
Trả về chuỗi 1.1 hoặc 1.0.
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->protocolVersion());
};
// Chạy worker
Worker::runAll();
Lấy sessionId yêu cầu
$sid = $request->sessionId();
Trả về chuỗi, được tạo thành từ chữ cái và số.
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->sessionId());
};
// Chạy worker
Worker::runAll();