瀏覽器請求同一php文件時,後一請求會被前一請求阻塞,有什麼辦法不阻塞嗎

已邀請:

歐弟

贊同來自:


瀏覽器請求同一php文件時,後一請求會被前一請求阻塞,有什麼辦法不阻塞嗎

例如同時請求

a.php

<?php

sleep(10);

echo 'hello';

exit;


後面的請求會在10s後才開始執行。


如果同時請求a.php 和 b.php,則會同時執行。


b.php == a.php


--cut--


ljfrocky在2015-05-16 17:30:21回答到:


這個問題有兩種情況:


第一:如果開啟瞭SESSION,並且SESSION使用瞭文件保存,在上一個腳本處理完之前,SESSION文件被鎖住瞭,導致下一個腳本在獲得鎖之前處於等待的狀態。


第二:如果使用同一個瀏覽器的多個標簽頁同時訪問同一個URL,那麼瀏覽器認為這些不同的請求是同一個人,會對你的每個請求進行排隊,不做並發處理。不管Nginx還是Apache,都是在並發處理,隻不過你的瀏覽器自作主張,把你的請求阻塞瞭,看起來好像是服務器不支持並發,實則不然。使用 IE6 ~ IE8 這些比較低級的瀏覽器就不會有這種現象


題主的腳本明顯沒有用到SESSION,所以可以排除第一種情況。對於第二種情況,這是瀏覽器的設計問題,暫時也還沒找到解決辦法,如果有誰知道請告訴我一下,thanks


zonxin在2015-05-16 19:14:50回答到:


樓主說錯瞭吧,第一個請求就會阻塞10s,但不影響第二個,每個請求一個進程。

這又不是nodejs


貓之良品在2015-05-16 18:48:55回答到:


要知道瀏覽器是如何向PHP提交請求的,一般不是PHP首先處理請求,而是apache。之後apache會建立進程向PHP中轉請求,所以不會出現阻塞,除非你用的不是個正常的HTTP服務。


eechen在2015-05-17 09:51:30回答到:


PHP從5.4開始內置瞭一個用於開發測試的CLI HTTP Server:

php -S 127.0.0.1:8080 -t /www

CLI HTTP Server是一個單進程應用,同一時刻隻能處理一個請求,後面的請求要進行排隊.

如果你隻開啟瞭一個PHP-FPM/Apache Prefork MPM工作進程,情況也是如此.


sleep(10)這個長達10秒的操作由正在提供Web服務的PHP進程來處理顯然是不合適的,因為這肯定會造成一個PHP工作進程被阻塞.這時可以考慮用popen或proc_open異步調用一個CLI程序比如一個CLI下的PHP腳本進行一些耗時的操作.


比如:

/www/index.php


<?php
$sec = 10;
pclose(popen('/www/cli.php '.$sec.' &', 'r'));


/www/cli.php


#!/png/php/5.4.39NTS/bin/php
<?php
//print_r($argv);
sleep($argv[1]);
file_put_contents('/www/cli.txt', $argv[1]);


index.php並不會被10秒的操作阻塞,10秒的操作交給cli.php執行瞭,從而實現瞭異步.


李浩315在2015-05-17 15:12:13回答到:


我猜測你的問題是由於session寫鎖導致的,試試在sleep前加上session_write_close(); 看是否依然出現阻塞,可參見這篇文章:http://blog.csdn.net/haozi3156666/article/details/39502381, 是國外的某人寫的

要回復問題請先登錄註冊