백엔드 개발 PHP 튜토리얼 用stream_系列函数实现远程文件本地化,怎么防止卡死

用stream_系列函数实现远程文件本地化,怎么防止卡死

Jun 13, 2016 pm 01:10 PM
http quot sockets tmp

用stream_系列函数实现远程文件本地化,如何防止卡死
还是我前两天写的代码,已经用于采集内容了,今天用来改进采集到的内容中的图片等远程文件的本地化,有时候还是会卡死,高手看看如何能防止卡死。
代码如下,这个代码还是提供两种方式实现本地化进行比较,时事证明这种流方式实现效率是提高了。

PHP code
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->
<?php $dir = str_replace('\\', '/', dirname(__FILE__)) . '/';
$timeStart = microtime(true);
$data = '';
$urls = array('http://www.jxcms.com/upload/2011/0518/0337319304.jpg', 'http://www.jxcms.com/upload/2011/0310/0951568835.jpg', 'http://www.tzksgs.com/upload/banner1.jpg', 'http://www.tzksgs.com/upload/banner2.jpg');
foreach($urls as $url) {
    copy($url, $dir . 'a_' . basename($url));
}
$timeEnd = microtime(true);
echo sprintf("Spend time: %s second(s)\n", $timeEnd - $timeStart), '<br>';
$timeStart = microtime(true);
function getMoreContent($urls) {
    $timeout = 30;
    $rs = array();
    $sockets = array();
    $userAgent = $_SERVER['HTTP_USER_AGENT'];
    foreach($urls as $id => $url) {
        $tmp = parse_url($url);
        $host = $tmp['host'];
        $path = isset($tmp['path'])?$tmp['path']:'/';
        empty($tmp['query']) or $path .= '?' . $tmp['query'];
        if (empty($tmp['port'])) {
            $port = $tmp['scheme'] == 'https'?443:80;
        } else $port = $tmp['port'];
        $fp = stream_socket_client("$host:$port", $errno, $errstr, $timeout);
        if ($fp) {
            $rs[$id] = '';
            $sockets[$id] = $fp;
            fwrite($fp, "GET $path HTTP/1.1\r\nHost: $host\r\nUser-Agent: $userAgent\r\nConnection: Close\r\n\r\n");
        }
    }
    // Now, wait for the results to come back in
    while (count($sockets)) {
        $read = $sockets;
        // This is the magic function - explained below
        if (stream_select($read, $write = null, $e = null, $timeout)) {
            // readable sockets either have data for us, or are failed connection attempts
            foreach ($read as $r) {
                $id = array_search($r, $sockets);
                $data = fread($r, 8192);
                if (strlen($data) == 0) {
                    fclose($r);
                    $tmp = explode("\r\n\r\n", $rs[$id], 2);
                    $rs[$id] = strpos($tmp[0], '200')?$tmp[1]:'';
                    unset($sockets[$id]);
                } else $rs[$id] .= $data;
            }
        }
    }
    return $rs;
}
$rs = getMoreContent($urls);
foreach($rs as $k => $v) {
    @file_put_contents($dir . 'b_' . basename($urls[$k]), $v);
}
$timeEnd = microtime(true);
echo sprintf("Spend time: %s second(s)\n", $timeEnd - $timeStart);

?>

로그인 후 복사




------解决方案--------------------
由于php没有计时器,所以你不可能中断一个没有中断接口的函数的执行
所以底层函数都只适合于理想的条件下

我依然建议你使用多道的curl来完成你的工作
PHP code
$urls = array(
 'http://www.jxcms.com/upload/2011/0518/0337319304.jpg',
 'http://www.jxcms.com/upload/2011/0310/0951568835.jpg',
 'http://www.tzksgs.com/upload/banner1.jpg',
 'http://www.tzksgs.com/upload/banner2.jpg'
);
$mh = curl_multi_init();

foreach ($urls as $i => $url) {
       $conn[$i] = curl_init($url);
       curl_setopt($conn[$i], CURLOPT_RETURNTRANSFER,1);
       curl_multi_add_handle($mh, $conn[$i]);
}

do {
  curl_multi_exec($mh, $active);
  //在这个循环中,你有机会中断程序的执行。curl_getinfo提供了连接的各种信息
}while($active);

