<?p">
php教程php手册解决PHP中fopen容易超时的问题

解决PHP中fopen容易超时的问题

Jun 06, 2016 pm 07:59 PM
fopenhttpphp해결하다타임아웃질문

http://www.btmao.org 为了从远程读取网页内容,我们常常用需要用PHP打开网页文件,而当网页文件很大或者网页根本不存在的时候,我们发现使用fopen的方法经常会出现超时。于是我们需要一个更加稳定的方法来解决这个问题。 我们想到使用fsockopen来帮助我们完

http://www.btmao.org

 

为了从远程读取网页内容,我们常常用需要用PHP打开网页文件,而当网页文件很大或者网页根本不存在的时候,我们发现使用fopen的方法经常会出现超时。于是我们需要一个更加稳定的方法来解决这个问题。

我们想到使用fsockopen来帮助我们完成工作。fsockopen是定下在network function下的一个函数,他使用的是socket来打开文件。

解决PHP中fopen容易超时的问题resource fsockopen ( string $hostname [, int $port [, int &$errno [, string &$errstr [, float $timeout ]]]] )

我们定义了一个类叫做http,下面是详细的代码。

解决PHP中fopen容易超时的问题php
解决PHP中fopen容易超时的问题
class http
解决PHP中fopen容易超时的问题{
解决PHP中fopen容易超时的问题    
function forge_http_packet($url, & $host, & $port, & $packet)
解决PHP中fopen容易超时的问题    {
解决PHP中fopen容易超时的问题        
// sure about the $url is start with "http://"
解决PHP中fopen容易超时的问题

解决PHP中fopen容易超时的问题        
$strpos = strpos($url, '/', 7);
解决PHP中fopen容易超时的问题        
$filename =  substr($url, $strpos, strlen($url- $strpos);
解决PHP中fopen容易超时的问题
解决PHP中fopen容易超时的问题        
$strpos2 = strpos($url, ':' , 7);
解决PHP中fopen容易超时的问题        
if ($strpos2 == false || $strpos2 > $strpos)
解决PHP中fopen容易超时的问题        {
解决PHP中fopen容易超时的问题            
$host = substr($url, 7, $strpos - 7);
解决PHP中fopen容易超时的问题            
$port = 80;
解决PHP中fopen容易超时的问题        }
解决PHP中fopen容易超时的问题        
else
解决PHP中fopen容易超时的问题        {
解决PHP中fopen容易超时的问题            
$host = substr($url, 7, $strpos2 - 7);
解决PHP中fopen容易超时的问题            
$port = intval(substr($url, $strpos2 + 1, $strpos - $strpos2 - 1));
解决PHP中fopen容易超时的问题        }
解决PHP中fopen容易超时的问题
解决PHP中fopen容易超时的问题        
$encode_filename = str_replace(' ', '%20', $filename);
解决PHP中fopen容易超时的问题
解决PHP中fopen容易超时的问题        
$packet  = "GET ".$encode_filename." HTTP/1.1 ";
解决PHP中fopen容易超时的问题        
$packet .= "Accept: */* ";
解决PHP中fopen容易超时的问题        
$packet .= "Host: ".$host."";
解决PHP中fopen容易超时的问题        
$packet .= "User-Agent: OpenWebSpider ";
解决PHP中fopen容易超时的问题    }
解决PHP中fopen容易超时的问题
解决PHP中fopen容易超时的问题    
function chunked_result($chunked_html)
解决PHP中fopen容易超时的问题    {
解决PHP中fopen容易超时的问题        
$html = "";
解决PHP中fopen容易超时的问题        
$start_pos = 0;
解决PHP中fopen容易超时的问题        
while ($start_pos  strlen($chunked_html))
解决PHP中fopen容易超时的问题        {
解决PHP中fopen容易超时的问题            
$final_pos = strpos($chunked_html, "", $start_pos);
解决PHP中fopen容易超时的问题            
$chunked_length = $this->hex2dec(substr($chunked_html, $start_pos, $final_pos - $start_pos));
解决PHP中fopen容易超时的问题            
$buf_html = substr($chunked_html, $final_pos + 2, $chunked_length);
解决PHP中fopen容易超时的问题            
$html .= $buf_html;
解决PHP中fopen容易超时的问题            
$start_pos = $final_pos + $chunked_length + 4;
解决PHP中fopen容易超时的问题        }
解决PHP中fopen容易超时的问题        
return $html;
解决PHP中fopen容易超时的问题    }
解决PHP中fopen容易超时的问题
解决PHP中fopen容易超时的问题    
function hex2dec($hexstr)
解决PHP中fopen容易超时的问题    {
解决PHP中fopen容易超时的问题        
$num = 0;
解决PHP中fopen容易超时的问题        
for ($i = 0 ; $i  strlen($hexstr) ; $i++)
解决PHP中fopen容易超时的问题        {
解决PHP中fopen容易超时的问题            
$num = $num * 16;
解决PHP中fopen容易超时的问题            
if ($hexstr[$i>= '0' && $hexstr[$i '9')
解决PHP中fopen容易超时的问题                
$num += ord($hexstr[$i]) - ord('0');
解决PHP中fopen容易超时的问题            
if ($hexstr[$i>= 'A' && $hexstr[$i 'F')
解决PHP中fopen容易超时的问题                
$num += ord($hexstr[$i]) - ord('A'+ 10;
解决PHP中fopen容易超时的问题            
if ($hexstr[$i>= 'a' && $hexstr[$i 'f')
解决PHP中fopen容易超时的问题                
$num += ord($hexstr[$i]) - ord('a'+ 10;
解决PHP中fopen容易超时的问题        }
解决PHP中fopen容易超时的问题        
return $num;
解决PHP中fopen容易超时的问题    }
解决PHP中fopen容易超时的问题
解决PHP中fopen容易超时的问题    
function read_from_url($url)
解决PHP中fopen容易超时的问题    {
解决PHP中fopen容易超时的问题        
$total_len = 0;
解决PHP中fopen容易超时的问题        
$this->forge_http_packet($url, $host, $port, $packet);
解决PHP中fopen容易超时的问题        
$handle = fsockopen($host, $port, $errno, $errstr, 5);
解决PHP中fopen容易超时的问题        
if ($handle) {
解决PHP中fopen容易超时的问题            
fwrite($handle, $packet);
解决PHP中fopen容易超时的问题
解决PHP中fopen容易超时的问题            
$result = "";
解决PHP中fopen容易超时的问题            
while (!feof($handle)) {
解决PHP中fopen容易超时的问题
解决PHP中fopen容易超时的问题                
stream_set_timeout($handle, 10);
解决PHP中fopen容易超时的问题                
$buffer = fgets($handle, 4096);        //4K per 20 sec
解决PHP中fopen容易超时的问题
                $info = stream_get_meta_data($handle);
解决PHP中fopen容易超时的问题                
if ($info['timed_out']) 
解决PHP中fopen容易超时的问题                {
解决PHP中fopen容易超时的问题                    
break;
解决PHP中fopen容易超时的问题                }
解决PHP中fopen容易超时的问题                
$total_len += strlen($buffer);
解决PHP中fopen容易超时的问题                
$result .= $buffer;
解决PHP中fopen容易超时的问题                
if ($total_len > 1000000)
解决PHP中fopen容易超时的问题                {    
// more than 2M filesize, properly not correct url for news or list
解决PHP中fopen容易超时的问题
                    return "";
解决PHP中fopen容易超时的问题                }
解决PHP中fopen容易超时的问题            }
解决PHP中fopen容易超时的问题            
fclose($handle);
解决PHP中fopen容易超时的问题
解决PHP中fopen容易超时的问题            
$pos =  strpos($result, "");
解决PHP中fopen容易超时的问题            
$header = substr($result, 0, $pos + 4);
解决PHP中fopen容易超时的问题
解决PHP中fopen容易超时的问题            
if (strncasecmp($result, "HTTP/1.0 302", 12== 0 ||
解决PHP中fopen容易超时的问题                
strncasecmp($result, "HTTP/1.1 302", 12== 0 ||
解决PHP中fopen容易超时的问题                
strncasecmp($result, "HTTP/1.0 301", 12== 0 ||
解决PHP中fopen容易超时的问题                
strncasecmp($result, "HTTP/1.1 301", 12== 0)
解决PHP中fopen容易超时的问题            {
解决PHP中fopen容易超时的问题                
$new_url_pos = strpos($result, " Location:");
解决PHP中fopen容易超时的问题                
if ($new_url_pos === falsereturn "";
解决PHP中fopen容易超时的问题                
$new_url_pos += 11;
解决PHP中fopen容易超时的问题                
$new_url_pos2 = strpos($result, "", $new_url_pos);
解决PHP中fopen容易超时的问题                
return $this->read_body_from_url(trim(substr($result, 
解决PHP中fopen容易超时的问题                    
$new_url_pos, $new_url_pos2 - $new_url_pos + 1)));
解决PHP中fopen容易超时的问题            }
解决PHP中fopen容易超时的问题            
else if (strncasecmp($result, "HTTP/1.0 4", 10== 0 ||
解决PHP中fopen容易超时的问题                 
strncasecmp($result, "HTTP/1.1 4", 10== 0 ||
解决PHP中fopen容易超时的问题                 
strncasecmp($result, "HTTP/1.0 5", 10== 0 ||
解决PHP中fopen容易超时的问题                 
strncasecmp($result, "HTTP/1.1 5", 10== 0)
解决PHP中fopen容易超时的问题            {
解决PHP中fopen容易超时的问题                
$pos2 = strpos($result, "");
解决PHP中fopen容易超时的问题                
return substr($result, 0, $pos2);
解决PHP中fopen容易超时的问题            }
解决PHP中fopen容易超时的问题
解决PHP中fopen容易超时的问题            
if (strstr($header, "Transfer-Encoding: chunked"== false
解决PHP中fopen容易超时的问题                
return strstr($result, "");
解决PHP中fopen容易超时的问题            
return $this->chunked_result(substr($result, $pos + 4, strlen($result- ($pos + 4)));
解决PHP中fopen容易超时的问题        } 
解决PHP中fopen容易超时的问题        
return "";
解决PHP中fopen容易超时的问题    }
解决PHP中fopen容易超时的问题}
解决PHP中fopen容易超时的问题
?>

只需要调用上述类中的函数read_from_url($url)便可以完成工作。

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

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 채팅 명령 및 사용 방법
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

WebStorm Mac 버전

WebStorm Mac 버전

유용한 JavaScript 개발 도구

MinGW - Windows용 미니멀리스트 GNU

MinGW - Windows용 미니멀리스트 GNU

이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

VSCode Windows 64비트 다운로드

VSCode Windows 64비트 다운로드

Microsoft에서 출시한 강력한 무료 IDE 편집기