


Un outil d'optimisation des performances négligé en PHP : les générateurs
Dans cet article, nous partagerons avec vous les connaissances des générateurs, un outil d'optimisation des performances négligé en PHP. Nous espérons qu'il pourra aider tout le monde. Si vous travaillez en Python ou dans d'autres langages, vous devez être familier avec les générateurs. Mais de nombreux développeurs PHP ne connaissent peut-être pas la fonction du générateur. C'est peut-être parce que le générateur est une fonction introduite dans PHP 5.5.0, ou il se peut que la fonction du générateur ne soit pas très évidente. Cependant, la fonction générateur est vraiment utile.
Avantages
Si je parle directement du concept, je suppose que vous serez encore confus après l'avoir écouté, alors parlons d'abord des avantages, peut-être que cela pourra susciter votre intérêt. Alors quels sont les avantages des générateurs, comme suit :
Les générateurs auront un grand impact sur les performances des applications PHP
Lorsque le code PHP fonctionne Économisez beaucoup de mémoire
Plus adapté au calcul de grandes quantités de données
Alors, comment ces fonctions magiques sont-elles réalisées ? Donnons d'abord un exemple.
Introduction au concept
Tout d'abord, éliminons le fardeau du concept de générateur et examinons une simple fonction PHP :
function createRange($number){ $data = []; for($i=0;$i<$number;$i++){ $data[] = time(); } return $data; }
Il s'agit d'un PHP très courant fonction, nous Il est souvent utilisé lorsqu'il s'agit de certains tableaux. Le code ici est également très simple :
On crée une fonction. La fonction
contient une boucle
for
, on boucle l'heure actuelle dans$data
for
exécution de la boucle Une fois terminé, reviens$data
.
Ce n’est pas encore fini, continuons. Écrivons une autre fonction et imprimons la valeur de retour de cette fonction dans une boucle :
$result = createRange(10); // 这里调用上面我们创建的函数 foreach($result as $value){ sleep(1);//这里停顿1秒,我们后续有用 echo $value.'<br />'; }
Jetons un coup d'œil aux résultats exécutés dans le navigateur :
C'est parfait ici, aucun problème. (Bien sûr, vous ne pouvez pas voir l'effet de sleep(1)
)
Pensez à un problème
Nous avons remarqué que lors de l'appel de la fonction createRange
, la valeur passée à $number
est 10, ce qui est un très petit nombre. Supposons que, maintenant, transmettez une valeur 10000000
(10 millions).
Ensuite, dans la fonction createRange
, la boucle for
doit être exécutée 1000
dix mille fois. Et il y a 1000
dix mille valeurs placées dans $data
, et le tableau $data
est placé dans la mémoire. Par conséquent, beaucoup de mémoire sera occupée lors de l’appel de fonctions.
Ici, le générateur peut entrer en jeu.
Créer un générateur
On modifie le code directement, merci de faire attention :
function createRange($number){ for($i=0;$i<$number;$i++){ yield time(); } }
Regardez ce code qui est très similaire à tout à l'heure, nous avons supprimé le tableau$data
, et n'a rien renvoyé, mais a utilisé un mot-clé time()
yield
utiliser le générateur
Exécutons à nouveau le deuxième morceau de code :
$result = createRange(10); // 这里调用上面我们创建的函数 foreach($result as $value){ sleep(1); echo $value.'<br />'; }
Nous avons miraculeusement découvert que la valeur de sortie est différente de la première fois sans utiliser le générateur. Les valeurs (horodatages) ici sont séparées de 1 seconde.
L'intervalle d'une seconde ici est en fait la conséquence de sleep(1)
. Mais pourquoi n’y a-t-il pas d’écart la première fois ? En effet :
Lorsqu'un générateur n'est pas utilisé : le résultat de la boucle
createRange
au sein de la fonctionfor
est rapidement placé dans$data
et renvoyé immédiatement. Par conséquent,foreach
parcourt un tableau fixe.Lors de l'utilisation de générateurs : La valeur de
createRange
n'est pas générée rapidement en une seule fois, mais s'appuie sur la boucleforeach
.foreach
Bouclez une fois etfor
exécutez une fois.
À ce stade, vous devriez avoir une idée du générateur.
Compréhension approfondie du générateur
Analyse du code
Analysons le code tout à l'heure.
function createRange($number){ for($i=0;$i<$number;$i++){ yield time(); } } $result = createRange(10); // 这里调用上面我们创建的函数 foreach($result as $value){ sleep(1); echo $value.'<br />'; }
Restaurons le processus d'exécution du code.
appelle d'abord la fonction
createRange
, en passant le paramètre10
, mais la valeurfor
est exécutée une fois puis s'arrête, et indique àforeach
que la première boucle peut être utilisé comme valeur.foreach
démarre la boucle sur$result
, arrivant en premiersleep(1)
, puis commence à utiliser une valeur donnée parfor
pour effectuer la sortie.foreach
prépare la deuxième boucle. Avant de démarrer la deuxième boucle, il demande à nouveau la bouclefor
.for
La boucle est ensuite exécutée à nouveau, indiquant àforeach
.foreach
d'obtenir l'horodatage généré Deux valeurs et la sortie. Puisqueforeach
est danssleep(1)
, la bouclefor
est retardée d'1 seconde pour générer l'heure actuelle
Par conséquent, pendant toute l'exécution du code, il n'y a toujours que. une valeur d'enregistrement participant à la boucle, mémoire Il ne contient qu'un seul message.
无论开始传入的$number
有多大,由于并不会立即生成所有结果集,所以内存始终是一条循环的值。
概念理解
到这里,你应该已经大概理解什么是生成器了。下面我们来说下生成器原理。
首先明确一个概念:生成器yield关键字不是返回值,他的专业术语叫产出值,只是生成一个值
那么代码中foreach
循环的是什么?其实是PHP在使用生成器的时候,会返回一个Generator
类的对象。foreach
可以对该对象进行迭代,每一次迭代,PHP会通过Generator
实例计算出下一次需要迭代的值。这样foreach
就知道下一次需要迭代的值了。
而且,在运行中for
循环执行后,会立即停止。等待foreach
下次循环时候再次和for
索要下次的值的时候,for
循环才会再执行一次,然后立即再次停止。直到不满足条件不执行结束。
实际开发应用
很多PHP开发者不了解生成器,其实主要是不了解应用领域。那么,生成器在实际开发中有哪些应用?
读取超大文件
PHP开发很多时候都要读取大文件,比如csv文件、text文件,或者一些日志文件。这些文件如果很大,比如5个G。这时,直接一次性把所有的内容读取到内存中计算不太现实。
这里生成器就可以派上用场啦。简单看个例子:读取text文件
我们创建一个text文本文档,并在其中输入几行文字,示范读取。
<?php header("content-type:text/html;charset=utf-8"); function readTxt() { # code... $handle = fopen("./test.txt", 'rb'); while (feof($handle)===false) { # code... yield fgets($handle); } fclose($handle); } foreach (readTxt() as $key => $value) { # code... echo $value.'<br />'; }
通过上图的输出结果我们可以看出代码完全正常。
但是,背后的代码执行规则却一点儿也不一样。使用生成器读取文件,第一次读取了第一行,第二次读取了第二行,以此类推,每次被加载到内存中的文字只有一行,大大的减小了内存的使用。
这样,即使读取上G的文本也不用担心,完全可以像读取很小文件一样编写代码。
相关推荐:
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!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

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

PHP 8.4 apporte plusieurs nouvelles fonctionnalités, améliorations de sécurité et de performances avec une bonne quantité de dépréciations et de suppressions de fonctionnalités. Ce guide explique comment installer PHP 8.4 ou mettre à niveau vers PHP 8.4 sur Ubuntu, Debian ou leurs dérivés. Bien qu'il soit possible de compiler PHP à partir des sources, son installation à partir d'un référentiel APT comme expliqué ci-dessous est souvent plus rapide et plus sécurisée car ces référentiels fourniront les dernières corrections de bogues et mises à jour de sécurité à l'avenir.

CakePHP est un framework open source pour PHP. Il vise à faciliter grandement le développement, le déploiement et la maintenance d'applications. CakePHP est basé sur une architecture de type MVC à la fois puissante et facile à appréhender. Modèles, vues et contrôleurs gu

Pour travailler sur le téléchargement de fichiers, nous allons utiliser l'assistant de formulaire. Voici un exemple de téléchargement de fichiers.

Visual Studio Code, également connu sous le nom de VS Code, est un éditeur de code source gratuit – ou environnement de développement intégré (IDE) – disponible pour tous les principaux systèmes d'exploitation. Avec une large collection d'extensions pour de nombreux langages de programmation, VS Code peut être c

CakePHP est un framework MVC open source. Cela facilite grandement le développement, le déploiement et la maintenance des applications. CakePHP dispose d'un certain nombre de bibliothèques pour réduire la surcharge des tâches les plus courantes.

Ce tutoriel montre comment traiter efficacement les documents XML à l'aide de PHP. XML (Language de balisage extensible) est un langage de balisage basé sur le texte polyvalent conçu à la fois pour la lisibilité humaine et l'analyse de la machine. Il est couramment utilisé pour le stockage de données et

JWT est une norme ouverte basée sur JSON, utilisée pour transmettre en toute sécurité des informations entre les parties, principalement pour l'authentification de l'identité et l'échange d'informations. 1. JWT se compose de trois parties: en-tête, charge utile et signature. 2. Le principe de travail de JWT comprend trois étapes: la génération de JWT, la vérification de la charge utile JWT et l'analyse. 3. Lorsque vous utilisez JWT pour l'authentification en PHP, JWT peut être généré et vérifié, et les informations sur le rôle et l'autorisation des utilisateurs peuvent être incluses dans l'utilisation avancée. 4. Les erreurs courantes incluent une défaillance de vérification de signature, l'expiration des jetons et la charge utile surdimensionnée. Les compétences de débogage incluent l'utilisation des outils de débogage et de l'exploitation forestière. 5. L'optimisation des performances et les meilleures pratiques incluent l'utilisation des algorithmes de signature appropriés, la définition des périodes de validité raisonnablement,

Une chaîne est une séquence de caractères, y compris des lettres, des nombres et des symboles. Ce tutoriel apprendra à calculer le nombre de voyelles dans une chaîne donnée en PHP en utilisant différentes méthodes. Les voyelles en anglais sont a, e, i, o, u, et elles peuvent être en majuscules ou en minuscules. Qu'est-ce qu'une voyelle? Les voyelles sont des caractères alphabétiques qui représentent une prononciation spécifique. Il y a cinq voyelles en anglais, y compris les majuscules et les minuscules: a, e, i, o, u Exemple 1 Entrée: String = "TutorialSpoint" Sortie: 6 expliquer Les voyelles dans la chaîne "TutorialSpoint" sont u, o, i, a, o, i. Il y a 6 yuans au total
