PHP에서 FSOCOPEN은 특히 프록시 서버에 연결할 때 소켓 연결을 생성하는 데 종종 사용되는 네트워크 연결을 열기위한 기능입니다. FSOCOPEN 및 디버깅의 적절한 구성은 원활한 네트워크 요청을 보장하는 핵심입니다. 이 기사는 FSOCOPEN Connection 프록시 서버를 올바르게 구성하는 방법을 소개하고 연결 문제를 더 잘 찾아서 해결하는 데 도움이되는 디버깅 팁을 제공합니다.
FSOCCKOPEN 은 네트워크 연결을 열고 HTTP, HTTP 및 기타 프로토콜을 통해 서버와의 통신을 지원합니다. 기본 구문은 다음과 같습니다.
<span><span><span class="hljs-title function_ invoke__">fsockopen</span></span><span>(</span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$hostname</span></span><span>, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$port</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-keyword">int</span></span><span> &</span><span><span class="hljs-variable">$errno</span></span><span> = </span><span><span class="hljs-literal">null</span></span><span>, </span><span><span class="hljs-keyword">string</span></span><span> &</span><span><span class="hljs-variable">$errstr</span></span><span> = </span><span><span class="hljs-literal">null</span></span><span>, </span><span><span class="hljs-keyword">float</span></span><span> </span><span><span class="hljs-variable">$timeout</span></span><span> = </span><span><span class="hljs-title function_ invoke__">ini_get</span></span><span>(</span><span><span class="hljs-string">"default_socket_timeout"</span></span><span>))
</span></span>$ hostname : 대상 호스트의 주소 또는 프록시 서버의 주소.
$ 포트 : 대상 서버의 포트 번호, 기본 HTTP는 80이고 기본 HTTP는 443입니다.
$ errno : 연결 오류에 대한 오류 코드.
$ errstr : 오류 메시지.
$ 타임 아웃 : 연결 시간 초과, 단위 초.
프록시 서버를 통해 대상 호스트에 연결하려면 먼저 프록시 서버의 IP 주소 및 포트를 통해 연결을 설정해야합니다. 일반적으로 프록시 서버는 특정 인증 정보 (예 : 사용자 이름 및 비밀번호)를 제공해야하므로 프록시 설정의 정확성을 보장해야합니다.
다음은 프록시 서버를 통해 원격 호스트에 연결하는 방법을 보여주는 간단한 예입니다.
<span><span><span class="hljs-variable">$proxy</span></span><span> = </span><span><span class="hljs-string">'proxy.example.com'</span></span><span>; </span><span><span class="hljs-comment">// 프록시 서버 주소</span></span><span>
</span><span><span class="hljs-variable">$proxy_port</span></span><span> = </span><span><span class="hljs-number">8080</span></span><span>; </span><span><span class="hljs-comment">// 프록시 포트</span></span><span>
</span><span><span class="hljs-variable">$target</span></span><span> = </span><span><span class="hljs-string">'example.com'</span></span><span>; </span><span><span class="hljs-comment">// 대상 호스트</span></span><span>
</span><span><span class="hljs-variable">$target_port</span></span><span> = </span><span><span class="hljs-number">80</span></span><span>; </span><span><span class="hljs-comment">// 대상 포트</span></span><span>
</span><span><span class="hljs-comment">// 프록시 서버에 연결하십시오</span></span><span>
</span><span><span class="hljs-variable">$proxy_socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fsockopen</span></span><span>(</span><span><span class="hljs-variable">$proxy</span></span><span>, </span><span><span class="hljs-variable">$proxy_port</span></span><span>, </span><span><span class="hljs-variable">$errno</span></span><span>, </span><span><span class="hljs-variable">$errstr</span></span><span>, </span><span><span class="hljs-number">30</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$proxy_socket</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"无法프록시 서버에 연결하십시오: <span class="hljs-subst">$errstr</span></span></span><span> (</span><span><span class="hljs-subst">$errno</span></span><span>)\n";
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-comment">// 프록시 요청을 보내십시오</span></span><span>
</span><span><span class="hljs-variable">$request</span></span><span> = </span><span><span class="hljs-string">"GET http://<span class="hljs-subst">$target</span></span></span><span>/ HTTP/1.1\r\n";
</span><span><span class="hljs-variable">$request</span></span><span> .= </span><span><span class="hljs-string">"Host: <span class="hljs-subst">$target</span></span></span><span>\r\n";
</span><span><span class="hljs-variable">$request</span></span><span> .= </span><span><span class="hljs-string">"Connection: Close\r\n"</span></span><span>;
</span><span><span class="hljs-variable">$request</span></span><span> .= </span><span><span class="hljs-string">"\r\n"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">fwrite</span></span><span>(</span><span><span class="hljs-variable">$proxy_socket</span></span><span>, </span><span><span class="hljs-variable">$request</span></span><span>);
</span><span><span class="hljs-comment">// 프록시 서버 응답을 얻으십시오</span></span><span>
</span><span><span class="hljs-keyword">while</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">feof</span></span><span>(</span><span><span class="hljs-variable">$proxy_socket</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">fgets</span></span><span>(</span><span><span class="hljs-variable">$proxy_socket</span></span><span>, </span><span><span class="hljs-number">128</span></span><span>);
}
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$proxy_socket</span></span><span>);
}
</span></span>프록시 서버에 인증이 필요한 경우 요청을 보낼 때 해당 인증 정보를 제공해야합니다. 일반적으로 프록시 인증은 기본 인증 또는 기타 인증 메커니즘을 사용합니다.
인증 헤더를 사용하여 기본 인증을 달성 할 수 있습니다.
<span><span><span class="hljs-variable">$username</span></span><span> = </span><span><span class="hljs-string">'my_username'</span></span><span>;
</span><span><span class="hljs-variable">$password</span></span><span> = </span><span><span class="hljs-string">'my_password'</span></span><span>;
</span><span><span class="hljs-comment">// 사용자 이름과 비밀번호를 만듭니다 Base64 코딩</span></span><span>
</span><span><span class="hljs-variable">$auth</span></span><span> = </span><span><span class="hljs-title function_ invoke__">base64_encode</span></span><span>(</span><span><span class="hljs-string">"<span class="hljs-subst">$username</span></span></span><span>:</span><span><span class="hljs-subst">$password</span></span><span>");
</span><span><span class="hljs-variable">$request</span></span><span> = </span><span><span class="hljs-string">"GET http://<span class="hljs-subst">$target</span></span></span><span>/ HTTP/1.1\r\n";
</span><span><span class="hljs-variable">$request</span></span><span> .= </span><span><span class="hljs-string">"Host: <span class="hljs-subst">$target</span></span></span><span>\r\n";
</span><span><span class="hljs-variable">$request</span></span><span> .= </span><span><span class="hljs-string">"Connection: Close\r\n"</span></span><span>;
</span><span><span class="hljs-variable">$request</span></span><span> .= </span><span><span class="hljs-string">"Proxy-Authorization: Basic <span class="hljs-subst">$auth</span></span></span><span>\r\n";
</span><span><span class="hljs-variable">$request</span></span><span> .= </span><span><span class="hljs-string">"\r\n"</span></span><span>;
</span><span><span class="hljs-comment">// 요청을 보내십시오</span></span><span>
</span><span><span class="hljs-title function_ invoke__">fwrite</span></span><span>(</span><span><span class="hljs-variable">$proxy_socket</span></span><span>, </span><span><span class="hljs-variable">$request</span></span><span>);
</span></span>프록시 서버 연결 <br>을 확인하십시오 프록시 서버에 연결할 수없는 상황이 발생하면 먼저 프록시 서버에 도달 할 수 있는지 확인하십시오. Ping 또는 Telnet 과 같은 명령 줄 도구를 사용하여 연결이 정상인지 테스트 할 수 있습니다. 예를 들어:
<span><span>ping proxy.example.com
telnet proxy.example.com 8080
</span></span>인쇄 디버깅 정보 <br> PHP에서는 var_dump 또는 echo를 사용하여 요청 및 응답의 내용을 인쇄하여 프록시 요청이 정상적으로 전송되는지 디버깅하는 데 도움이 될 수 있습니다. 예기치 않은 오류 메시지 또는 응답 내용을 확인할 수도 있습니다.
<span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"요청 된 요청:\n"</span></span><span> . </span><span><span class="hljs-variable">$request</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"응답 내용:\n"</span></span><span>;
</span></span>합리적인 시간 초과 <br>을 설정하십시오 연결 시간이 너무 길면 시간 초과 시간이 적절하게 증가하거나 감소 할 수 있습니다. 지나치게 긴 시간군으로 인해 요청이 고정 될 수 있지만 지나치게 짧은 시간 초과로 인해 네트워크 지연으로 인해 연결이 실패 할 수 있습니다.
<span><span><span class="hljs-variable">$timeout</span></span><span> = </span><span><span class="hljs-number">10</span></span><span>; </span><span><span class="hljs-comment">// 연결 시간 초과를 설정하십시오 10 두번째</span></span><span>
</span></span>프록시 서버 로그 <br>을 확인하십시오 PHP 코드에서 직접 문제를 찾을 수없는 경우 프록시 서버의 로그 파일을 확인하는 것이 좋은 방법입니다. 프록시 서버는 일반적으로 연결이 성공했는지 여부, 인증이 필요한지 등을 포함하여 요청 세부 사항을 기록합니다.
fsocckopen 대신 stream_socket_client를 사용하십시오
연결 및 데이터 흐름을보다 유연하게 처리하려면 FSOCCKOPEN 대신 Stream_Socket_Client 를 사용하여 더 풍부한 매개 변수 설정을 지원하고 복잡한 네트워크 요청을 더 잘 처리 할 수 있습니다.
예:
<span><span><span class="hljs-variable">$context</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_context_create</span></span><span>([
</span><span><span class="hljs-string">'http'</span></span><span> => [
</span><span><span class="hljs-string">'proxy'</span></span><span> => </span><span><span class="hljs-string">'tcp://proxy.example.com:8080'</span></span><span>,
</span><span><span class="hljs-string">'request_fulluri'</span></span><span> => </span><span><span class="hljs-literal">true</span></span><span>,
]
]);
</span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'http://example.com'</span></span><span>, </span><span><span class="hljs-string">'r'</span></span><span>, </span><span><span class="hljs-literal">false</span></span><span>, </span><span><span class="hljs-variable">$context</span></span><span>);
</span></span>프록시 연결 시간 초과 <br> 연결 시간 초과는 일반적으로 네트워크 조건 또는 프록시 서버 구성과 관련이 있습니다. 이 문제는 타임 아웃을 늘리거나 다른 프록시 서버를 교체하여 해결할 수 있습니다.
에이전트 인증 실패 <br> 인증 정보가 올바른지 확인하십시오. 특히 Base64 사용자 이름과 비밀번호의 인코딩. 다른 유형의 인증 (예 : NTLM 또는 Digest)을 사용하는 경우 추가 지원 라이브러리 또는 더 복잡한 접근 방식이 필요합니다.
응답 내용이 비어 있거나 형식이 잘못되었습니다 <br> 이 상황은 프록시 서버가 요청을 올바르게 전달하지 않거나 프록시를 통해 대상 서버에 액세스 할 수 없기 때문일 수 있습니다. 프록시 서버의 디버그 로그를 사용하거나 Postman과 같은 다른 네트워크 도구를 사용하여 프록시 서버의 동작을 확인할 수 있습니다.