[英]PHP hanging on socket_read
我正在嘗試從我在Java應用程序上編寫的套接字讀取響應。 但是PHP只是掛起了。 這是我用來從套接字讀取的代碼:
while($resp = socket_read($socket, 1000)) {
$str .= $resp;
if (strpos($str, "\n") !== false) {
break;
}
}
當我從終端運行套接字調用時,肯定會有一個響應。 這是我在Java中的響應代碼:
out.println(request.seed);
其中request.seed是一個int。 我也嘗試過:
out.println(request.passcode + "\n");
但這並不能解決問題。
當我在終端中請求以下內容時:
josephs-macbook:~ jf$ echo "pairBankRequest|userID=305,bankID=12," | nc 127.0.0.1 3030
我得到以下答復:
830039
這是預期的。
在PHP客戶端程序中,在套接字寫入和讀取之間插入usleep(500)
。
代碼被掛起的原因是因為您的緩沖區大於要發送的數據。
如果將緩沖區從1000字節降低到1字節,則會看到腳本不再掛起。
從PHP手冊中:
可選的type參數是一個命名常量:
PHP_BINARY_READ(默認)-使用系統recv()函數。 安全讀取二進制數據。 PHP_NORMAL_READ-讀取在\\ n或\\ r停止。
資料來源: http : //www.php.net/manual/en/function.socket-read.php
您是否嘗試過將PHP_NORMAL_READ用作socket_read()的第三個參數? 這也將消除檢查strpos($str, "\\n")...
。
只是在黑暗中拍攝,但我會嘗試的。
編輯:
這是對我有用的代碼片段:
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
...
// connecting the socket, etc
...
$result = '';
$numBytes = 100;
$numRead = 0;
while ($numRead < $numBytes)
{
$tmp = socket_read($socket, $numBytes - $numRead, PHP_BINARY_READ);
if ($tmp === false)
{
$error = socket_last_error();
socket_close($socket);
$socket = null;
throw new Exception('Read error ('.$error.')');
}
$numRead += strlen($tmp);
$result.= $tmp;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.