เหตุการณ์ที่เซิร์ฟเวอร์ส่งและ php - อะไรทำให้เกิดเหตุการณ์บนเซิร์ฟเวอร์


93

ทั้งหมด,

HTML5 Rocks มีบทช่วยสอนสำหรับผู้เริ่มต้นที่ดีเกี่ยวกับเหตุการณ์ที่เซิร์ฟเวอร์ส่ง (SSE):

http://www.html5rocks.com/en/tutorials/eventsource/basics/

แต่ฉันไม่เข้าใจแนวคิดที่สำคัญ - อะไรเป็นตัวกระตุ้นให้เกิดเหตุการณ์บนเซิร์ฟเวอร์ที่ทำให้ส่งข้อความ

กล่าวอีกนัยหนึ่ง - ในตัวอย่าง HTML5 เซิร์ฟเวอร์จะส่งการประทับเวลาเพียงครั้งเดียว :

<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache'); // recommended to prevent caching of event data.
function sendMsg($id, $msg) {
  echo "id: $id" . PHP_EOL;
  echo "data: $msg" . PHP_EOL;
  echo PHP_EOL;
  ob_flush();
  flush();
}
$serverTime = time();
sendMsg($serverTime, 'server time: ' . date("h:i:s", time()));

หากฉันกำลังสร้างตัวอย่างที่ใช้ได้จริงเช่น "กำแพง" แบบ Facebook หรือสัญลักษณ์หุ้นซึ่งเซิร์ฟเวอร์จะ "ส่ง" ข้อความใหม่ไปยังลูกค้าทุกครั้งที่มีการเปลี่ยนแปลงข้อมูลบางส่วนจะทำงานอย่างไร

กล่าวอีกนัยหนึ่ง ... สคริปต์ PHP มีลูปที่ทำงานอย่างต่อเนื่องตรวจสอบการเปลี่ยนแปลงข้อมูลจากนั้นส่งข้อความทุกครั้งที่พบหรือไม่? ถ้าเป็นเช่นนั้นคุณจะรู้ได้อย่างไรว่าเมื่อใดควรสิ้นสุดกระบวนการนั้น

หรือ - สคริปต์ PHP เพียงแค่ส่งข้อความจากนั้นก็สิ้นสุด (ตามที่ปรากฏในตัวอย่าง HTML5Rocks) ถ้าเป็นเช่นนั้นคุณจะได้รับการอัปเดตอย่างต่อเนื่องได้อย่างไร เบราว์เซอร์เป็นเพียงการสำรวจหน้า PHP ในช่วงเวลาปกติหรือไม่? ถ้าเป็นเช่นนั้น "เหตุการณ์ที่เซิร์ฟเวอร์ส่ง" เป็นอย่างไร สิ่งนี้แตกต่างจากการเขียนฟังก์ชัน setInterval ใน JavaScript ที่ใช้ AJAX เพื่อเรียกหน้า PHP ในช่วงเวลาปกติอย่างไร

ขอโทษ - นี่อาจเป็นคำถามที่ไร้เดียงสาอย่างไม่น่าเชื่อ แต่ไม่มีตัวอย่างใดที่ฉันสามารถหาได้ทำให้ชัดเจน

[อัปเดต]

ฉันคิดว่าคำถามของฉันใช้คำไม่ดีดังนั้นนี่คือคำชี้แจงบางส่วน

สมมติว่าฉันมีหน้าเว็บที่ควรแสดงราคาล่าสุดของหุ้นของ Apple

เมื่อผู้ใช้เปิดหน้าครั้งแรกหน้าจะสร้าง EventSource โดยใช้ URL ของ "stream" ของฉัน

var source = new EventSource('stream.php');

คำถามของฉันคือ "stream.php" ควรทำงานอย่างไร

แบบนี้? (รหัสหลอก):

