>  기사  >  백엔드 개발  >  PHP 서비스 nginx는 file_get_contents 솔루션을 사용할 수 없습니다.

PHP 서비스 nginx는 file_get_contents 솔루션을 사용할 수 없습니다.

不言
不言원래의
2018-09-07 14:35:413123검색

Windows 환경에서 로컬 개발 서비스 환경을 구축하고 Nginx를 서비스로 사용했는데, 로컬 링크를 얻기 위해 file_get_contents()를 사용하는 중에 오류가 발생했습니다. 이 문제에 대한 해결 방법을 소개하겠습니다.

1. 문제점 설명

Windows 환경에서 로컬 개발 서비스 환경을 구축하였고 서비스로 Nginx를 사용하여 로컬 링크를 얻어오는 경우 http://127.0.0.1/index. .php, 오류가 발생했습니다. 이러한 오류가 발생했습니다.

file_get_contents(http://127.0.0.1/index.php) [<a href=&#39;function.file-get-contents&#39;>function.file-get-contents</a>]: failed to open stream: HTTP request failed!

로컬 컴퓨터 PHP 환경은 nginx+php+mysql 이므로 이 글을 찾아서 메모해 두었습니다!

저는 지난 이틀 동안 Windows에서 nginx+fastcgi의 file_get_contents 요청 작업을 진행해 왔습니다. file_get_contents가 Baidu의 페이지를 표시하는 echo file_get_contents('http://www.baidu.com')와 같은 외부 네트워크에서 http/https php 파일을 요청할 때 많은 학생들이 부담감을 느끼지 않았다고 생각합니다. 하지만 localhost/127.0.0.1 로컬 네트워크에서 PHP 서비스를 요청하면 항상 시간 초과가 표시됩니다. 요청 시간과 스크립트 실행 시간을 아무리 오랫동안 설정해도 file_get_contents('http: //localhost/phpinfo.php'). 하지만 html과 같은 정적 파일을 요청하려고 하면 전혀 문제가 없습니다. 이유는 무엇입니까? !

먼저 file_get_contents/curl/fopen이 tcp/ip 기반으로 http 요청을 열면 요청 데이터가 nginx로 전송되고 nginx는 php-cgi(fastcgi)에 php 파일 처리를 맡긴다는 것을 알고 있습니다. fastcgi는 PHP 파일을 처리합니다. 요청 후 즉시 종료 신호가 해제되어 다음 요청이 처리될 때까지 기다립니다(물론 프로그램이 항상 멈추고 리소스를 차지하는 경우도 있습니다). 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;
}

위에서는 php로 끝나는 모든 파일이 fastcgi에 의해 처리된다는 것을 분명히 알 수 있으며 php.ini 구성 파일에도 다음 문장이 있습니다.

cgi.force_redirect = 1

는 다음을 나타냅니다. 즉, 모든 PHP 프로그램은 처리를 위해 안전하게 CGI로 리디렉션됩니다.

하지만 Windows에서 로컬 127.0.0.1:9000은 어떻게 php-cgi에 접속하나요? ! 대답은 php-cgi 프로세스를 추가하고 이를 사용하여 127.0.0.1:9000에서 수신하는 것입니다. 컨트롤러 명령:

RunHiddenConsole.exe D:/www/php/php-cgi.exe  -b 127.0.0.1:9000 -c C:/WINDOWS/php.ini

을 통해 php-cgi.exe 프로세스를 시작하여 Windows를 시작할 때 127.0.0.1:9000의 요청을 수신할 수 있습니다. dos 명령에서 netstat -a를 열면 로컬 컴퓨터 아래의 포트 9000이 수신 대기 상태(즉, 요청이 전송되지 않으면 비어 있음)에 있음을 확인할 수 있습니다.

자, 이제 PHP에서 file_get_contents(), cur(), fopen() 함수를 사용하여 localhost에 액세스할 때 결과가 반환되지 않는 이유에 대해 이야기할 차례입니다. phpinfo.php에 요청을 보내기 위해 index.php에 file_get_contents('http://127.0.0.1/phpinfo.php') 문을 추가해 보겠습니다. 이때 브라우저의 상태 표시기가 계속 회전하며 이를 나타냅니다. 직장에 있었습니다. Dos에서 netstat 명령을 열면 로컬 9000 포트의 상태가 ESTABLISHED로 표시되어 프로세스가 온라인으로 처리되고 있음을 나타냅니다. 실제로 여기서 우리는 두 개의 http 기반 PHP 요청을 동시에 nginx에 보냈습니다. 하나는 index.php를 구문 분석하는 것이고 다른 하나는 phpinfo.php이므로 Windows 시스템은 하나의 http만 로드하기 때문에 모순이 드러납니다. 따라서 두 개의 PHP 요청을 동시에 처리할 수 없습니다. 첫 번째 요청(index.php)만 먼저 처리할 수 있으며 index.php는 phpinfo.php의 처리 결과를 기다리고 있으며 아무도 도와주지 않습니다. index.php가 종료 신호를 해제할 때까지 기다려서 프로그램이 차단되고 무한 루프에 빠지기 때문입니다. 따라서 브라우저 상태 표시기가 항상 회전하는 것을 볼 수 있습니다. Curl() 함수와 fopen 함수를 사용하는 이유는 동일합니다.

2. Solution

원인을 찾으면 해결책도 있습니다.

먼저 시스템에 http 요청을 추가하세요. php-cig에 다른 요청이 로드되면 추가 PHP 요청을 처리하기 위해 다른 http를 할당할 수 있습니다. 이때 8080과 같은 다른 http 서버에 다른 포트를 할당해야 합니다. 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');

물론 *unix 아래에는 fork와 같은 더 많은 옵션이 있습니다.

참고로 인터넷에서 일부 사람들은 주소에서 http:// 프로토콜 표시를 제거하고 상대 주소를 사용하면 기능 검사를 피할 수 있다고 말했습니다. 실제로 그런가요? ! index.php에서 file_get_contents('phpinfo.php');를 사용하면 이 함수가 phpinfo.php의 소스 코드를 출력하는 것을 볼 수 있는데, 이는 file_get_contents('file:c:wwwphpinfo.php');와 동일합니다. 실제로 위의 내용은 file_get_contents() 함수가 먼저 파일 프로토콜을 처리하고 컬이 직접 오류를 보고하고 구문 분석할 수 없기 때문에 텍스트 내용을 읽습니다. 그러므로 이 사람들은 배우지 못한 거짓말쟁이들일 뿐입니다.

일부 사람들은 호스트 파일을 수정하고 localhost www.xxx.com의 매핑 관계를 추가하여 해당 기능이 www.xxx.com을 통해 로컬 PHP에 액세스하도록 제안했습니다. 이는 실제로 루트를 치료하지 않는 치료법입니다. 원인은 컴퓨터의 DNS 확인에만 편리하고 결국 www.xxx.com은 127.0.0.1로 넘겨지고 후자는 여전히 차단된 유일한 http로 넘겨지기 때문입니다.

관련 권장 사항:

file_get_contents 함수를 사용할 수 없는 문제에 대한 해결 방법

Nginx 서버를 PHP와 연결하고 Nginx 로그를 구문 분석하는 방법

위 내용은 PHP 서비스 nginx는 file_get_contents 솔루션을 사용할 수 없습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.