2011-04-24 300 views
4

這個普遍的主題已經出現之前,here, here, here,毫無疑問在互聯網上的其他地方。在我的情況下,不像這些,掛起來源於阻塞的套接字,從來沒有得到消息,也許這就是爲什麼那裏描述的解決方案沒有爲我工作。我正在開發一個C++應用程序,它通過本地套接字連接與php腳本進行通信,當C++應用程序崩潰時,它將留下php腳本的套接字等待一個永遠不會到來的消息。我試過使用session_destroy和session_unset(在session_start之前在腳本中首先調用它們),但它們不起作用;即使退出並重新啓動瀏覽器也無濟於事。我只能停止會話,如果我刪除session_start,重新加載腳本,然後通過客戶端結束會話。我怎樣才能殺掉這個會話而不必經過那個?如何殺死一個PHP會話?

編輯:我忘記說了,我也試圖時間插座出與

socket_set_option($socket,0, SO_RCVTIMEO, array("sec"=>1, "usec"=>0)); 

但我得到了一個「非法操作」的錯誤,並沒有奏效。

編輯2:設置手動超時,在提示here之後,運行良好。一般來說,我仍然不知道如何殺死例如陷入無限循環,但是哦。

+0

好吧,現在值1我不知道,什麼問題是:) – levu 2011-04-24 16:15:19

+0

@levu它看起來像該選項甚至沒有設置。你不能爲本地套接字設置SO_RCVTIMEO嗎?我沒有看到我的語法有什麼問題。作爲協議socket_create的協議'0'。 – 2011-04-24 16:51:11

回答

1

也許你可以給套接字超時?例如socket_select有一個超時參數。

1000s的超時值可能過高,因爲Apache可能已經殺害之前的過程(見php.inimax_execution_time

+0

謝謝,那當然是明顯的解決辦法,我忘了提及我已經試過了(見編輯)。 – 2011-04-24 15:59:36

+0

那是愚蠢的 - 我想在MS中。將秒設置爲1,即使我註釋掉session_start,也是如此。 – 2011-04-24 16:17:34

3

我怎麼能殺死會話,而不必通過?

你遇到的問題不是一個將通過殺死會話來解決的問題。

掛起源於阻塞套接字,從來沒有得到一個消息

如果您使用的是默認PHP會話處理程序,這意味着PHP持有在該文件上的鎖。只要該鎖存在,其他PHP進程就無法操作會話。

您在這裏有幾個選項。

首先,考慮implementing you own session save routines,這意味着您可以完全控制會話數據是否存在任何類型的鎖定。你完全可以根本不包含任何鎖定,這將允許運行但是掛起的PHP腳本繼續以和平的幸福運行。這是最複雜的選擇。

二,您是否確定長時間運行的套接字腳本需要編寫會話數據?如果不是,您可以通過致電session_write_close提前結束會話並釋放鎖定。這將釋放鎖,儘管當套接字關閉時它不會真正結束長時間運行的腳本。

第三,查看在長時間運行的腳本中使用套接字超時。我不確定你使用什麼確切的方法來處理套接字,並且在PHP中使用它們的經驗很少,所以我不能提出具體的功能建議。

+0

爲了測試你的想法,我使用了一個不同的文件作爲本地套接字 -/tmp/sock1而不是/ tmp/sock。這個文件是新的,所以php不能鎖定它。它仍然掛起,實際上從來沒有達到過這一點 - 它掛在login.php的第一行,即session_start。 – 2011-04-24 16:08:12

+0

@Matt,鎖在* session *文件中。 'session_start'塊等待鎖釋放。 – Charles 2011-04-24 16:10:45

+0

@Charles好的,謝謝,我對php很新,因爲在這一點上可能很明顯。 :) session_write_close也不起作用,只能重啓瀏覽器。 – 2011-04-24 16:24:37