我正在使用PHP-Websockets創建一個簡單的聊天服務器。當我運行第一次在我的服務器上創建websocket的php腳本時,我的一切都正常工作。如果腳本由於某種原因而停止運行,並且我嘗試重新運行該腳本,則會出現錯誤,指出腳本無法綁定套接字,因爲它已經存在。關閉舊的php websocket
我該如何讓腳本找到這個舊的套接字(因爲我知道它在哪個端口上運行)並關閉它,以便我可以建立新的連接?
我正在使用PHP-Websockets創建一個簡單的聊天服務器。當我運行第一次在我的服務器上創建websocket的php腳本時,我的一切都正常工作。如果腳本由於某種原因而停止運行,並且我嘗試重新運行該腳本,則會出現錯誤,指出腳本無法綁定套接字,因爲它已經存在。關閉舊的php websocket
我該如何讓腳本找到這個舊的套接字(因爲我知道它在哪個端口上運行)並關閉它,以便我可以建立新的連接?
如果您有shell訪問權限,我將使用以下命令來推斷使用該套接字(端口)的進程的PID。
netstat --tcp --listening --program
然後殺死那個過程。
kill %pid%
爲了防止這種情況發生,我會仔細檢查腳本是否正常終止並首先關閉套接字。
感謝喬恩,這將工作,但我想找出一種方法讓我的服務器處理這個功能,而無需我手動登錄。至於腳本正確結束,它確實如此。我試圖將此作爲最糟糕的情況下實現,所以我的聊天功能始終在運行。 – anonymousfox
@anonymousfox:當你手動執行該操作時,你最終會殺掉哪個進程? –
@DavidSchwartz其實我說得太快了。我認爲Jon所說的會起作用,但是當我嘗試它時,沒有列出連接到套接字的進程。當我殺死/重新啓動apache時,它對websocket沒有任何作用。我唯一能做的就是重新啓動服務器。 – anonymousfox
如果您已經連接,您可以使用該類中的'disconnect'方法斷開連接 –
您指的是什麼斷開方法?我無法在這個PHP函數頁面上找到它 - http://php.net/manual/en/ref.sockets.php – anonymousfox
你需要弄清楚如何啓用'SO_REUSEADDR'。 –