คำอธิบาย
workerman ได้เพิ่มการสนับสนุน HTTP ตั้งแต่เวอร์ชัน 4.x ซึ่งได้มีการแนะนำคลาสสำหรับคำขอ, คลาสสำหรับการตอบสนอง, คลาสสำหรับ session และSSE หากคุณต้องการใช้บริการ HTTP ของ workerman เราขอแนะนำให้ใช้ workerman เวอร์ชัน 4.x หรือรุ่นที่สูงกว่านั้น
รับวัตถุ session
$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
Worker::runAll();
ข้อควรระวัง
- session จะต้องถูกดำเนินการก่อนการเรียกใช้
$connection->send() - session จะถูกบันทึกอัตโนมัติเมื่อวัตถุถูกทำลาย ดังนั้นอย่าเก็บวัตถุที่คืนค่าจาก
$request->session()ในอาร์เรย์ทั่วโลกหรือสมาชิกของคลาส ซึ่งอาจทำให้ session ไม่สามารถบันทึกได้ - session จะถูกเก็บในไฟล์ระบบโดยค่าเริ่มต้น หากต้องการประสิทธิภาพที่ดีกว่า แนะนำให้ใช้ redis
รับข้อมูลทั้งหมดของ session
$session = $request->session();
$all = $session->all();
ค่าที่คืนกลับเป็นอาร์เรย์ หากไม่มีข้อมูล 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', 'tom');
$connection->send(var_export($session->all(), true));
};
// เริ่มทำงาน worker
Worker::runAll();
รับค่าบางอย่างจาก session
$session = $request->session();
$name = $session->get('name');
หากข้อมูลไม่อยู่จะคืนค่าเป็น null
คุณยังสามารถส่งค่าเริ่มต้นเป็นพารามิเตอร์ที่สองให้กับวิธี get หากไม่พบค่าที่ตรงกันในอาร์เรย์ session จะคืนค่าดังกล่าว ตัวอย่าง:
$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
Worker::runAll();
การจัดเก็บ session
เพื่อจัดเก็บค่าข้อมูลบางอย่างใช้วิธี set
$session = $request->session();
$session->set('name', 'tom');
set ไม่มีค่าที่ส่งกลับ วัตถุ session จะถูกบันทึกโดยอัตโนมัติเมื่อวัตถุถูกทำลาย
เมื่อจัดเก็บหลายค่าใช้วิธี 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
Worker::runAll();
ลบข้อมูล session
เมื่อต้องการลบข้อมูล session บางอย่างหรือหลายอย่าง ใช้ forget method
$session = $request->session();
// ลบหนึ่งรายการ
$session->forget('name');
// ลบหลายรายการ
$session->forget(['name', 'age']);
นอกจากนี้ยังมี delete method ที่ระบบจัดเตรียมไว้ โดยแตกต่างจาก 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
Worker::runAll();
รับและลบค่าบางอย่างจาก session
$session = $request->session();
$name = $session->pull('name');
ผลลัพธ์จะเหมือนกับโค้ดด้านล่าง
$session = $request->session();
$value = $session->get($name);
$session->delete($name);
หาก session ที่สอดคล้องกันไม่อยู่ จะคืนค่าเป็น 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
Worker::runAll();
ลบข้อมูล session ทั้งหมด
$request->session()->flush();
ไม่มีค่าที่ส่งกลับ วัตถุ 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)
{
$request->session()->flush();
$connection->send('ok');
};
// เริ่มทำงาน worker
Worker::runAll();
ตรวจสอบว่าข้อมูล session ที่ตรงกันมีอยู่หรือไม่
$session = $request->session();
$has = $session->has('name');
โดยข้อความข้างต้นจะคืนค่า false เมื่อ session ที่ตรงกันไม่อยู่หรือค่าของ session ตรงกันเป็น null, มิฉะนั้นจะคืนค่า true
$session = $request->session();
$has = $session->exists('name');
โค้ดข้างต้นก็ใช้เพื่อตรวจสอบว่าข้อมูล session มีอยู่หรือไม่ ความแตกต่างคือเมื่อค่าของ session นั้นเป็น null ก็จะคืนค่าเป็น true
ข้อควรระวัง
เมื่อใช้ session ไม่แนะนำให้เก็บอินสแตนซ์วัตถุของคลาสโดยตรง โดยเฉพาะคลาสที่ไม่สามารถควบคุมได้ เนื่องจากการทำลายข้อมูลในรูปแบบย้อนกลับอาจเกิดความเสี่ยงที่อาจซ่อนอยู่ได้