<?php
    header('Content-Type: text/event-stream');
    header('Cache-Control: no-cache'); // recommended to prevent caching of event data.
    function sendMsg($msg) {
        echo "data: $msg" . PHP_EOL;
        echo PHP_EOL;
        flush();
    }

    while (some condition) {
        // check whether Apple's stock price has changed
        // e.g., by querying a database, or calling a web service
        // if it HAS changed, sendMsg with new price to client
        // otherwise, do nothing (until next loop)
        sleep (n) // wait n seconds until checking again
    }
?>

กล่าวอีกนัยหนึ่ง - "stream.php" จะยังคงเปิดอยู่ตราบเท่าที่ไคลเอนต์ "เชื่อมต่อ" กับมันหรือไม่

ถ้าเป็นเช่นนั้นหมายความว่าคุณมีเธรดจำนวนมากstream.phpเท่าที่คุณมีผู้ใช้พร้อมกันหรือไม่? ถ้าเป็นเช่นนั้น - เป็นไปได้จากระยะไกลหรือเป็นวิธีที่เหมาะสมในการสร้างแอปพลิเคชัน? และคุณจะรู้ได้อย่างไรว่าคุณสามารถยุติอินสแตนซ์ได้เมื่อstream.phpใด

ความประทับใจที่ไร้เดียงสาของฉันคือถ้าเป็นกรณีนี้ PHP ไม่ใช่เทคโนโลยีที่เหมาะสมสำหรับเซิร์ฟเวอร์ประเภทนี้ แต่การสาธิตทั้งหมดที่ฉันได้เห็นบ่งบอกว่า PHP นั้นใช้ได้ดีสำหรับสิ่งนี้ซึ่งเป็นสาเหตุที่ทำให้ฉันสับสน ...


นั่นคือส่วนที่นักพัฒนาต้องเขียนโค้ดด้วยตัวเอง วิธีการรับข้อมูลคือผ่าน websockets / long polling เป็นต้นอย่างไรก็ตามเคล็ดลับคือสิ่งที่ทำให้เกิดเหตุการณ์ ส่วนตัวผมได้ทดลองมีไม่กี่แนวทางและวิธีการหนึ่งที่ผมชอบ ( แต่มันก็ไม่ได้ว่าไม่ปลอดภัย) คือการทำทริกเกอร์ MySQL โปรแกรมคอนโซลทุกสิ่งที่เวลาถูกแทรกในตารางที่เฉพาะเจาะจง โปรแกรมคอนโซลจะรับข้อมูลเกี่ยวกับบันทึกที่เปลี่ยนแปลง / แทรกและจะส่งการแจ้งเตือนไปยังผู้ใช้ที่เกี่ยวข้องผ่าน WebSockets โดยทั่วไปฉันมี PHP daemon ที่รอส่งข้อความไปรอบ ๆ
NB

ปัญหาหนึ่งในเรื่องนี้ IE ไม่รองรับ SSE: - / นอกจากนี้ฉันจะอ่านprodigyproductionsllc.com/articles/programming/javascript/…ฉันคิดว่าเขาใช้พอร์ตเพื่อหลีกเลี่ยงปัญหาเด็ก ๆ มากเกินไป แต่โดยรวมแล้วดูเหมือนเขา คำแนะนำคือหลีกเลี่ยง SSE ดูเหมือนว่าจะมีปัญหามากกว่าที่ควร IMO
PJ Brunet

ขณะนี้ IE11 หรือ Android Browser caniuse.com/eventsource ไม่รองรับ
PJ Brunet

1
หากบางคนต้องการรหัส sse php: github.com/shahzadthathal/server-sent-events-php-example
Muhammad Shahzad

4
ฉันมีคำถามเดียวกันและผมคิดว่าผมอย่างล้ำลึกเข้าใจสิ่งที่คุณหมายถึงสิ่งที่เรียกเหตุการณ์บนเซิร์ฟเวอร์ ... เมื่อคุณสร้างออบเจ็กEventSource('stream.php')ต์ไคลเอนต์จะเปิดการเชื่อมต่อstream.phpซึ่งเหมือนกับการเรียกโดย ajax การเชื่อมต่อนี้จะทริกเกอร์โค้ดฝั่งเซิร์ฟเวอร์ของคุณและเปิดการเชื่อมต่อไว้ตราบเท่าที่โค้ดฝั่งเซิร์ฟเวอร์ของคุณมีบางอย่างที่จะพูด จากนั้นการเชื่อมต่อจะปิดลงและหลังจากนั้นไม่นาน (3 วินาทีในโครเมี่ยมฉันคิดว่า) ไคลเอนต์จะเปิดการเชื่อมต่อstream.phpอีกครั้งซึ่งเรียกใช้ไฟล์ของคุณอีกครั้ง
Ahmad Maleki

