我嘗試顯示來自套接字的輸出,但回傳顯示被截斷。
<?php
$socket = '/var/run/qemu-server/121.serial1';
$sock = stream_socket_client('unix://'.$socket, $errno, $errstr);
fwrite($sock, $argv[1] . "\r\n");
$data = '';
while ($buffer = fread($sock, 8128)) $data .= $buffer;
echo $data;
fclose($sock);
?>
我需要這個輸出:
{"VMid":"121","Command":"ls /","Output":"bin\nboot\ndev\netc\nhome\nlib\nlib32\nlib64\nlibx32\nlost found\nmedia\nmnt\nopt\nproc\nroot\nrun\nsbin\nsnap\nsrv\nswap.img\nsys\ntmp\nusr\nvar\n"}
但它只回傳:
{"VMid":"121","Command":"ls /","Output"
我嘗試了“stream_set_read_buffer”、“file_get_contents”但沒有成功。
uj5u.com熱心網友回復:
我在這里假設服務器在您輪詢時沒有時間完全回應。sleep()您可以通過在發送指令 (fwrite) 之后再輪詢 (fread) 之前放置一個來快速測驗這個理論。這是一個測驗解決方案,而不是最終解決方案(因為您永遠不知道要“睡”多長時間)。
套接字需要的通常是連續輪詢(while 回圈基本上永遠不會結束,但在控制之下,因此您可以暫停/退出等),以及連續緩沖區讀/寫(將新內容附加到緩沖區;當您到達終點時預期訊息的數量或者您讀取了您期望的位元組數*從緩沖區的前面洗掉該內容并將其余部分留給下一個回圈。當然,如果您擁有所需的一切并關閉socket 或稍后回傳輪詢。
一個常見的技巧是將訊息的前兩個/四個位元組設定為有效負載的長度,然后是有效負載。所以你會不斷地輪詢這兩個/四個位元組,然后根據它讀取內容。像 QEMU 這樣的其他系統可能無法使用,因此您需要尋找...?EOL/NL 等?
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/503772.html
上一篇:如何知道zsh中的字串是否為空?
