TcpConnection.php 文件中,baseRead方法中
讀取socket代碼如下:
$buffer = @fread($socket, self::READ_BUFFER_SIZE);
前后代碼中并沒有看到 while() 之類的驗證數(shù)據(jù)讀取完之類的代碼。
假如把上述代碼改為每次讀取10個字節(jié) $buffer = @fread($socket, 10);
請問是怎么樣的機制保證每次從socket 讀取完數(shù)據(jù)的?
然道這個和event loop 處理事件 中設置的 \Event::PERSIST參數(shù)有關嗎?
\Event::PERSIST 的解釋如下:
如果一個事件被設置了EV_PERSIST,那么這個事件就是持續(xù)化的,意思就是這個事件會保持掛起狀態(tài),即使回調(diào)函數(shù)被執(zhí)行。
是的,執(zhí)行回調(diào)函數(shù)本身并沒有清除這個事件,所以只要進入等待狀態(tài)還會立刻觸發(fā)。只有把數(shù)據(jù)讀光了才會清除這個事件。
1樓大神你好,我按照這個思路寫了個簡單的腳本,但是貌似有點問題,內(nèi)層的讀取數(shù)據(jù)event好像執(zhí)行不了。問題出在哪?
$event = new Event($event_base, $fd, Event::READ | Event::PERSIST, function ($fd) use (&$event_base) {
//接收創(chuàng)建的socket
$conn = stream_socket_accept($fd);
stream_set_read_buffer($fd, 0);
$event2 = new Event($event_base, $conn, Event::READ | Event::PERSIST, function ($conn) {
$con = @fread($conn,2)."\n";
echo $con."\n";
},$conn);
$event2->add();
}, $fd);
$event = new Event($event_base, $fd, Event::READ | Event::PERSIST, function ($fd) use (&$event_base) {
//接收創(chuàng)建的socket
$conn = stream_socket_accept($fd);
stream_set_read_buffer($fd, 0);
$con = @fread($conn,2)."\n";
echo $con;
}, $fd);
這么干是可以接收到的,但是讀取數(shù)據(jù)就不基于事件循環(huán)了。