คำตอบ:


29

"... " stream.php "จะยังคงเปิดอยู่ตราบเท่าที่ไคลเอนต์" เชื่อมต่อ "กับมันหรือไม่"

ใช่และรหัสหลอกของคุณเป็นแนวทางที่สมเหตุสมผล

"และคุณจะรู้ได้อย่างไรว่าคุณสามารถสิ้นสุดอินสแตนซ์ของ stream.php ได้เมื่อใด"

ในกรณีปกติส่วนใหญ่จะเกิดขึ้นเมื่อผู้ใช้ออกจากไซต์ของคุณ (Apache รู้จักซ็อกเก็ตที่ปิดและฆ่าอินสแตนซ์ PHP) เวลาหลักที่คุณอาจปิดซ็อกเก็ตจากฝั่งเซิร์ฟเวอร์คือถ้าคุณรู้ว่าจะไม่มีข้อมูลในขณะนั้น ข้อความสุดท้ายที่คุณส่งลูกค้าคือบอกให้พวกเขากลับมาในช่วงเวลาหนึ่ง เช่นในกรณีการสตรีมหุ้นของคุณคุณสามารถปิดการเชื่อมต่อเวลา 20.00 น. และแจ้งให้ลูกค้ากลับมาใน 8 ชั่วโมง (สมมติว่า NASDAQ เปิดให้เสนอราคาตั้งแต่เวลา 04.00 น. ถึง 20.00 น.) เย็นวันศุกร์คุณบอกให้กลับมาในเช้าวันจันทร์ (ฉันมีหนังสือเล่มใหม่เกี่ยวกับ SSE และอุทิศสองสามส่วนเกี่ยวกับเรื่องนี้)

"... ถ้าเป็นกรณีนี้ PHP ไม่ใช่เทคโนโลยีที่เหมาะสมสำหรับเซิร์ฟเวอร์ประเภทนี้ แต่การสาธิตทั้งหมดที่ฉันเห็นจนถึงตอนนี้บ่งบอกว่า PHP ใช้ได้ดีสำหรับสิ่งนี้ซึ่งเป็นสาเหตุที่ทำให้ฉัน สับสน..."

มีคนโต้แย้งว่า PHP ไม่ใช่เทคโนโลยีที่เหมาะสมสำหรับเว็บไซต์ปกติและถูกต้อง: คุณสามารถทำได้โดยใช้หน่วยความจำและรอบ CPU น้อยลงมากหากคุณแทนที่ LAMP stack ทั้งหมดด้วย C ++ อย่างไรก็ตามอย่างไรก็ตาม PHP สามารถใช้งานเว็บไซต์ส่วนใหญ่ได้ดี เป็นภาษาที่มีประสิทธิผลมากสำหรับการทำงานบนเว็บเนื่องจากการผสมผสานระหว่างไวยากรณ์แบบ C ที่คุ้นเคยและไลบรารีจำนวนมากและเป็นภาษาที่สะดวกสบายสำหรับผู้จัดการเนื่องจากมีโปรแกรมเมอร์ PHP จำนวนมากให้จ้างหนังสือและแหล่งข้อมูลอื่น ๆ จำนวนมากและบางส่วนมีขนาดใหญ่ กรณีการใช้งาน (เช่น Facebook และ Wikipedia) นี่เป็นเหตุผลเดียวกับที่คุณอาจเลือก PHP เป็นเทคโนโลยีการสตรีมของคุณ