foreach ($urls as $i => $url) {
  $fn = basename($url);
  file_put_contents($fn, curl_multi_getcontent($conn[$i]));
  curl_close($conn[$i]);
} <div class="clear">
                 
              
              
        
            </div>
로그인 후 복사
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 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 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Linux 시스템의 /tmp/ 폴더 정리 원리와 tmp 파일의 역할 Linux 시스템의 /tmp/ 폴더 정리 원리와 tmp 파일의 역할 Dec 21, 2023 pm 05:36 PM

.tmp 파일의 대부분은 비정상적인 종료 또는 충돌로 인해 남겨진 파일입니다. 이러한 임시 스크래치 디스크는 컴퓨터를 다시 시작한 후에는 쓸모가 없으므로 안전하게 삭제할 수 있습니다. Windows 운영 체제를 사용하는 경우 C 드라이브의 루트 디렉터리에서 접미사 TMP가 붙은 일부 파일을 찾을 수 있으며, Windows 디렉터리에서도 TEMP 디렉터리를 찾을 수 있습니다. TMP 파일은 다양한 소프트웨어 또는 소프트웨어에 의해 생성된 임시 파일입니다. 시스템. , 정크 파일이라고도 합니다. Windows에서 생성된 임시 파일은 가상 메모리보다 더 많은 대상을 지정하고 특정 프로그램에만 서비스를 제공한다는 점을 제외하면 기본적으로 가상 메모리와 동일합니다. 그리고 그 특이성 때문에 많은 초보자들이 겁을 먹고 삭제하지 않게 되었습니다.

http 상태 코드 520은 무엇을 의미합니까? http 상태 코드 520은 무엇을 의미합니까? Oct 13, 2023 pm 03:11 PM

HTTP 상태 코드 520은 서버가 요청을 처리하는 동안 알 수 없는 오류가 발생하여 더 구체적인 정보를 제공할 수 없음을 의미합니다. 서버가 요청을 처리하는 동안 알 수 없는 오류가 발생했음을 나타내는 데 사용됩니다. 이는 서버 구성 문제, 네트워크 문제 또는 기타 알 수 없는 이유로 인해 발생할 수 있습니다. 이는 일반적으로 서버 구성 문제, 네트워크 문제, 서버 과부하 또는 코딩 오류로 인해 발생합니다. 상태 코드 520 오류가 발생하면 웹사이트 관리자나 기술 지원팀에 문의하여 자세한 정보와 지원을 받는 것이 가장 좋습니다.

http 상태 코드 403이란 무엇입니까? http 상태 코드 403이란 무엇입니까? Oct 07, 2023 pm 02:04 PM

HTTP 상태 코드 403은 서버가 클라이언트의 요청을 거부했음을 의미합니다. http 상태 코드 403에 대한 해결 방법은 다음과 같습니다. 1. 서버에 인증이 필요한 경우 올바른 자격 증명이 제공되었는지 확인합니다. 2. 서버가 IP 주소를 제한한 경우 클라이언트의 IP 주소가 제한되어 있거나 블랙리스트에 없습니다. 3. 파일 권한 설정을 확인하십시오. 403 상태 코드가 파일 또는 디렉토리의 권한 설정과 관련되어 있으면 클라이언트가 해당 파일 또는 디렉토리에 액세스할 수 있는 권한이 있는지 확인하십시오. 등.

CentOS 7에서 /tmp 디렉토리의 정크 파일에 액세스하고 정리하는 방법은 무엇입니까? CentOS 7에서 /tmp 디렉토리의 정크 파일에 액세스하고 정리하는 방법은 무엇입니까? Dec 27, 2023 pm 09:10 PM

centos7 시스템의 tmp 디렉토리에 쓰레기가 많이 있습니다. 쓰레기를 지우려면 어떻게 해야 합니까? 아래의 자세한 튜토리얼을 살펴보겠습니다. tmp 파일 디렉터리의 파일 목록을 보려면 cdtmp/ 명령을 실행하여 tmp의 현재 파일 디렉터리로 전환하고, ll 명령을 실행하여 현재 디렉터리의 파일 목록을 확인합니다. 아래 그림과 같이. 파일을 삭제하려면 rm 명령을 사용하십시오. rm 명령은 시스템에서 파일을 영구적으로 삭제하므로 rm 명령을 사용할 때는 파일을 삭제하기 전에 프롬프트를 표시하는 것이 가장 좋습니다. rm-i 파일 이름 명령을 사용하고 사용자가 삭제를 확인(y)하거나 삭제를 건너뛰기(n)할 때까지 기다리면 시스템이 해당 작업을 수행합니다. 아래 그림과 같이.

