2012-04-12 212 views
0

我寫的php腳本通過unix本地套接字與服務器通信。 1)連接 2)socket_write()(90%的時間低大小的塊,10%的大尺寸) 3發送MSG)得到的答案 4)緊密連接php socket_write通過阻塞和非阻塞套接字

現在,我有簡單的socket_write( )實現像comments from php manual「jean at briskula dot si 03-Feb-2011 03:00」

似乎它的工作正常阻塞模式,但我想實現socket_write的超時,因此我認爲(需要)使用非阻塞模式,當調用socket_write()時。

阻塞模式優於非阻塞嗎? 是否有理由實現超時? 如何正確實現它們? 任何示例?

試圖寫一個while循環,但得到=== FALSE,可能需要socket_select()每次在socket_write()調用之前?

ps。當從服務器讀取答案時,這個問題同樣適用於socket_read()

回答

1

對於通過套接字向後端系統發送數據/接收來自後端系統的數據的PHP(面向網絡)腳本,而沒有其他處理的機會(這是基本上爲什麼你想首先使用非阻塞模式),處理非阻塞模式導致的複雜性是沒有意義的。

所以,堅持阻塞模式。

+0

謝謝,但我能做些什麼,可以發生的情況下,因爲某些原因請求將長(無限),這將阻止c + +服務器的線程?我覺得某處需要添加超時...也許在C++端,但是如何? SO_LINGER? – abrahab 2012-04-12 11:18:29

+1

如果你擔心的是C++端,那麼使用非阻塞套接字來查詢數據,實現某種形式的超時。這個答案只是指等式的面向PHP的一面。爲了正確使用非阻塞I/O,請查看http://stackoverflow.com/questions/6715736/using-select-for-non-blocking-sockets。 – modelnine 2012-04-12 13:32:16

+0

感謝,仍然保持現狀,因爲解決方案與選擇()是不好的,需要重寫所有線程邏輯在現有的程序。也許在該功能將被讀取一些關於整個套接字超時。在我看來,SO_LINGER對此負責。並凍結線程recv或發送永遠不會永遠阻止。 – abrahab 2012-04-12 18:41:06