การตั้งค่าโดยทั่วไปจะไม่เป็นการเชื่อมต่อกับ NASDAQ ต่อหนึ่งอินสแตนซ์ PHP แต่คุณจะมีกระบวนการอื่นที่มีการเชื่อมต่อกับ NASDAQ เพียงครั้งเดียวหรืออาจเป็นการเชื่อมต่อเดียวจากแต่ละเครื่องในคลัสเตอร์ของคุณไปยัง NASDAQ จากนั้นจะผลักราคาไปยังเซิร์ฟเวอร์ SQL / NoSQL หรือในหน่วยความจำที่ใช้ร่วมกัน จากนั้น PHP จะทำการสำรวจหน่วยความจำที่ใช้ร่วมกัน (หรือฐานข้อมูล) และผลักข้อมูลออก หรือมีเซิร์ฟเวอร์รวบรวมข้อมูลและแต่ละอินสแตนซ์ PHP จะเปิดการเชื่อมต่อซ็อกเก็ตไปยังเซิร์ฟเวอร์นั้น เซิร์ฟเวอร์รวบรวมข้อมูลจะส่งการอัปเดตไปยังไคลเอนต์ PHP แต่ละตัวเมื่อได้รับและจะส่งข้อมูลนั้นไปยังไคลเอ็นต์ของตน

ปัญหาความสามารถในการปรับขนาดหลักในการใช้ Apache + PHP สำหรับการสตรีมคือหน่วยความจำสำหรับแต่ละกระบวนการ Apache เมื่อคุณถึงขีด จำกัด หน่วยความจำของฮาร์ดแวร์ให้ตัดสินใจทางธุรกิจเพื่อเพิ่มเครื่องอื่นในคลัสเตอร์หรือตัด Apache ออกจากลูปและเขียนเซิร์ฟเวอร์ HTTP เฉพาะ สามารถทำได้ใน PHP ดังนั้นความรู้และรหัสที่มีอยู่ทั้งหมดของคุณสามารถนำมาใช้ใหม่หรือคุณสามารถเขียนแอปพลิเคชันทั้งหมดใหม่ในภาษาอื่น นักพัฒนาที่แท้จริงในตัวฉันจะเขียนเซิร์ฟเวอร์ HTTP เฉพาะที่มีความคล่องตัวใน C ++ ผู้จัดการในตัวฉันจะเพิ่มอีกกล่อง


เนื่องจากแต่ละกระบวนการเชื่อมต่อ Apache ใช้หน่วยความจำจึงควรใช้ Nginx แทนหรือไม่?
Zhang Buzz

@ZhangBuzz ที่ฉันเคยพูดว่า Apache + PHP มันหมายถึง "เว็บเซิร์ฟเวอร์ + กระบวนการ PHP" โดยพื้นฐานแล้วไม่แตกต่างกับการใช้เว็บเซิร์ฟเวอร์อื่น
Darren Cook

บางทีเซิร์ฟเวอร์เช่นนี้? github.com/hoaproject/Eventsourceหรือgithub.com/hhxsv5/php-sse
Enrique

โปรดทราบว่า Nginx อาจมีประสิทธิภาพมากกว่านี้เนื่องจากใช้หน่วยความจำน้อยลง: blog.webfaction.com/2008/12/…
Enrique

32

เหตุการณ์ที่เซิร์ฟเวอร์ส่งมาสำหรับการอัปเดตแบบเรียลไทม์จากฝั่งเซิร์ฟเวอร์ไปยังฝั่งไคลเอ็นต์ ในตัวอย่างแรกการเชื่อมต่อจากเซิร์ฟเวอร์จะไม่ถูกเก็บไว้และไคลเอนต์จะพยายามเชื่อมต่ออีกครั้งทุกๆ 3 วินาทีและทำให้เหตุการณ์ที่เซิร์ฟเวอร์ส่งไม่แตกต่างจากการสำรวจของ ajax

ดังนั้นเพื่อให้การเชื่อมต่อยังคงมีอยู่คุณต้องห่อรหัสของคุณเป็นวงและตรวจสอบการอัปเดตอย่างต่อเนื่อง