웹 페이지 리디렉션의 일반적인 애플리케이션 시나리오를 이해하고 HTTP 301 상태 코드를 이해합니다. 웹 페이지 리디렉션의 일반적인 애플리케이션 시나리오를 이해하고 HTTP 301 상태 코드를 이해합니다. Feb 18, 2024 pm 08:41 PM

HTTP 301 상태 코드의 의미 이해: 웹 페이지 리디렉션의 일반적인 응용 시나리오 인터넷의 급속한 발전으로 인해 사람들은 웹 페이지 상호 작용에 대한 요구 사항이 점점 더 높아지고 있습니다. 웹 디자인 분야에서 웹 페이지 리디렉션은 HTTP 301 상태 코드를 통해 구현되는 일반적이고 중요한 기술입니다. 이 기사에서는 HTTP 301 상태 코드의 의미와 웹 페이지 리디렉션의 일반적인 응용 프로그램 시나리오를 살펴봅니다. HTTP301 상태 코드는 영구 리디렉션(PermanentRedirect)을 나타냅니다. 서버가 클라이언트의 정보를 받을 때

HTTP 200 OK: 성공적인 응답의 의미와 목적을 이해합니다. HTTP 200 OK: 성공적인 응답의 의미와 목적을 이해합니다. Dec 26, 2023 am 10:25 AM

HTTP 상태 코드 200: 성공적인 응답의 의미와 목적 탐색 HTTP 상태 코드는 서버 응답 상태를 나타내는 데 사용되는 숫자 코드입니다. 그 중 상태 코드 200은 요청이 서버에 의해 성공적으로 처리되었음을 나타냅니다. 이 기사에서는 HTTP 상태 코드 200의 구체적인 의미와 사용법을 살펴보겠습니다. 먼저 HTTP 상태 코드의 분류를 이해해 보겠습니다. 상태 코드는 1xx, 2xx, 3xx, 4xx 및 5xx의 다섯 가지 범주로 나뉩니다. 그 중 2xx는 성공적인 응답을 나타냅니다. 그리고 200은 2xx에서 가장 일반적인 상태 코드입니다.

Nginx 프록시 관리자를 사용하여 HTTP에서 HTTPS로 자동 점프를 구현하는 방법 Nginx 프록시 관리자를 사용하여 HTTP에서 HTTPS로 자동 점프를 구현하는 방법 Sep 26, 2023 am 11:19 AM

NginxProxyManager를 사용하여 HTTP에서 HTTPS로의 자동 점프를 구현하는 방법 인터넷이 발전하면서 점점 더 많은 웹사이트가 HTTPS 프로토콜을 사용하여 데이터 전송을 암호화하여 데이터 보안과 사용자 개인 정보 보호를 향상시키기 시작했습니다. HTTPS 프로토콜에는 SSL 인증서 지원이 필요하므로 HTTPS 프로토콜 배포 시 특정 기술 지원이 필요합니다. Nginx는 강력하고 일반적으로 사용되는 HTTP 서버 및 역방향 프록시 서버이며 NginxProxy

http.PostForm 함수를 사용하여 양식 데이터와 함께 POST 요청 보내기 http.PostForm 함수를 사용하여 양식 데이터와 함께 POST 요청 보내기 Jul 25, 2023 pm 10:51 PM

http.PostForm 함수를 사용하여 양식 데이터와 함께 POST 요청을 보낼 수 있습니다. Go 언어의 http 패키지에서는 http.PostForm 함수를 사용하여 양식 데이터와 함께 POST 요청을 보낼 수 있습니다. http.PostForm 함수의 프로토타입은 다음과 같습니다: funcPostForm(urlstring,dataurl.Values)(resp*http.Response,errerror)where, u

See all articles