Maison >développement back-end >tutoriel php >Petit cas PHP multi-thread

Petit cas PHP multi-thread

original
2017-11-10 10:36:412183parcourir

Concernant le multi-threading PHP, nous rencontrerons de nombreux problèmes. L'article suivant concerne les problèmes de petits projets avec le multi-threading PHP. En même temps, nous avons proposé trois solutions, veuillez vous y référer.

Statut du projet :

Pour synchroniser plus de 300 W de données utilisateur avec qcloud, nous ne pouvons synchroniser qu'une boucle à la fois, environ 3 synchronisations par seconde, nous avons donc synchronisé 300W . On estime que les données prennent plus de 10 jours, j'ai donc pensé à utiliser le multithread pour le résoudre.

Option 1 :

Écrivez une solution multi-processus en C++ et forkez plusieurs processus pour la résoudre. Le thread principal est responsable de la lecture/stockage des données et le sous-thread est responsable du curl.

Solution 2 :

Utilisez PHP pour écrire une solution multi-processus, identique à la solution 1. Le thread principal lit et le thread enfant s'enroule.

Cependant, comme PHP n'a pas plusieurs processus, il ne peut pas contrôler directement les threads/processus. Nous ne pouvons donc compter que sur Linux pour implémenter le multi-processus.

La fonction PHP pcntl_fork() peut créer un processus équivalent au fork Linux.

La différence avec fork est que le 0 renvoyé par pcntl_fork est le processus enfant, et l'identifiant renvoyé est le pid du processus enfant (tandis que fork renvoie 0 pour le processus parent et que le processus enfant renvoie ppid) .

Remarque La fonction pcntl_fork() doit être sous Linux. On dit que le module pcntl.so doit être chargé, mais il semble qu'il n'ait pas besoin d'être chargé.

Option 3 :

php+shell simule le multi-threading

Par exemple : le fichier test.php implémente les fonctions requises par le projet (y compris la lecture et l'écriture de la base de données et curl)

Écrivez un autre shell comme suit et enregistrez-le sous start.sh :

#!/bin/bash  //指定bash,必须for(( i=0; i<20; i++))do
    php test.php &    //执行test.php,&符号的意思是把该操作放在后台执行,这样shell就可以继续执行下一步sleep命令了。如果没有这个符号,shell会阻塞在这里。
    sleep 1s
done

Enfin, exécutez le shell, sudo ./start.sh

Le shell va démarrez 20 processus en même temps. Exécutez test.php

Cependant, comme chaque processus est équivalent au processus principal, les ressources communes sont difficiles à contrôler. Dans ce cas, la ressource commune est uniquement la base de données, je verrouille donc la base de données à chaque fois que je l'utilise. Voir les détails Un autre article de ma part. verrou mysql. Parce que comparé aux opérations de base de données, qui peuvent être résolues toutes les secondes, curl prend des dizaines de secondes ou plus pour envoyer des centaines de messages en continu, le verrouillage de la base de données a donc peu d'impact.

Résumé : Bien qu'il ne s'agisse que d'un petit cas de multi-threading PHP, j'espère que vous pourrez utiliser votre cerveau et j'espère que cet article pourra vous donner des idées pour résoudre de tels problèmes.

Recommandations associées :

java - pthreads est PHP multi-thread.

socket - utilisation du multi-threading php, multi-processus

Deux méthodes d'implémentation du multi-threading en PHP


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
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