PHP เป็นแบบเธรดและผู้ใช้ที่เชื่อมต่อมากขึ้นจะทำให้เซิร์ฟเวอร์หมดทรัพยากร สิ่งนี้สามารถแก้ไขได้โดยการควบคุมเวลาเรียกใช้สคริปต์และสิ้นสุดสคริปต์เมื่อเกินระยะเวลา (เช่น 10 นาที) EventSourceAPI จะเชื่อมต่อโดยอัตโนมัติอีกครั้งเพื่อความล่าช้าอยู่ในช่วงที่ยอมรับได้

นอกจากนี้ตรวจสอบไลบรารี PHPของฉันสำหรับเหตุการณ์ที่เซิร์ฟเวอร์ส่งคุณสามารถเข้าใจเพิ่มเติมเกี่ยวกับวิธีการทำเหตุการณ์ที่เซิร์ฟเวอร์ส่งใน PHP และทำให้โค้ดง่ายขึ้น


5
คุณช่วยอธิบายเพิ่มเติมเกี่ยวกับ "สิ่งนี้สามารถแก้ไขได้โดยการควบคุมเวลาเรียกใช้สคริปต์และสิ้นสุดสคริปต์เมื่อเกินระยะเวลา" หากคุณมีผู้ใช้จำนวนมากเกินไปการปิดการเชื่อมต่อจะช่วยเพิ่มการใช้ทรัพยากรได้จริงหรือไม่เนื่องจากผู้ใช้จะเชื่อมต่ออีกครั้งใน 3 วินาที
ลุค

4

ฉันสังเกตเห็นว่า sse techink ส่งข้อมูลความล่าช้าทุกสองสามรายการไปยังไคลเอนต์ (บางครั้งก็เหมือนกับการย้อนกลับการรวมข้อมูล Techink จากหน้าไคลเอนต์เช่น Ajax รวมข้อมูล) ดังนั้นเพื่อเอาชนะปัญหานี้ฉันทำสิ่งนี้ที่หน้า sseServer.php:

<?php
        session_start();
        header('Content-Type: text/event-stream');
        header('Cache-Control: no-cache'); // recommended to prevent caching of event data
        require 'sse.php';
        if ($_POST['message'] != ""){
                $_SESSION['message'] = $_POST['message'];
                $_SESSION['serverTime'] = time();
        }
        sendMsg($_SESSION['serverTime'], $_SESSION['message'] );
?>

และ sse.php คือ:

<?php
function sendMsg($id, $msg) {
  echo "id: $id" . PHP_EOL;
  echo "data: $msg" . PHP_EOL;
  echo PHP_EOL;
  ob_flush();
  flush();
}
?>

สังเกตว่าที่ sseSerer.php ฉันเริ่มเซสชันและใช้ตัวแปรเซสชัน! เพื่อเอาชนะปัญหา

นอกจากนี้ฉันยังเรียกใช้ sseServer.php ผ่าน Ajax (โพสต์และตั้งค่าเป็นvariable message) ทุกครั้งที่ฉันต้องการ "อัปเดต" ข้อความ

ตอนนี้ที่ jQuery (javascript) ฉันทำอะไรแบบนั้น: 1) ฉันประกาศตัวแปร global var timeStamp = 0; 2) ฉันใช้อัลกอริทึมถัดไป:

if(typeof(EventSource)!=="undefined"){
        var source=new EventSource("sseServer.php");
        source.onmessage=function(event)
        if ((timeStamp!=event.lastEventId) && (timeStamp!=0)){
                /* this is initialization */
                timeStamp=event.lastEventId;
                $.notify("Please refresh "+event.data, "info");
        } else {
                if (timeStamp==0){
                         timeStamp=event.lastEventId;
                }
        } /* fi */

} else {
        document.getElementById("result").innerHTML="Sorry, your browser does not support server-sent events...";
} /* fi */

ที่บรรทัด: $.notify("Please refresh "+event.data, "info"); คุณสามารถจัดการกับข้อความได้หรือไม่

สำหรับกรณีของฉันฉันเคยส่งการแจ้งเตือน jQuery

