<span><span>Warning: stream_socket_server(): unable to bind to tcp://127.0.0.1:8080 (Reason: Address already in use) in ...
</span></span>
這個錯誤通常出現在你嘗試使用stream_socket_server綁定到已經被其他程序佔用的端口或地址。解決方法有兩個:
檢查端口是否被佔用:使用netstat -tuln (Linux)或lsof -i :8080命令來檢查端口是否已被其他應用佔用。
選擇另一個端口:如果端口被佔用,選擇一個未被使用的端口,或者停止佔用該端口的服務。
<span><span>Warning: stream_socket_server(): unable to create socket resource in ...
</span></span>
這個錯誤可能與系統限製或權限問題有關。常見的原因有:
權限不足:在Linux系統中,綁定到1024以下的端口需要root權限。解決方法是使用更高的端口號,或以管理員權限運行腳本。
系統資源限制:系統可能有限制打開的文件描述符數。你可以通過ulimit -n命令查看當前限制,並通過ulimit -n <number>來增加限制。
<span><span>Warning: stream_socket_accept(): unable to accept connection in ...
</span></span>
如果你已經成功創建了服務器資源,但仍然無法接受連接,可能是以下原因:
網絡配置問題:確保你綁定的地址和端口是正確的,並且網絡是通的。如果是本地開發環境,確保沒有防火牆阻擋端口。
阻塞問題:默認情況下, stream_socket_server是一個阻塞的函數。如果沒有連接到來,它將一直等待。你可以使用非阻塞模式來避免這個問題:
<span><span><span class="hljs-variable">$server</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_socket_server</span></span><span>(</span><span><span class="hljs-string">"tcp://127.0.0.1:8080"</span></span><span>, </span><span><span class="hljs-variable">$errno</span></span><span>, </span><span><span class="hljs-variable">$errstr</span></span><span>, STREAM_SERVER_BIND | STREAM_SERVER_LISTEN);
</span><span><span class="hljs-title function_ invoke__">stream_set_blocking</span></span><span>(</span><span><span class="hljs-variable">$server</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>);
</span></span>
這樣,即使沒有連接,程序也能繼續執行。
<span><span>Warning: stream_socket_accept(): connection reset by peer in ...
</span></span>
這個錯誤通常是客戶端在連接後立即關閉了連接,或者出現了網絡故障。你可以通過以下方法解決:
捕獲連接關閉事件:在處理客戶端連接時,應該做好異常處理,並確保在連接關閉後釋放資源:
<span><span><span class="hljs-variable">$client</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_socket_accept</span></span><span>(</span><span><span class="hljs-variable">$server</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$client</span></span><span>) {
</span><span><span class="hljs-comment">// 處理連接</span></span><span>
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$client</span></span><span>); </span><span><span class="hljs-comment">// 確保關閉連接</span></span><span>
}
</span></span>
確保客戶端穩定:確認客戶端是否因為錯誤或意外原因關閉連接。你可以通過網絡抓包工具(如Wireshark)查看客戶端和服務器之間的網絡交互,排除網絡問題。
<span><span>Warning: stream_socket_recvfrom(): unable to read from socket resource in ...
</span></span>
這個錯誤通常發生在你嘗試從客戶端讀取數據時,可能是因為客戶端沒有發送數據或已經關閉連接。解決方法如下:
檢查客戶端行為:確保客戶端發送數據並且在發送數據後沒有提前關閉連接。
增加讀取超時:如果你期望客戶端遲早發送數據,可以設置讀取超時:
<span><span><span class="hljs-title function_ invoke__">stream_set_timeout</span></span><span>(</span><span><span class="hljs-variable">$client</span></span><span>, </span><span><span class="hljs-number">10</span></span><span>); </span><span><span class="hljs-comment">// 10秒超時</span></span><span>
</span></span>
<span><span>Warning: stream_socket_server(): SSL operation failed with code 1. OpenSSL Error messages:
error:1408F119:SSL routines:SSL3_GET_RECORD:decryption failed or bad record mac in ...
</span></span>
當你在stream_socket_server中啟用SSL時,可能會遇到SSL/TLS相關錯誤。常見的原因有:
證書問題:確保你提供了正確的SSL證書和私鑰文件,並且文件的路徑正確。
OpenSSL配置問題:確保你的PHP安裝包含了OpenSSL擴展,並且在PHP配置文件(php.ini)中啟用了SSL支持。
<span><span><span class="hljs-variable">$server</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_socket_server</span></span><span>(</span><span><span class="hljs-string">"ssl://127.0.0.1:443"</span></span><span>, </span><span><span class="hljs-variable">$errno</span></span><span>, </span><span><span class="hljs-variable">$errstr</span></span><span>, STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, </span><span><span class="hljs-title function_ invoke__">stream_context_create</span></span><span>([
</span><span><span class="hljs-string">'ssl'</span></span><span> => [
</span><span><span class="hljs-string">'local_cert'</span></span><span> => </span><span><span class="hljs-string">'/path/to/cert.pem'</span></span><span>,
</span><span><span class="hljs-string">'local_pk'</span></span><span> => </span><span><span class="hljs-string">'/path/to/private.key'</span></span><span>,
</span><span><span class="hljs-string">'verify_peer'</span></span><span> => </span><span><span class="hljs-literal">false</span></span><span>,
]
]));
</span></span>
另外,還可以檢查PHP的OpenSSL版本,確保它支持你需要的加密協議。