L'exemple de cet article décrit comment PHP utilise pcntl_fork pour implémenter le téléchargement multi-processus d'images. Partagez-le avec tout le monde pour votre référence. L'analyse spécifique est la suivante :
PHP pcntl_fork - génère une branche et un processus enfant à la position actuelle du processus actuel. Annotation : fork crée un processus enfant. Le processus parent et le processus enfant continuent de s'exécuter. vers le bas à partir de la position du fork. De plus, lors de l'exécution du processus parent, la valeur de retour du fork obtenue est le numéro du processus enfant, et le processus enfant obtient 0.
Remarque : PHP a une fonction pcntl_fork qui peut implémenter plusieurs processus, mais l'extension pcntl doit être chargée, et cette extension ne peut être compilée que sous Linux
1. Compilez d'abord pcntl.so sous Ubuntu. ubuntu, j'ai donc créé un dossier et téléchargé l'intégralité du package PHP. J'ai trouvé le package pcntl et exécuté la commande suivante :
# mkdir php # cd php # apt-get source php5 # cd php5-(WHATEVER_RELEASE)/ext/pcntl # phpize # ./configure (注一) # make # make install phpize 命令是用来准备 PHP 外挂模块的编译环境的
Une installation réussie créera extname.so et placera. dans le répertoire du module de plug-in PHP (la valeur par défaut est stockée dans /usr/lib/php /modules/), vous devez ajuster php.ini et ajouter la ligne extension=extname.so avant de pouvoir utiliser ce module de plug-in .
Exemple :
void pcntl_exec(string $path [,array $args [,array $envs ]])
pcntl_exec — dans l'espace de processus actuel Exécutez le programme spécifié, le code est le suivant :
$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); } }
Exemple, l'exemple est. pour télécharger plusieurs images simultanément, le code est le suivant :
#!/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 */ ?>
J'espère que cet article sera utile à la conception de programmes PHP de chacun.
Pour plus d'articles sur la façon dont PHP utilise pcntl_fork pour implémenter le téléchargement d'images multi-processus, veuillez prêter attention au site Web chinois de PHP !