file_get_contents阻塞問題,windows nginx使用fopen、curl訪問php文件造成阻塞的解決辦法

 

拿ceshi.php文件舉例。

file_get_content('http://localhost/index.php')

獲取本地的index.php文件中的內容時,這是作爲訪問一個url處理的,而index.php是一個動態頁面,這個時候就會產生一個問題,原本我們訪問ceshi.php文件時,就是作爲一個php文件處理,這個時候http服務器nginx通過fast-cgi協議將ceshi.php分配給一個php-cgi程序進行處理,一般情況下這個php-cgi解析完ceshi.php的數據後返回數據。

 

但是由於file_get_contents獲取的是一個通過http協議取得的動態文件index.php,這等於是我們給nginx發送了兩個http請求,但是windows系統只加載了一個http進程,因此只能先處理第一個,也就是ceshi.php的請求,但是ceshi.php的file_get_contents一直在等待index.php的請求結果,但是這個請求沒有http進程處理,所以一直等待,因此造成了阻塞,如果還不太明白看看下面。
 

下面是nginx的配置文件的一段,這裏所有來自php的文件都由fast-cgi來處理:
 

location ~ \.php(.*)$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            fastcgi_param  PATH_INFO  $fastcgi_path_info;
            fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;
            include        fastcgi_params;
        }

windows中是開啓一個php-cgi對來自127.0.0.1:9000的連接請求進行監聽,一旦接收到9000端口的連接請求就進行處理,所以在本地服務器收到80端口的瀏覽器請求後,如果是靜態頁會直接返回靜態頁數據,如果是動態頁,會發送連接請求給9000端口,然後php-cgi進行處理,這裏的問題是瀏覽器同時發送了兩個動態請求,但9000端口的php-cgi它只能處理一個請求,而這個請求等待另一個請求的結果導致阻塞。
 

這也就是爲什麼同樣是file_get_contents("http://www.baidu.com")和file_get_contents("http://localhost/index.html")會正常獲取到頁面的原因,因爲http://www.baidu.com和http://localhost/index.html獲取到的頁面是靜態的,無須9000端口的php-cgi進行處理,因此不會出現阻塞的情況。

 

解決方案:看到上面對阻塞問題的解析,解決方案就簡單了,既然是因爲9000端口的php-cgi只能處理一個請求,那麼我們就開啓另一個php-cgi監聽的端口來處理這個問題,但這還有一個問題,第二個請求我們怎麼保證是由我們新開啓的php-cgi監聽端口來處理呢,這裏的辦法是我們還要開啓另外一個端口來處理第二個http請求,所以我們需要開啓一個後新的http服務,在新的http服務裏指定fastcgi的端口爲之前我們新開啓的監聽端口,這樣該http請求的動態頁面就會分配給這個php-cgi的監聽端口來處理。

 

首先打開nginx的配置文件,複製server{...}的內容,一定記得全部複製,將監聽的端口改爲8080,這就是我們新開啓的http服務端口,將裏面的fastcgi_pass的端口9000改爲9001,也就是說接受到8080端口的動態頁面請求,會將該連接自動分配給9001端口,這個時候監聽9001端口的php-cgi就是自動處理這個動態頁了。

開啓cmd,開啓一個php-cgi來監聽9001端口,記得在php-cgi.exe以及php.ini前加上它們所在的路徑,或者像我的圖裏的一樣,進入它們所在的文件夾裏再進行操作。

最後嘗試之後,就可以打開需要file_get_contents的內容了

【備註】:

注意事項:1.file_get_contents需要加端口;如(http://hkw.com:8081/app_dev.php/commoncourse/qrcode?id=85);

                  2.使用cmd打開的php-cgi窗口不能關閉,需要一直運行。

【其他解決辦法】:

                 1:換電腦,換成mac,因爲蘋果支持多進程。

                 2:換成Apache,因爲Apache讀取方式是靜態文件形式。 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章