fsockopen은 지원되지 않지만culr 환경에서 ucenter와modoer 통신 문제 지원

4406 단어
그래서 인코딩 문제나 파일 권한 문제, 함수가 지원하지 않는지 의심하고, 검색을 통해 원래 인터넷이었던 L1 호스트가 fsockopen을 지원하지 않는 것으로 밝혀졌습니다. 파일ucclient/client.php의ucfopen에 문제가 발생했습니다. 여기 코드는 다음과 같습니다.
 
  
function uc_fopen($url, $limit = 0, $post = '', $cookie = '', $bysocket = FALSE, $ip = '', $timeout = 15, $block = TRUE) {
$return = '';
$matches = parse_url($url);
!isset($matches['host']) && $matches['host'] = '';
!isset($matches['path']) && $matches['path'] = '';
!isset($matches['query']) && $matches['query'] = '';
!isset($matches['port']) && $matches['port'] = '';
$host = $matches['host'];
$path = $matches['path'] ? $matches['path'].($matches['query'] ? '?'.$matches['query'] : '') : '/';
$port = !empty($matches['port']) ? $matches['port'] : 80;
if($post) {
$out = "POST $path HTTP/1.0\r
";
$out .= "Accept: */*\r
";
//$out .= "Referer: $boardurl\r
";
$out .= "Accept-Language: zh-cn\r
";
$out .= "Content-Type: application/x-www-form-urlencoded\r
";
$out .= "User-Agent: $_SERVER[HTTP_USER_AGENT]\r
";
$out .= "Host: $host\r
";
$out .= 'Content-Length: '.strlen($post)."\r
";
$out .= "Connection: Close\r
";
$out .= "Cache-Control: no-cache\r
";
$out .= "Cookie: $cookie\r
\r
";
$out .= $post;
} else {
$out = "GET $path HTTP/1.0\r
";
$out .= "Accept: */*\r
";
//$out .= "Referer: $boardurl\r
";
$out .= "Accept-Language: zh-cn\r
";
$out .= "User-Agent: $_SERVER[HTTP_USER_AGENT]\r
";
$out .= "Host: $host\r
";
$out .= "Connection: Close\r
";
$out .= "Cookie: $cookie\r
\r
";
}
$fp = @fsockopen(($ip ? $ip : $host), $port, $errno, $errstr, $timeout);
if(!$fp) {
return '';//note $errstr : $errno \r

} else {
stream_set_blocking($fp, $block);
stream_set_timeout($fp, $timeout);
@fwrite($fp, $out);
$status = stream_get_meta_data($fp);
if(!$status['timed_out']) {
while (!feof($fp)) {
if(($header = @fgets($fp)) && ($header == "\r
" || $header == "
")) {
break;
}
}
$stop = false;
while(!feof($fp) && !$stop) {
$data = fread($fp, ($limit == 0 || $limit > 8192 ? 8192 : $limit));
$return .= $data;
if($limit) {
$limit -= strlen($data);
$stop = $limit <= 0;
}
}
}
@fclose($fp);
return $return;
}
}

fsockopen 함수는 사용할 수 없습니다. 다른 방법으로만 사용할 수 있기 때문에 다행히curl,fileget_contents도 지원, 고려 후curl로 하자,uc 수정fopen 함수는 다음과 같다.
 
  
function uc_fopen($url, $limit = 0, $post = '', $cookie = '', $bysocket = FALSE, $ip = '', $timeout = 15, $block = TRUE) {
$return = '';
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
if($post) {
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
}
if($cookie) {
curl_setopt($curl, CURLOPT_COOKIE, $cookie);
}
curl_setopt($curl, CURLOPT_TIMEOUT, $timeout);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$return = curl_exec($curl);
if (curl_errno($curl)) {
echo '
  :
'.curl_error($curl);
}
curl_close($curl);
return $return;
}

그래서modoer의ucclient/client.php와 uchome의uccilent/client.php, 이렇게 uc 수정open 함수, 허허, 처음으로curl을 사용했는데 인터넷에 자료가 많아서 방해가 되지 않았어요. 그런데 이 수정이 다른 것에 영향을 미칠지 모르겠어요. 아직 테스트가 필요해요...

좋은 웹페이지 즐겨찾기