คุณอาจใช้ POSIX PIPES หรือ DB Table แทนเพื่อส่ง "ข้อความ" ผ่าน POST เนื่องจาก sseServer.php ทำสิ่งที่คล้ายกับ "infinite loop"

ปัญหาของฉันในเวลานั้นคือรหัสด้านบนไม่ส่ง "ข้อความ" ไปยังไคลเอนต์ทั้งหมด แต่เฉพาะกับคู่ (ไคลเอนต์ที่เรียกว่า sseServer.php ทำงานเป็นรายบุคคลสำหรับทุกคู่) ดังนั้นฉันจะเปลี่ยนเทคนิคและเป็น DB อัปเดตจากหน้าที่ฉันต้องการทริกเกอร์ "ข้อความ" จากนั้น sseServer.php แทนเพื่อรับข้อความผ่าน POST ซึ่งจะได้รับจากตาราง DB

ฉันหวังว่าฉันจะได้รับความช่วยเหลือ!


3

นี่เป็นคำถามเชิงโครงสร้างเกี่ยวกับแอปพลิเคชันของคุณ เหตุการณ์แบบเรียลไทม์เป็นสิ่งที่คุณต้องการคิดตั้งแต่ต้นดังนั้นคุณจึงสามารถออกแบบแอปพลิเคชันของคุณได้ หากคุณเขียนแอปพลิเคชันที่mysql(i)_queryใช้วิธีการสุ่มจำนวนมากโดยใช้การสืบค้นสตริงและไม่ได้ส่งผ่านตัวกลางประเภทใด ๆ หลายครั้งคุณจะไม่มีทางเลือกนอกจากจะเขียนแอปพลิเคชันของคุณใหม่หรือทำ การสำรวจฝั่งเซิร์ฟเวอร์คงที่

อย่างไรก็ตามหากคุณจัดการเอนทิตีของคุณเป็นอ็อบเจ็กต์และส่งผ่านคลาสตัวกลางบางประเภทคุณสามารถเชื่อมโยงเข้ากับกระบวนการนั้นได้ ดูตัวอย่างนี้:

<?php
class MyQueryManager {
    public function find($myObject, $objectId) {
        // Issue a select query against the database to get this object
    }

    public function save($myObject) {
        // Issue a query that saves the object to the database
        // Fire a new "save" event for the type of object passed to this method
    }

    public function delete($myObject) {
        // Fire a "delete" event for the type of object
    }
}

ในแอปพลิเคชันของคุณเมื่อคุณพร้อมที่จะบันทึก:

<?php
$someObject = $queryManager->find("MyObjectName", 1);
$someObject->setDateTimeUpdated(time());
$queryManager->save($someObject);

นี่ไม่ใช่ตัวอย่างที่สง่างามที่สุด แต่ควรใช้เป็นส่วนประกอบหลักที่เหมาะสม คุณสามารถเชื่อมต่อกับเลเยอร์การคงอยู่ที่แท้จริงของคุณเพื่อจัดการกับการกระตุ้นเหตุการณ์เหล่านี้ จากนั้นคุณจะได้รับทันที (ตามเวลาจริงเท่าที่จะทำได้) โดยไม่ต้องตอกเซิร์ฟเวอร์ของคุณ (เนื่องจากคุณไม่จำเป็นต้องสืบค้นฐานข้อมูลของคุณตลอดเวลาและดูว่ามีการเปลี่ยนแปลงหรือไม่)

เห็นได้ชัดว่าคุณจะไม่ตรวจจับการเปลี่ยนแปลงฐานข้อมูลด้วยตนเองด้วยวิธีนี้ - แต่ถ้าคุณทำอะไรด้วยตนเองกับฐานข้อมูลของคุณด้วยความถี่ใด ๆ คุณควร:

  • แก้ไขปัญหาที่ทำให้คุณต้องทำการเปลี่ยนแปลงด้วยตนเอง
  • สร้างเครื่องมือเพื่อเร่งกระบวนการและเริ่มเหตุการณ์เหล่านี้

