用的TCP協(xié)議
$worker->onMessage = function($connection, $data)
{
print_r("|".$data."|\n"); // 接收較長(zhǎng)字符串時(shí)被截?cái)?, 1440長(zhǎng)度時(shí)截?cái)?}
嘗試設(shè)置:
TcpConnection::$maxPackageSize = 102400000;
TcpConnection::$defaultMaxSendBufferSize = 200*1024*1024;
$connection->maxSendBufferSize = 10240000;
均無效... 是我配置的地方不對(duì)嗎?
1、上面幾個(gè)配置首先是無效的,而且?TcpConnection::$maxPackageSize指的是每個(gè)連接能夠接收的最大包包長(zhǎng),這個(gè)是針對(duì)應(yīng)用層協(xié)議而言的;
另外兩個(gè)設(shè)置則是針對(duì)應(yīng)用層發(fā)送緩沖區(qū)的設(shè)置,和你的需求更不相關(guān)了。
2、TCP協(xié)議接收包時(shí)默認(rèn)讀取的是65535個(gè)字節(jié)。
TCP 2個(gè)特點(diǎn),
1、分幀傳輸
2、數(shù)據(jù)無邊界。
?
底層tcp數(shù)據(jù)是一幀一幀傳輸?shù)椒?wù)端的,每一幀數(shù)據(jù)大小約為1400字節(jié),所以每次onMessage里收到1400字節(jié)左右的數(shù)據(jù)是正常的。
?
由于特點(diǎn)2,無邊界,所以操作系統(tǒng)沒辦法判斷哪些幀是一個(gè)完整的數(shù)據(jù)包,也就沒辦法做到收到完整的數(shù)據(jù)包后出發(fā)onMessage。
?
由于以上特點(diǎn)才會(huì)有這么多的應(yīng)用層通訊協(xié)議出現(xiàn),http、websocket、ftp等等。應(yīng)用層通訊協(xié)議的作用就是通過分析數(shù)據(jù)幀里的數(shù)據(jù)來判斷這個(gè)數(shù)據(jù)包的大小,然后來判斷當(dāng)前收到的這些數(shù)據(jù)幀是否已經(jīng)是一個(gè)完整的數(shù)據(jù)包,如果不完整會(huì)繼續(xù)等待,如果完整則觸發(fā)onMessage。
?
所以要收到完整的數(shù)據(jù)包需要增加一個(gè)應(yīng)用層協(xié)議,參考手冊(cè)
http://doc.workerman.net/protocols/why-protocols.html
?