คำอธิบาย

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 ไม่แนะนำให้เก็บอินสแตนซ์วัตถุของคลาสโดยตรง โดยเฉพาะคลาสที่ไม่สามารถควบคุมได้ เนื่องจากการทำลายข้อมูลในรูปแบบย้อนกลับอาจเกิดความเสี่ยงที่อาจซ่อนอยู่ได้