摘要:然而當(dāng)你嘗試請(qǐng)求這樣的靜態(tài)文件時(shí)卻完全沒(méi)有問(wèn)題。打開(kāi)中的命令,可以看到本地的端口的狀態(tài)為,表示該進(jìn)程在聯(lián)機(jī)處理中。與函數(shù)的原因也相同。這時(shí)需給另一個(gè)分配不同的端口,比如。因此這些人純粹是不學(xué)無(wú)術(shù)的騙子。
注意:本文為轉(zhuǎn)載,原文鏈接:Windows下PHP服務(wù)nginx不能使用file_get_contents/curl/fopen的原因!一、問(wèn)題說(shuō)明
在Windows環(huán)境下搭建了一個(gè)本地開(kāi)發(fā)服務(wù)環(huán)境,使用Nginx做服務(wù),但是在使用file_get_contents()獲取本地的鏈接時(shí)http://127.0.0.1/index.php,出現(xiàn)了這樣的錯(cuò)誤:
file_get_contents(http://127.0.0.1/index.php) [function.file-get-contents]: failed to open stream: HTTP request failed!
本地電腦php環(huán)境為:nginx+php+mysql;于是找到這篇文章做個(gè)筆記,記錄下!
這兩天一直在搞windows下nginx+fastcgi的file_get_contents請(qǐng)求。我想,很多同學(xué)都遇到當(dāng)file_get_contents請(qǐng)求外網(wǎng)的http/https的php文件時(shí)毫無(wú)壓力,比如echo file_get_contents(‘http://www.baidu.com’) ,它會(huì)顯示百度的頁(yè)面。但當(dāng)你請(qǐng)求localhost/127.0.0.1本地網(wǎng)絡(luò)的php服務(wù)時(shí)卻一直是timeout,無(wú)論你將請(qǐng)求時(shí)間和腳本運(yùn)行時(shí)間多長(zhǎng)都無(wú)法返回?cái)?shù)據(jù),如file_get_contents(‘http://localhost/phpinfo.php’) 。然而當(dāng)你嘗試請(qǐng)求html這樣的靜態(tài)文件時(shí)卻完全沒(méi)有問(wèn)題。是什么原因呢?!
首先,我們知道file_get_contents/curl/fopen打開(kāi)一個(gè)基于tcp/ip的http請(qǐng)求時(shí),請(qǐng)求數(shù)據(jù)發(fā)送到nginx,而nginx則委托給php-cgi(fastcgi)處理php文件,一般情況fastcgi處理完一個(gè)php請(qǐng)求后會(huì)馬上釋放結(jié)束信號(hào),等待下一個(gè)處理請(qǐng)求(當(dāng)然也有程序假死,一直占用資源的情況)。打開(kāi)nginx.conf,我們看到下面這一行:
location ~ .php { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME d:/www/htdocs$fastcgi_script_name; include fastcgi_params; }
上面已經(jīng)清楚地看到,所有使用php結(jié)尾的文件都經(jīng)過(guò)fastcgi處理,而在php.ini的配置文件中也有一句:
cgi.force_redirect = 1
表明,所有php程序安全地強(qiáng)制轉(zhuǎn)向交給cgi處理。
但在windows中,本地127.0.0.1:9000怎樣與php-cgi聯(lián)系的呢?!答案是增加一個(gè)php-cgi進(jìn)程,用它來(lái)監(jiān)聽(tīng)127.0.0.1:9000。通過(guò)控制器命令:
RunHiddenConsole.exe D:/www/php/php-cgi.exe -b 127.0.0.1:9000 -c C:/WINDOWS/php.ini
我們就可以在啟動(dòng)windows時(shí),開(kāi)啟一個(gè)php-cgi.exe進(jìn)程監(jiān)聽(tīng)來(lái)自127.0.0.1:9000 的請(qǐng)求。在dos命令下打開(kāi)netstat –a就可以看到本地計(jì)算機(jī)下的9000端口處于listening狀態(tài)(也就是空置,如果沒(méi)有發(fā)送任何請(qǐng)求的話(huà))。
好了,該說(shuō)說(shuō)在php中使用file_get_contents()、curl()、fopen()函數(shù)訪問(wèn)localhost時(shí)為什么不能返回結(jié)果。我們?cè)賮?lái)試驗(yàn)在index.php中加入file_get_contents(‘http://127.0.0.1/phpinfo.php’) 語(yǔ)句向phpinfo.php發(fā)送一個(gè)請(qǐng)求,這時(shí)瀏覽器中的狀態(tài)指示一直在打轉(zhuǎn),表示它一直在工作中。打開(kāi)Dos中的netstat命令,可以看到本地的9000端口的狀態(tài)為:ESTABLISHED,表示該進(jìn)程在聯(lián)機(jī)處理中。實(shí)際上,這里我們已經(jīng)同時(shí)向nginx發(fā)送了兩個(gè)基于http的php請(qǐng)求,一個(gè)是解析index.php,而另一個(gè)是phpinfo.php,這樣矛盾就出來(lái)了,因?yàn)槲覀兊膚indows系統(tǒng)只加載了一個(gè)http進(jìn)程,因此,它無(wú)法同時(shí)處理兩個(gè)php請(qǐng)求,它只能先處理第一個(gè)請(qǐng)求(index.php),而index.php卻又在等待phpinfo.php處理結(jié)果,phpinfo.php沒(méi)人幫它處理請(qǐng)求,因?yàn)樗恢痹诘却齣ndex.php釋放結(jié)束信號(hào),因此,造成了程序的阻塞狀態(tài),陷入了死循環(huán)。所以我們就看到了瀏覽器的狀態(tài)指示一直在打轉(zhuǎn)。Curl()與fopen函數(shù)的原因也相同。
二、解決方法找到了原因,我們也就有了解決辦法。
一是,向系統(tǒng)增加一個(gè)http請(qǐng)求,當(dāng)一個(gè)php-cig內(nèi)要加載另一個(gè)請(qǐng)求時(shí),它能夠分配其它http處理額外的php請(qǐng)求。這時(shí)需給另一個(gè)http sever分配不同的端口,比如8080。nginx的案例如下:
http { server { listen 80; server_name 127.0.0.1; location / { index index.php; root /web/www/htdocs; } } server { listen 8080; server_name 127.0.0.1; location / { index index.html; root /web/www/htdocs; } } include /opt/nginx/conf/vhosts/php.conf; }
這樣,端口80與8080可以分別處理不同的程序,比如:
test.php
echo file_get_contents("http://localhost:8080/phpinfo.php");
當(dāng)然,在*unix下有更多選擇,比如fork。
另外提醒下,網(wǎng)上有人說(shuō),通過(guò)去掉地址中的http://協(xié)議標(biāo)記,而使用相對(duì)地址就規(guī)避函數(shù)的檢查,實(shí)際情況是不是這樣呢?!當(dāng)在index.php中使用file_get_contents(‘phpinfo.php’); 時(shí),我們可以看到函數(shù)輸出了phpinfo.php的源代碼,相當(dāng)于file_get_contents(‘file:c:wwwphpinfo.php’); ,它實(shí)際上只是讀取你的文本內(nèi)容,因?yàn)閒ile_get_contents()函數(shù)首先是處理file協(xié)議的,而curl則直接報(bào)錯(cuò)無(wú)法解析。因此這些人純粹是不學(xué)無(wú)術(shù)的騙子。
還有人提出修改hosts文件,增加localhost www.xxx.com影射關(guān)系,函數(shù)通過(guò)www.xxx.com訪問(wèn)本地php,這其實(shí)也是不治本的偏方,因?yàn)檫@只是方便計(jì)算機(jī)的dns解析,最終www.xxx.com交給127.0.0.1,而后者交給唯一http,還是阻塞。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/29389.html
摘要:然而當(dāng)你嘗試請(qǐng)求這樣的靜態(tài)文件時(shí)卻完全沒(méi)有問(wèn)題。打開(kāi)中的命令,可以看到本地的端口的狀態(tài)為,表示該進(jìn)程在聯(lián)機(jī)處理中。與函數(shù)的原因也相同。這時(shí)需給另一個(gè)分配不同的端口,比如。因此這些人純粹是不學(xué)無(wú)術(shù)的騙子。 注意:本文為轉(zhuǎn)載,原文鏈接:Windows下PHP服務(wù)nginx不能使用file_get_contents/curl/fopen的原因! 一、問(wèn)題說(shuō)明 在Windows環(huán)境下搭建了一...
摘要:等平臺(tái)平臺(tái)由于我開(kāi)發(fā)以為主,所以就用的環(huán)境配置來(lái)學(xué)習(xí)。啟動(dòng)進(jìn)程的用戶(hù)和用戶(hù)組,進(jìn)程運(yùn)行的用戶(hù)必須要設(shè)置。模式模式,表示啟動(dòng)進(jìn)程是動(dòng)態(tài)分配的,隨著請(qǐng)求量動(dòng)態(tài)變化的。 centos等linux平臺(tái) /usr/local/php/php /usr/local/php/etc/php.ini /usr/local/php/sbin/php-fpm /usr/local/php/etc/php-...
摘要:等平臺(tái)平臺(tái)由于我開(kāi)發(fā)以為主,所以就用的環(huán)境配置來(lái)學(xué)習(xí)。啟動(dòng)進(jìn)程的用戶(hù)和用戶(hù)組,進(jìn)程運(yùn)行的用戶(hù)必須要設(shè)置。模式模式,表示啟動(dòng)進(jìn)程是動(dòng)態(tài)分配的,隨著請(qǐng)求量動(dòng)態(tài)變化的。 centos等linux平臺(tái) /usr/local/php/php /usr/local/php/etc/php.ini /usr/local/php/sbin/php-fpm /usr/local/php/etc/php-...
閱讀 2077·2023-04-25 21:11
閱讀 2966·2021-09-30 09:47
閱讀 2277·2021-09-24 09:48
閱讀 4434·2021-08-23 09:43
閱讀 899·2019-08-30 15:54
閱讀 566·2019-08-28 18:01
閱讀 1402·2019-08-27 10:55
閱讀 591·2019-08-27 10:55