將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設定:
另外的解法: 假如系統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
沒有留言:
張貼留言