send
คำอธิบาย:
mixed Connection::send(mixed $data [,$raw = false])
ส่งข้อมูลไปยังลูกค้า
พารามิเตอร์
$data
ข้อมูลที่ต้องส่ง ถ้าหากระบุโปรโตคอลขณะกำหนด Worker class จะเรียกใช้วิธี encode ของโปรโตคอลโดยอัตโนมัติ เพื่อทำงานการบรรจุโปรโตคอลก่อนที่จะส่งไปยังลูกค้า
$raw
ระบุว่าส่งข้อมูลดิบหรือไม่ นั่นคือไม่เรียกใช้วิธี encode ของโปรโตคอล โดยค่าเริ่มต้นคือ false ซึ่งจะเรียกใช้วิธี encode ของโปรโตคอลโดยอัตโนมัติ
ค่าที่ส่งกลับ
true หมายถึงข้อมูลได้ถูกเขียนลงในบัฟเฟอร์การส่งซ็อกเก็ตของระบบปฏิบัติการของการเชื่อมต่อนั้นแล้ว
null หมายถึงข้อมูลได้ถูกเขียนลงในบัฟเฟอร์การส่งของชั้นแอปพลิเคชันของการเชื่อมต่อนั้น รอการเขียนลงในบัฟเฟอร์การส่งซ็อกเก็ตของระบบชั้น
false หมายถึงการส่งล้มเหลว สาเหตุของความล้มเหลวอาจเกิดจากการเชื่อมต่อของลูกค้าได้ปิดลงแล้ว หรือบัฟเฟอร์การส่งของชั้นแอปพลิเคชันของการเชื่อมต่อนั้นเต็มแล้ว
หมายเหตุ
การเรียก send คืนค่าเป็น true หมายความว่าข้อมูลได้ถูกเขียนลงในบัฟเฟอร์การส่งซ็อกเก็ตของระบบปฏิบัติการของการเชื่อมต่อนั้นแล้วเท่านั้น ไม่ได้หมายความว่าข้อมูลนั้นได้ถูกส่งไปยังบัฟเฟอร์การรับของซ็อกเก็ตของฝั่งตรงข้ามอย่างประสบความสำเร็จ และยิ่งไม่หมายความว่าแอปพลิเคชันที่ฝั่งตรงข้ามได้อ่านข้อมูลจากบัฟเฟอร์การรับของซ็อกเก็ตท้องถิ่นแล้ว แต่แม้จะเป็นเช่นนั้น ถ้า send ไม่คืนค่ากลับเป็น false และเครือข่ายไม่มีการตัดเชื่อม และลูกค้าสามารถรับข้อมูลได้อย่างปกติ ข้อมูลจะถูกมองว่าเกือบ 100% สามารถส่งไปยังอีกฝ่ายได้
เนื่องจากข้อมูลในบัฟเฟอร์การส่งซ็อกเก็ตจะถูกส่งไปยังฝั่งตรงข้ามโดยระบบปฏิบัติการในลักษณะอะซิงโครนัส ระบบปฏิบัติการจึงไม่ได้ให้กลไกการยืนยันที่เหมาะสมกับชั้นแอปพลิเคชัน ดังนั้น ชั้นแอปพลิเคชัน จึงไม่สามารถทราบได้ว่าข้อมูลในบัฟเฟอร์การส่งซ็อกเก็ตเริ่มต้นส่งเมื่อใด และ ชั้นแอปพลิเคชัน ก็ไม่สามารถทราบได้ว่าข้อมูลในบัฟเฟอร์การส่งซ็อกเก็ตส่งไปสำเร็จหรือไม่ ตามเหตุผลข้างต้น Workerman จึงไม่สามารถให้ฟังก์ชันยืนยันข้อความโดยตรง
หากธุรกิจต้องการรับประกันว่าข้อมูลทุกชิ้นจะถูกได้รับโดยลูกค้า สามารถเพิ่มกลไกการยืนยันในระบบธุรกิจได้ กลไกการยืนยันอาจแตกต่างกันไปตามลักษณะธุรกิจ แม้กระทั่งกลไกการยืนยันเดียวกันก็สามารถมีหลายวิธีได้
ตัวอย่างเช่น ระบบแชทสามารถใช้กลไกการยืนยันนี้ได้ โดยการเก็บข้อมูลแต่ละข้อความลงในฐานข้อมูล โดยข้อความแต่ละข้อความมีฟิลด์สำหรับการอ่านแล้วหรือไม่ เมื่อลูกค้าได้รับข้อความแต่ละข้อความจะส่งแพ็กเกจการยืนยันไปยังเซิร์ฟเวอร์ เซิร์ฟเวอร์จะทำเครื่องหมายข้อความที่เกี่ยวข้องว่าอ่านแล้ว เมื่อลูกค้าเชื่อมต่อกับเซิร์ฟเวอร์ (โดยทั่วไปคือผู้ใช้เข้าสู่ระบบหรือเชื่อมต่อใหม่) จะตรวจสอบในฐานข้อมูลว่ามีข้อความที่ยังไม่ได้อ่านหรือไม่ หากมีจะแจ้งให้กับลูกค้า และเมื่อลูกค้าได้รับข้อความจะส่งการแจ้งเตือนว่าอ่านแล้วไปยังเซิร์ฟเวอร์ ด้วยวิธีนี้สามารถรับประกันได้ว่าข้อความแต่ละข้อความฝ่ายตรงข้ามจะสามารถรับได้ แน่นอนว่านักพัฒนายังสามารถใช้ลอจิกการยืนยันของตนเองได้
ตัวอย่าง
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('websocket://0.0.0.0:8484');
$worker->onMessage = function(TcpConnection $connection, $data)
{
// จะเรียกใช้ \Workerman\Protocols\Websocket::encode เพื่อบรรจุข้อมูลเป็นข้อมูลโปรโตคอล websocket ก่อนที่จะส่ง
$connection->send("hello\n");
};
// เริ่มทำงานของ worker
Worker::runAll();