Heim  >  Artikel  >  Backend-Entwicklung  >  Werfen wir einen Blick auf die neuen Funktionen und Leistungsoptimierungen von PHP7 und PHP5.

Werfen wir einen Blick auf die neuen Funktionen und Leistungsoptimierungen von PHP7 und PHP5.

coldplay.xixi
coldplay.xixinach vorne
2021-02-04 09:13:072556Durchsuche

Werfen wir einen Blick auf die neuen Funktionen und Leistungsoptimierungen von PHP7 und PHP5.

Empfohlen (kostenlos): PHP7

1. Abstrakter Syntaxbaum (AST)

1) In PHP5 ist der Ausführungsprozess vom PHP-Skript zu Opcodes:

  1. Lexing: Lexikalische Scan-Analyse, Konvertierung von Quelldateien in Token-Streams;
  2. Parsing: Syntaxanalyse, Generierung von Op-Arrays in dieser Phase.

2) In PHP7 werden Op-Arrays nicht mehr direkt während der Syntaxanalysephase generiert, sondern AST wird zuerst generiert, daher gibt es einen weiteren Schritt im Prozess:

  1. Lexing : lexikalische Scan-Analyse, Konvertieren der Quelle.
  2. Parsing: Syntaxanalyse, Generieren eines abstrakten Syntaxbaums aus dem Token-Stream;
  3. Kompilierung: Generieren von Op-Arrays aus dem abstrakten Syntaxbaum .

Abstrakter Syntaxbaum hinzugefügt: Speichernutzung erhöht, aber Ausführungszeit verringert

AST spielt die Rolle einer Middleware im PHP-Kompilierungsprozess und ersetzt das Original direkt aus Die Art und Weise, wie der Interpreter spuckt Unser Opcode entkoppelt den Interpreter (Parser) und den Compiler (Compiler), was einige Hack-Codes reduzieren kann und gleichzeitig die Implementierung leichter verständlich und wartbar macht Das Problem der „Thread-Sicherheit“ (TS, Thread Safe) muss im Multithread-Modus gelöst werden. Da Threads den Speicherplatz des Prozesses gemeinsam nutzen, muss jeder Thread selbst einen privaten Bereich erstellen, um seine eigenen privaten Daten zu speichern und so eine gegenseitige Vermeidung zu vermeiden Kontamination mit anderen Fäden.

Die von PHP5 übernommene Methode besteht darin, ein großes globales Array zu verwalten und jedem Thread einen unabhängigen Speicherplatz zuzuweisen. Die Threads greifen über ihre eigenen Schlüsselwerte auf diese globale Datengruppe zu. Dieser eindeutige Schlüsselwert muss an jede Funktion übergeben werden, die globale Variablen in PHP5 verwenden muss. PHP7 ist der Ansicht, dass diese Übergabemethode nicht benutzerfreundlich ist und einige Probleme aufweist. Versuchen Sie daher, eine globale Thread-spezifische Variable zu verwenden, um diesen Schlüsselwert zu speichern.

3. Parameter-Rückgabewerttyp angeben

Eine sehr wichtige Funktion der PHP-Sprache ist die „schwache Typisierung“, die das Schreiben von PHP-Programmen sehr einfach macht.

Optionale Methode für PHP7 Unterstützt den Typ Darüber hinaus wird eine Switch-Anweisung „declare(strict_type=1)“ eingeführt. Sobald diese Anweisung aktiviert ist, wird das Programm unter der aktuellen Datei gezwungen, strikte Funktionsparameter-Übertragungstypen und Rückgabetypen zu befolgen.

4. Änderungen in der zval-Struktur

In PHP5 ist zval wie folgt definiert:

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;
};

Zuallererst beträgt die Größe dieser Struktur (in 64-Bit-Systemen) 24 Bytes Schauen Sie sich diese zval.value-Union genau an. Zend_object_value ist die größte lange Karte, was dazu führt, dass der gesamte Wert 16 Bytes benötigt. Dies sollte leicht optimiert werden, z. B. durch Verschieben und Ersetzen durch einen Zeiger, denn schließlich ist es IS_OBJECT ist nicht der am häufigsten verwendete Typ.

Zweitens hat jedes Feld dieser Struktur eine klare Bedeutung und es sind keine benutzerdefinierten Felder reserviert, was in der PHP5-Ära zu erheblichen Optimierungen führt Um einige Informationen zu zval zu speichern, müssen Sie eine andere Strukturzuordnung oder externe Verpackung und Patches verwenden, um zval zu erweitern. In 5.3 wurde beispielsweise ein neuer GC eingeführt, um Zirkelverweise gezielt zu lösen Ansatz

Drittens werden die meisten PHP-Zvals als Wert übergeben und der Wert wird beim Schreiben kopiert. Es gibt jedoch zwei Ausnahmen: Objekte und Ressourcen. Sie werden immer als Referenz übergeben, was zu einem Problem führt Zusätzlich zum Referenzzähler in zval benötigen Objekte und Ressourcen auch einen globalen Referenzzähler, um sicherzustellen, dass der Speicher recycelt werden kann. Im Zeitalter von PHP5 gibt es also zwei Referenzzählersätze ist in zval, und das andere ist die Anzahl von obj selbst:

第四, 我们知道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  

Das obige ist der detaillierte Inhalt vonWerfen wir einen Blick auf die neuen Funktionen und Leistungsoptimierungen von PHP7 und PHP5.. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen