คำอธิบาย
workerman ตั้งแต่เวอร์ชัน 4.x เป็นต้นมา ได้เพิ่มการสนับสนุนบริการ HTTP โดยการนำเข้าชั้นเรียน Request, Response, session และ SSE หากคุณต้องการใช้บริการ HTTP ของ workerman ขอแนะนำอย่างยิ่งให้ใช้ workerman 4.x หรือเวอร์ชันที่สูงกว่า
หมายเหตุ ข้างล่างนี้คือการใช้งาน workerman เวอร์ชัน 4.x ซึ่งไม่สามารถใช้กับ workerman 3.x ได้
รับอ็อบเจ็กต์คำขอ
อ็อบเจ็กต์คำขอจะถูกดึงจากฟังก์ชัน callback onMessage โดยที่กรอบงานจะส่งอ็อบเจ็กต์ Request ผ่านพารามิเตอร์ที่สองของฟังก์ชัน callback โดยอัตโนมัติ
ตัวอย่าง
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 ซึ่งหากไม่พบค่าที่ตรงกันจะส่งคืนค่าเริ่มต้น ตัวอย่าง:
$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 ซึ่งหากไม่พบค่าที่ตรงกันจะส่งคืนค่าเริ่มต้น ตัวอย่าง:
$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();
ฟังก์ชันนี้คล้ายกับการทำงานของ php-fpm ที่ใช้ file_get_contents("php://input"); ใช้ในการรับเนื้อหา 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();
รับ header
รับทั้งอาร์เรย์ header
$headers = $request->header();
หากคำขอไม่มีพารามิเตอร์ header จะส่งคืนอาร์เรย์ว่าง หมายเหตุว่า key ทั้งหมดจะเป็นตัวพิมพ์เล็ก
รับค่าจากอาร์เรย์ header
$host = $request->header('host');
หากอาร์เรย์ header ไม่มีค่านี้จะส่งคืน null หมายเหตุว่า key ทั้งหมดจะเป็นตัวพิมพ์เล็ก
เช่นเดียวกับฟังก์ชัน 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();
รับ cookie
รับทั้งอาร์เรย์ cookie
$cookies = $request->cookie();
หากคำขอไม่มีพารามิเตอร์ cookie จะส่งคืนอาร์เรย์ว่าง
รับค่าจากอาร์เรย์ cookie
$name = $request->cookie('name');
หากอาร์เรย์ cookie ไม่มีค่านี้จะส่งคืน 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 คือลักษณะของไฟล์
หมายเหตุ:
-
ขนาดไฟล์ที่อัปโหลดอยู่ภายใต้ข้อจำกัดของ 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('upload fail');
};
// เรียกใช้งาน worker
Worker::runAll();
รับ host
รับข้อมูล host จากคำขอ
$host = $request->host();
หากที่อยู่ของคำขอเป็นพอร์ตที่ไม่มาตรฐานคือ 80 หรือ 443 ข้อมูล host อาจมีพอร์ตประกอบอยู่ เช่น 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 ของคำขอ
$path = $request->path();
ส่งคืนส่วน 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();