Maison développement back-end tutoriel php PHP utilise pcntl_fork pour implémenter le téléchargement d'images multi-processus

PHP utilise pcntl_fork pour implémenter le téléchargement d'images multi-processus

Dec 22, 2016 pm 04:09 PM
pcntl_fork

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 :

1

2

3

4

5

6

7

8

# mkdir php

# cd php

# apt-get source php5

# cd php5-(WHATEVER_RELEASE)/ext/pcntl

# phpize

# ./configure (注一)

# make

# make install phpize 命令是用来准备 PHP 外挂模块的编译环境的

Copier après la connexion

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 :

1

void pcntl_exec(string $path [,array $args [,array $envs ]])

Copier après la connexion

pcntl_exec — dans l'espace de processus actuel Exécutez le programme spécifié, le code est le suivant :

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

$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);

        }

}

Copier après la connexion

Exemple, l'exemple est. pour télécharger plusieurs images simultanément, le code est le suivant :

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

#!/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 */

?>

Copier après la connexion

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 !

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Article chaud

Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD
Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Article chaud

Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD
Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Tags d'article chaud

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

11 meilleurs scripts de raccourcissement d'URL PHP (gratuit et premium) 11 meilleurs scripts de raccourcissement d'URL PHP (gratuit et premium) Mar 03, 2025 am 10:49 AM

11 meilleurs scripts de raccourcissement d'URL PHP (gratuit et premium)

Travailler avec les données de session Flash dans Laravel Travailler avec les données de session Flash dans Laravel Mar 12, 2025 pm 05:08 PM

Travailler avec les données de session Flash dans Laravel

Introduction à l'API Instagram Introduction à l'API Instagram Mar 02, 2025 am 09:32 AM

Introduction à l'API Instagram

Misque de réponse HTTP simplifié dans les tests Laravel Misque de réponse HTTP simplifié dans les tests Laravel Mar 12, 2025 pm 05:09 PM

Misque de réponse HTTP simplifié dans les tests Laravel

Construisez une application React avec un Laravel Back End: Partie 2, React Construisez une application React avec un Laravel Back End: Partie 2, React Mar 04, 2025 am 09:33 AM

Construisez une application React avec un Laravel Back End: Partie 2, React

Curl dans PHP: Comment utiliser l'extension PHP Curl dans les API REST Curl dans PHP: Comment utiliser l'extension PHP Curl dans les API REST Mar 14, 2025 am 11:42 AM

Curl dans PHP: Comment utiliser l'extension PHP Curl dans les API REST

12 meilleurs scripts de chat PHP sur Codecanyon 12 meilleurs scripts de chat PHP sur Codecanyon Mar 13, 2025 pm 12:08 PM

12 meilleurs scripts de chat PHP sur Codecanyon

Notifications à Laravel Notifications à Laravel Mar 04, 2025 am 09:22 AM

Notifications à Laravel

See all articles