>  기사  >  백엔드 개발  >  PHP는 pcntl_fork를 사용하여 image_php 팁의 다중 프로세스 다운로드를 구현합니다.

PHP는 pcntl_fork를 사용하여 image_php 팁의 다중 프로세스 다운로드를 구현합니다.

WBOY
WBOY원래의
2016-05-16 20:28:181192검색

이 기사의 예에서는 PHP가 pcntl_fork를 사용하여 다중 프로세스 이미지 다운로드를 구현하는 방법을 설명합니다. 참고할 수 있도록 모든 사람과 공유하세요. 구체적인 분석은 다음과 같습니다.

PHP pcntl_fork — 현재 프로세스의 현재 위치에 하위 프로세스인 분기를 생성합니다. 주석: 포크는 상위 프로세스와 하위 프로세스 모두 포크 위치에서 계속 실행됩니다. 상위 프로세스 실행 중에 얻은 포크 반환 값은 하위 프로세스 번호이고 하위 프로세스는 0을 얻습니다.

참고: PHP에는 다중 프로세스를 구현할 수 있는 pcntl_fork 함수가 있지만 pcntl 확장을 로드해야 하며 이 확장은 Linux에서만 컴파일할 수 있습니다.

1. 먼저 우분투에서 pcntl.so를 컴파일합니다. 우분투에서 pcntl 패키지를 찾을 수 없어 폴더를 만들고 그 안에 있는 pcntl 패키지를 찾아서 다음 명령을 실행했습니다. 코드는 다음과 같습니다.

코드 복사 코드는 다음과 같습니다.
# mkdir php
# CD PHP
# apt-get 소스 php5
# cd php5-(WHATEVER_RELEASE)/ext/pcntl
# PHP화
# ./configure (참고 1)
#만들다
# make install phpize 명령은 PHP 플러그인 모듈을 위한 컴파일 환경을 준비하는 데 사용됩니다.

성공적으로 설치되면 extname.so가 생성되어 PHP의 플러그인 모듈 디렉터리에 저장됩니다(기본값은 /usr/lib/php/modules/에 저장됨). php.ini를 조정하고 확장명=extname을 추가해야 합니다. .so. 이 플러그인 모듈은 한 줄 이후에만 사용할 수 있습니다.

예:

코드 복사 코드는 다음과 같습니다.
void pcntl_exec(string $path [,array $ args [, 배열 $envs ]])

pcntl_exec — 현재 프로세스 공간에서 지정된 프로그램을 실행합니다. 코드는 다음과 같습니다.

코드 복사 코드는 다음과 같습니다.
$cmds=array(
배열('/home/jerry/projects/www/test2.php'),
배열('/home/jerry/projects/www/test3.php')
);

foreach($cmds를 $cmd로){
$pid=pcntl_fork()
If($pid==-1){
//프로세스 생성 실패
                                        echo '하위 프로세스 생성이 실패하면 -1을 반환합니다.'; 종료(-1)
           }
          else if($pid){
//상위 프로세스는 하위 프로세스 번호를 가져오므로 상위 프로세스가 실행하는 논리는 다음과 같습니다.
pcntl_wait($status,WNOHANG)
           }
         else{
//하위 프로세스 처리 로직
               수면(5)
​​​​​​ pcntl_exec('/usr/bin/php',$cmd)
종료(0);            }
}

예를 들어 여러 이미지를 동시에 다운로드하려는 경우 코드는 다음과 같습니다.


코드 복사 코드는 다음과 같습니다.
#!/usr/bin/php
//크롤링할 웹페이지 주소
$url = 'http://www.jb51.net'
$content = file_get_contents($url)
preg_match_all('/ echo "Found".count($matches)."그림 n"

list($sm, $ss) = 폭발(" ", 마이크로타임())
foreach($k는 $k => $val과 일치)
{
$pid[$k] = pcntl_fork()
if(!$pid[$k])
{
다운로드($url, $val)
// 하위 프로세스는 종료되어야 합니다. 그렇지 않으면 재귀적 다중 처리가 수행됩니다. 상위 프로세스는 종료되어서는 안 됩니다. 그렇지 않으면 다중 프로세스가 종료됩니다.
종료(0); }

if ($pid[$k])
{
// pcntl_waitpid($pid[$k], $status, WUNTRACED)
}

}
echo "다운로드 완료";
list($em, $es) = 폭발(" ", 마이크로타임())

echo "걸린 시간:",($es $em) - ($ss $sm),"n"
/**
* 웹 이미지 가져오기
*
​*/
함수 다운로드($url, $val)
{
$pic_url = $val[1]
if (strpos($val[1], '//') !== false)
{
;
}
elseif (preg_match('@^(.*?)/@', $val[1], $inner_matches) == 0)
{
$pic_url = $url.$val[1]
}
elseif (preg_match('@[:.]@', $inner_matches[1], $tmp_matches) == 0)
{
$pic_url = $url.$val[1]
}

$pic = file_get_contents($pic_url)

if ($pic === false)
{
반품
}

preg_match('@/([^/] )$@', $pic_url, $tmp_matches)
// Assert를 사용하여 예외를 처리할 수 있습니다
$pic_file_name = $tmp_matches[1]
$f = fopen("tmp/".$pic_file_name, "wb") #
fwrite($f, $pic)
fclose($f)
}

/* pcntl_fork.php 파일 끝 */
?>

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