3
โคลิน - ขอบคุณสำหรับคำตอบ ความผิดของฉัน - คำถามของฉันไม่ชัดเจน - แต่นี่ไม่ใช่สิ่งที่ฉันถามจริงๆ สิ่งที่ผมหมายถึงที่จะถามนี้คือ ... หากคุณกำลังใช้ PHP เป็นเซิร์ฟเวอร์ "" คุณ - ไม่ PHP สคริปต์ที่คุณโทรจาก EventSource ในความต้องการของลูกค้าในการทำงานตลอดเวลาที่ลูกค้ามีการเชื่อมต่อไปได้หรือไม่ นั่นหมายความว่าหากคุณมีผู้ใช้พร้อมกัน 1,000 คนคุณมีเธรดแยกกัน 1,000 เธรดที่เรียกใช้สคริปต์ PHP ของคุณพร้อมกัน 1,000 อินสแตนซ์ เป็นไปได้หรือไม่ และคุณจะรู้ได้อย่างไรว่าเมื่อใดควรสิ้นสุดสคริปต์ php (สมมติว่ามันวนซ้ำเพื่อ "มีชีวิต")
mattstuehler

-7

โดยทั่วไป PHP ไม่ใช่เทคโนโลยีที่เหมาะสมสำหรับสิ่งประเภทนี้ ใช่คุณสามารถทำให้มันใช้งานได้ แต่มันจะเป็นหายนะเมื่อมีการโหลดสูง เราเรียกใช้ผู้ขายหุ้นที่ส่งสัญญาณการเปลี่ยนแปลงหุ้นผ่านทางเว็บซ็อกเก็ตไปยังผู้ใช้ thousends หลายสิบคนและถ้าเราจะใช้ php สำหรับสิ่งนั้น ... เราทำได้ แต่วงจรแบบโฮมเมดเหล่านั้นเป็นเพียงฝันร้าย ทุกการเชื่อมต่อจะทำให้กระบวนการแยกกันบนเซิร์ฟเวอร์หรือคุณต้องจัดการการเชื่อมต่อจากฐานข้อมูลบางประเภท

เพียงใช้ nodejs และ socket.io จะช่วยให้คุณเริ่มต้นและมีเซิร์ฟเวอร์ที่ใช้งานได้อย่างง่ายดายภายในสองสามวัน Nodejs มีข้อ จำกัด ของตัวเองเช่นกัน แต่สำหรับการเชื่อมต่อ websockets (และ SSE) ปัจจุบันเป็นเทคโนโลยีที่มีประสิทธิภาพมากที่สุด

และเช่นกัน - SSE ไม่ค่อยดีเท่าที่ควร ข้อดีอย่างเดียวของ websockets - คือแพ็กเก็ตจะถูก gzipped โดยกำเนิด (ws ไม่ใช่ gzipped) แต่ข้อเสียคือ SSE เป็นการเชื่อมต่อด้านเดียว ผู้ใช้ของคุณหากเขาต้องการเพิ่มสัญลักษณ์หุ้นอื่นในตัวห้อยจะต้องทำการร้องขอ ajax (รวมถึงปัญหาทั้งหมดเกี่ยวกับการควบคุมต้นทางและคำขอจะช้า) ในไคลเอนต์ websockets และตัดการสื่อสารทั้งสองวิธีในการเชื่อมต่อที่เปิดเพียงครั้งเดียวดังนั้นหากผู้ใช้ส่งสัญญาณการซื้อขายหรือสมัครรับใบเสนอราคาเขาก็ส่งสตริงในการเชื่อมต่อที่เปิดอยู่ และมันเร็ว


2
คุณสามารถใช้ React.php แบบพื้นฐานได้เช่นเดียวกับ event-loop ใน node.js
MatějKoubík

3
แม้ว่าจะเป็นการดีที่จะบอกว่า PHP ไม่ใช่ตัวเลือกที่ดีที่สุด แต่ฉันคิดว่าอย่างน้อยคุณควรใส่สิ่งที่ OP ขอ
Nishchal Gautam
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.