Recommandé (gratuit) : PHP7
1. (AST)
1) En PHP5, le processus d'exécution du script php aux opcodes est :
2) En PHP7, les tableaux op ne sont plus directement générés lors de la phase d'analyse syntaxique, mais AST est généré en premier, il y a donc une étape supplémentaire dans le processus :
Ajout d'un arbre de syntaxe abstraite : l'utilisation de la mémoire a augmenté, mais le temps d'exécution a diminué
AST joue le rôle d'un middleware dans le processus de compilation PHP, remplaçant la méthode originale consistant à cracher l'opcode directement à partir de l'interpréteur, découplant l'interpréteur (analyseur) et le compilateur (compilateur). Cela peut réduire certains codes Hack. , et en même temps, rendre la mise en œuvre plus facile à comprendre et à maintenir
2 Natice TLS
<.>
PHP doit résoudre le problème de la « sécurité des threads » (TS, Thread Safe) en mode multithread. Étant donné que les threads partagent l'espace mémoire du processus, chaque thread lui-même doit être construit d'une manière ou d'une autre. espace pour sauvegarder vos propres données privées afin d’éviter une contamination mutuelle avec d’autres threads.
La méthode adoptée par PHP5 consiste à maintenir un grand tableau global et à allouer un espace de stockage indépendant à chaque thread. Les threads accèdent à ce groupe de données global via leurs propres valeurs clés. Cette valeur de clé unique doit être transmise à chaque fonction qui doit utiliser des variables globales dans PHP5. PHP7 estime que cette méthode de transmission n'est pas conviviale et présente quelques problèmes. Par conséquent, essayez d’utiliser une variable globale spécifique au thread pour enregistrer cette valeur clé.
3. Spécifiez le type de valeur de retour du paramètre
Une fonctionnalité très importante du langage PHP est la « typage faible ». ". Cela rend les programmes PHP très faciles à écrire.
PHP7 prend en charge la définition de type de manière facultative. De plus, il introduit également une instruction switch declare(strict_type=1); , une fois cette instruction est activée, elle forcera le programme sous le fichier actuel à suivre des types de paramètres de fonction stricts et des types de retour.
4. Modifications de la structure zval
En PHP5, zval est défini comme suit :struct _zval_struct { union { long lval; double dval; struct { char *val; int len; } str; HashTable *ht; zend_object_value obj; zend_ast *ast; } value; zend_uint refcount__gc; zend_uchar type; zend_uchar is_ref__gc; };
Tout d'abord, la taille de cette structure est (sur les systèmes 64 bits) de 24 octets. Examinons de plus près cette union zval.value qui est la plus grande carte longue, ce qui entraîne la valeur entière. nécessite une section de 16 mots, cela devrait être facile à optimiser, comme le déplacer et le remplacer par un pointeur, car après tout, IS_OBJECT n'est pas le type le plus couramment utilisé
.Deuxièmement, chaque champ de cette structure a une signification claire et aucun champ personnalisé n'est réservé. Par conséquent, lors de nombreuses optimisations à l'ère PHP5, certaines informations liées à zval doivent être stockées. doit utiliser un autre mappage de structure, ou un emballage et des correctifs externes pour étendre zval. Par exemple, dans la version 5.3, un nouveau GC a été introduit pour résoudre spécifiquement les références circulaires. Il ne doit pas adopter l'approche relativement hacky suivante <🎜. >
Troisièmement, la plupart des zvals de PHP sont passés par valeur, et la valeur est copiée lors de l'écriture. Cependant, il y a deux exceptions, qui sont les objets et les ressources. Ils sont toujours passés par référence, donc. Cela crée un problème. En plus du nombre de références dans zval, les objets et les ressources ont également besoin d'un nombre de références global pour garantir que la mémoire peut être recyclée. Ainsi, à l'ère de PHP5, en prenant les objets comme exemple, il existe deux ensembles de références. la référence compte. L'un est dans zval et l'autre est le nombre d'obj lui-même : 第四, 我们知道PHP中, 大量的计算都是面向字符串的, 然而因为引用计数是作用在zval的, 那么就会导致如果要拷贝一个字符串类型的zval, 我们别无他法只能复制这个字符串. 当我们把一个zval的字符串作为key添加到一个数组里的时候, 我们别无他法只能复制这个字符串. 虽然在PHP5.4的时候, 我们引入了INTERNED STRING, 但是还是不能根本解决这个问题. 还比如, PHP中大量的结构体都是基于Hashtable实现的, 增删改查Hashtable的操作占据了大量的CPU时间, 而字符串要查找首先要求它的Hash值, 理论上我们完全可以把一个字符串的Hash值计算好以后, 就存下来, 避免再次计算等等 第五, 这个是关于引用的, PHP5的时代, 我们采用写时分离, 但是结合到引用这里就有了一个经典的性能问题: 第六, 也是最重要的一个, 为什么说它重要呢? 因为这点促成了很大的性能提升, 我们习惯了在PHP5的时代调用MAKE_STD_ZVAL在堆内存上分配一个zval, 然后对他进行操作, 最后呢通过RETURN_ZVAL把这个zval的值”copy”给return_value, 然后又销毁了这个zval, 比如pathinfo这个函数: 5、异常处理 PHP 5 的 try ... catch ... finally 无法处理传统错误,如果需要,你通常会考虑用 set_error_handler() 来 Hack 一下。但是仍有很多错误类型是 set_error_handler() 捕捉不到的 PHP 7引入 Throwable 接口,错误及异常都实现了 Throwable,无法直接实现 Throwable,但可以扩展 \Exception 和 \Error 类。可以用 Throwable 捕捉异常跟错误。\Exception 是所有PHP及用户异常的基类;\Error 是所有内部PHP错误的基类。$name = "Tony";
try {
$name = $name->method();
} catch (\Error $e) {
echo "出错消息 --- ", $e->getMessage(), PHP_EOL;
}
try {
$name = $name->method();
} catch (\Throwable $e) {
echo "出错消息 --- ", $e->getMessage(), PHP_EOL;
}
try {
intp(5, 0);
} catch (\pisionByZeroError $e) {
echo "出错消息 --- ", $e->getMessage(), PHP_EOL;
}
6、hashtable 的变化
7、执行器
8、新的参数解析方式
PHP5 对应的参数解析 zend_parse_parament,
PHP7对应的参数解析:fast_zpp
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!