Heim > Artikel > Backend-Entwicklung > PHP verwendet pcntl_fork, um das Herunterladen von Bildern in mehreren Prozessen zu implementieren
Das Beispiel in diesem Artikel beschreibt, wie PHP pcntl_fork verwendet, um das Herunterladen von Bildern in mehreren Prozessen zu implementieren. Teilen Sie es als Referenz mit allen. Die spezifische Analyse lautet wie folgt:
PHP pcntl_fork – generiert einen Zweig und einen untergeordneten Prozess an der aktuellen Position des aktuellen Prozesses. Anmerkung: Sowohl der übergeordnete als auch der untergeordnete Prozess werden weiterhin ausgeführt Abwärts von der Gabelposition. Darüber hinaus ist der während der Ausführung des übergeordneten Prozesses erhaltene Gabelrückgabewert die Nummer des untergeordneten Prozesses und der untergeordnete Prozess erhält 0.
Hinweis: PHP verfügt über eine pcntl_fork-Funktion kann mehrere Prozesse implementieren, aber die Erweiterung pcntl kann nur unter Linux kompiliert werden. 1. Kompilieren Sie pcntl.so unter Ubuntu Ubuntu, also habe ich einen Ordner erstellt, das gesamte PHP-Paket heruntergeladen und den folgenden Befehl ausgeführt:
Bei einer erfolgreichen Installation wird extname.so erstellt und platziert Wenn Sie es im Verzeichnis des PHP-Plug-in-Moduls ablegen (standardmäßig in /usr/lib/php /modules/ gespeichert), müssen Sie php.ini anpassen und die Zeile extension=extname.so hinzufügen, bevor Sie dieses Plug-in-Modul verwenden können.# mkdir php # cd php # apt-get source php5 # cd php5-(WHATEVER_RELEASE)/ext/pcntl # phpize # ./configure (注一) # make # make install phpize 命令是用来准备 PHP 外挂模块的编译环境的
Beispiel:
pcntl_exec – im aktuellen Prozessraum. Um das angegebene Programm auszuführen, lautet der Code wie folgt:void pcntl_exec(string $path [,array $args [,array $envs ]])Zum Beispiel zum Herunterladen Wenn Sie mehrere Bilder gleichzeitig verwenden, lautet der Code wie folgt:
$cmds=array( array('/home/jerry/projects/www/test2.php'), array('/home/jerry/projects/www/test3.php') ); foreach($cmds as $cmd){ $pid=pcntl_fork(); if($pid==-1){ //进程创建失败 echo '创建子进程失败时返回-1'; exit(-1); } else if($pid){ //父进程会得到子进程号,所以这里是父进程执行的逻辑 pcntl_wait($status,WNOHANG); } else{ //子进程处理逻辑 sleep(5); pcntl_exec('/usr/bin/php',$cmd); exit(0); } }Ich hoffe, dass dieser Artikel für das PHP-Programmdesign aller hilfreich sein wird.
#!/usr/bin/php <?php // 需要抓取的网页地址 $url = 'http://www.php.cn'; $content = file_get_contents($url); preg_match_all('/<imgs+src="(.*?)"/', $content, $matches,PREG_SET_ORDER); echo "已发现".count($matches)."张图片n"; list($sm, $ss) = explode(" ", microtime()); foreach ($matches as $k => $val) { $pid[$k] = pcntl_fork(); if(!$pid[$k]) { download($url, $val); // 子进程要exit否则会进行递归多进程,父进程不要exit否则终止多进程 exit(0); } if ($pid[$k]) { // pcntl_waitpid($pid[$k], $status, WUNTRACED); } } echo "下载完成n"; list($em, $es) = explode(" ", microtime()); echo "用时:",($es+$em) - ($ss + $sm),"n"; /** * 抓取网页图片 * */ function download($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) { return; } 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); } /* End of file pcntl_fork.php */ ?>
Weitere verwandte Artikel darüber, wie PHP pcntl_fork verwendet, um das Herunterladen von Bildern in mehreren Prozessen zu implementieren, finden Sie auf der chinesischen PHP-Website!