當前位置: 首頁> 最新文章列表> 使用stream_socket_server常見會遇到哪些錯誤?怎麼快速解決?

使用stream_socket_server常見會遇到哪些錯誤?怎麼快速解決?

gitbox 2025-06-27

1. 錯誤:無法綁定到指定的地址

錯誤提示:

 <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命令來檢查端口是否已被其他應用佔用。

  • 選擇另一個端口:如果端口被佔用,選擇一個未被使用的端口,或者停止佔用該端口的服務。


2. 錯誤:無法創建服務器資源

錯誤提示:

 <span><span>Warning: stream_socket_server(): unable to create socket resource in ...
</span></span>

解決方法:

這個錯誤可能與系統限製或權限問題有關。常見的原因有:

  • 權限不足:在Linux系統中,綁定到1024以下的端口需要root權限。解決方法是使用更高的端口號,或以管理員權限運行腳本。

  • 系統資源限制:系統可能有限制打開的文件描述符數。你可以通過ulimit -n命令查看當前限制,並通過ulimit -n <number>來增加限制。


3. 錯誤:服務器創建成功,但無法接受連接

錯誤提示:

 <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>

    這樣,即使沒有連接,程序也能繼續執行。


4. 錯誤:socket連接被意外關閉

錯誤提示:

 <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)查看客戶端和服務器之間的網絡交互,排除網絡問題。


5. 錯誤:無法讀取客戶端數據

錯誤提示:

 <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>

6. 錯誤:SSL/TLS連接錯誤

錯誤提示:

 <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> =&gt; [
            </span><span><span class="hljs-string">'local_cert'</span></span><span> =&gt; </span><span><span class="hljs-string">'/path/to/cert.pem'</span></span><span>,
            </span><span><span class="hljs-string">'local_pk'</span></span><span> =&gt; </span><span><span class="hljs-string">'/path/to/private.key'</span></span><span>,
            </span><span><span class="hljs-string">'verify_peer'</span></span><span> =&gt; </span><span><span class="hljs-literal">false</span></span><span>,
        ]
    ]));
    </span></span>

    另外,還可以檢查PHP的OpenSSL版本,確保它支持你需要的加密協議。