Maison  >  Article  >  développement back-end  >  Le rendement du générateur PHP gère de grandes quantités de données (exemple de code)

Le rendement du générateur PHP gère de grandes quantités de données (exemple de code)

藏色散人
藏色散人avant
2020-01-25 13:54:175515parcourir

Le rendement du générateur PHP gère de grandes quantités de données (exemple de code)

Explication officielleyield

yield生成器 parue après php5.5, le document officiel explique ceci : yield fournit un moyen plus simple d'implémenter des objets d'itération simples. Par rapport à la définition d'une classe pour implémenter l'interface Iterator , la surcharge de performances et la complexité sont considérablement réduites.

Le cœur d'un générateur est un mot-clé yield. Une fonction génératrice ressemble à une fonction ordinaire. La différence est la suivante : une fonction ordinaire renvoie une valeur, tandis qu'un générateur peut yield générer plusieurs valeurs. exige. Lorsque la fonction génératrice est appelée, elle renvoie un objet qui peut être itéré.

yield est similaire à return, mais la différence est que return renverra une valeur et terminera l'exécution du code, tandis que yield renverra une valeur au code qui boucle et appelle ce générateur et suspend simplement l'exécution de la fonction générateur.

Au fait, j'aimerais vous présenter la version PHP de la requête non tamponnée

qui consiste à lire les données ligne par ligne dans la mémoire d'exécution de PHP. Il ne s'agit pas d'une lecture unique dans la mémoire d'exécution de PHP. Comme nous le savons tous, PHP possède de nombreuses fonctions intégrées qui peuvent nous aider à traiter les données. Parce que les données sont en mémoire, elles peuvent être exploitées. , mais la mémoire en cours d'exécution de PHP a une limite et la valeur par défaut est de 128 Mo.

Remarque : étant donné que les requêtes sans tampon mettent beaucoup de temps à se connecter à la base de données, cela peut entraîner des requêtes lentes, des verrous de table, etc., qui consomment plus de ressources MySQL

par rapport aux requêtes non tamponnées La requête est une requête tamponnée :

Si vous utilisez une requête en cache, la mémoire PHP explosera directement et la mémoire sera insuffisante. D'accord, le but principal ici est de mettre en évidence le rendement

performance du rendement

Le générateur aura un très grand impact sur les performances de PHP applications

Le code PHP économise beaucoup de mémoire lors de l'exécution

Il est plus approprié pour calculer de grandes quantités de données

opération de rendementUtiliser

Les générateurs vous permettent d'écrire du code dans un bloc foreach pour parcourir un ensemble de données sans créer de tableau en mémoire, ce qui atteindrait votre limite de mémoire ou prendrait un temps de traitement considérable. Au lieu de cela, vous pouvez écrire une fonction génératrice, tout comme une fonction personnalisée normale, et au lieu qu'une fonction normale ne renvoie qu'une seule fois, le générateur peut produire autant de fois que nécessaire pour générer les valeurs qui doivent être itérées.

Explication avec des exemples

Le rendement du générateur PHP gère de grandes quantités de données (exemple de code)

Je viens de construire un tableau ici pour vous démontrer, généralement vous êtes Il en va de même pour l'exploitation des données de sortie de la base de données. En convertissant en array

//仓库库存扣除测试
public function cangku_stock()
{
    //set_time_limit(0);  //表示永久运行,这里我是测试array的时候用到的
    $order_info = $this->read_temp_api_order_info(10);  //这里我就测试了10条数据,效果是看不出来的
    foreach($order_info as $temp_api_order_info){
        dd($temp_api_order_info);  //打印出来看看数据
        //处理数据
        $api_ware_id = $this->o->getCangkuApiUrl() .'ware/program/addOutWare';
        $out_wares = api_request($api_ware_id, $temp_api_order_info);
        $temp_out_wares = json_decode($out_wares, true);
        if ($temp_out_wares['code'] != 1) {
            $msg =  (isset($temp_out_wares['msg']) && $temp_out_wares['msg']) ? $temp_out_wares['msg'] : var_export($out_wares, true);
            throw new Exception($msg);
        }
    }
    //dd("批量更新成功".date('Y-m-d H:i:s'));

, vous pouvez voir que nous appelons $order_info = $this->read_temp_api_order_info(10); qui renvoie un objet Generator. Cet objet peut être itéré en utilisant foreach. Pour chaque itération, PHP demandera. pour une instance de générateur Calculez et fournissez la valeur suivante sur laquelle itérer.

L'élégance des générateurs est que chaque fois qu'une valeur est produite, l'état interne du générateur se mettra en pause ; lorsque la valeur suivante est demandée au générateur, l'état interne sera restauré. L'état interne du générateur bascule entre le blocage et la reprise jusqu'à ce que la fin de la définition de la fonction soit atteinte ou qu'une instruction return vide soit rencontrée.

L'effet est le suivant :

Le rendement du générateur PHP gère de grandes quantités de données (exemple de code)

Testez une grande quantité de données ici et modifiez-les directement $this->read_temp_api_order_info(10);就D'accord, si vous calculez le nombre de tables de données, vous devez alors changer cette méthode. Essayez de le changer vous-même.

Le rendement du générateur PHP gère de grandes quantités de données (exemple de code)

Ici, je vais principalement vous expliquer comment utiliser le rendement Si vous voulez voir combien de temps il faut pour insérer. la table de données, vous pouvez ajouter un champ d'heure d'insertion à la table de données, puis examiner la comparaison entre la première insertion de données et la dernière insertion de données.

Pour plus de connaissances sur php, veuillez visiter le tutoriel 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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer