TcpConnection.php 文件中,baseRead方法中
讀取socket代碼如下:
$buffer = @fread($socket, self::READ_BUFFER_SIZE);
前后代碼中并沒有看到 while() 之類的驗(yàn)證數(shù)據(jù)讀取完之類的代碼。
假如把上述代碼改為每次讀取10個(gè)字節(jié) $buffer = @fread($socket, 10);
請(qǐng)問是怎么樣的機(jī)制保證每次從socket 讀取完數(shù)據(jù)的?
然道這個(gè)和event loop 處理事件 中設(shè)置的 \Event::PERSIST參數(shù)有關(guān)嗎?
\Event::PERSIST 的解釋如下:
如果一個(gè)事件被設(shè)置了EV_PERSIST,那么這個(gè)事件就是持續(xù)化的,意思就是這個(gè)事件會(huì)保持掛起狀態(tài),即使回調(diào)函數(shù)被執(zhí)行。
是的,執(zhí)行回調(diào)函數(shù)本身并沒有清除這個(gè)事件,所以只要進(jìn)入等待狀態(tài)還會(huì)立刻觸發(fā)。只有把數(shù)據(jù)讀光了才會(huì)清除這個(gè)事件。
1樓大神你好,我按照這個(gè)思路寫了個(gè)簡單的腳本,但是貌似有點(diǎn)問題,內(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)了。
此問題已解決,哈哈。
跟2個(gè)地方有關(guān)
1.event對(duì)象必須用個(gè)全局?jǐn)?shù)組保存。
2.讀取stream時(shí)需要把設(shè)置為無緩沖區(qū)。