2014年10月9日 星期四

long polling時,網頁開完後重新整理不出來

在使用 https://github.com/panique/php-long-polling 實做long polling遇到的狀況:
將client/index.html 複製成 client.php並開啟
http://your_domain.com/php-long-polling/client/client.php (注意:client/client.js 的 ajax網址要設成你的domain或 /php-long-polling/server/server.php )
第一次client.php開得出來,但按ctrl+r重新整理頁面後,網頁會轉不出來 ( client/index.html 不會有此問題 )

Blue解法:
通常這樣狀況 表示 你程式 找不到資料 又沒有寫 timeout 變成連線卡住,從前端處理,固定時間取消掉ajax request後重送 ( 不採用 )

但放到我朋友的主機上面卻沒這問題,比較兩個頁面的http標頭發現有以下的差異:
Cookie PHPSESSID=rc65gi80fdvpgoakur3quj04l3

差異:
發現我主機的php.ini設定:
session.auto_start = 1 => 要把他改成零 session.auto_start = 0,重啟apache就可以重刷了

另外的解法: 假如系統php.ini不能更動,且session.auto_start = 1時,把php.ini的值設到.htaccess
http://davidwalsh.name/php-values-htaccess
編輯網站根目錄的.htaccess,加入這行:
php_value  session.auto_start  0
#格式是:  php_value setting_name setting_value

原因:
http://stackoverflow.com/questions/13213396/no-reply-when-using-flush-session-cookies-and-long-execution-time
大意是說是說 因為第一個session還開著(開300秒),因為不確定之後session的變數會不會改變,所以要等第一個結束才能叫第二個,使用session_write_close()後之後session的變數就會變的可以存取。通常使用session_write_close()在長時間執行的script上。
所以在long polling 的server.php那邊要加 session_write_close()  就可以了.

另外:
使用session_commit() 也可以
http://blog.chacuo.net/168.html

檢查:
root@localhost:/var/lib/php5# ls
modules                          sess_tbdko1s1d8l8anhsjfurnq7ob4 sess_es3qrrebadlckj80gsjnv5hh27  sess_tbdko1s1d8l8anhsjfurnq7ob4
sess_14qeiqp5n44ba5nvdr4jdrfcp4
root@localhost:/var/lib/php5# lsof sess_tbdko1s1d8l8anhsjfurnq7ob4
COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF  NODE NAME
apache2 30364 www-data   16uW  REG  202,0        0 43458 sess_tbdko1s1d8l8anhsjfurnq7ob4
apache2 30367 www-data   16u   REG  202,0        0 43458 sess_tbdko1s1d8l8anhsjfurnq7ob4
apache2 30368 www-data   16u   REG  202,0        0 43458 sess_tbdko1s1d8l8anhsjfurnq7ob4
apache2 30375 www-data   16u   REG  202,0        0 43458 sess_tbdko1s1d8l8anhsjfurnq7ob4
apache2 30377 www-data   16u   REG  202,0        0 43458 sess_tbdko1s1d8l8anhsjfurnq7ob4
apache2 30378 www-data   16u   REG  202,0        0 43458 sess_tbdko1s1d8l8anhsjfurnq7ob4
apache2 30382 www-data   16u   REG  202,0        0 43458 sess_tbdko1s1d8l8anhsjfurnq7ob4
測試後 跟推測一樣,每執行一次就被卡住一次process

沒有留言:

張貼留言