Heim  >  Artikel  >  Backend-Entwicklung  >  [Hematemesis] 28 Interviewfragen zur PHP-Kerntechnologie, die Ihnen beim Jobwechsel helfen!

[Hematemesis] 28 Interviewfragen zur PHP-Kerntechnologie, die Ihnen beim Jobwechsel helfen!

青灯夜游
青灯夜游nach vorne
2022-02-15 11:17:5420584Durchsuche

Dieser Artikel stellt 28 Interviewfragen zur PHP-Kerntechnologie zusammen und vermittelt Ihnen ein tiefgreifendes Verständnis der PHP-Kerntechnologie. Sie können Fallstricke bei Vorstellungsgesprächen schnell vermeiden und sind für den Jobwechsel unerlässlich. Ich hoffe, es wird für alle hilfreich sein!

[Hematemesis] 28 Interviewfragen zur PHP-Kerntechnologie, die Ihnen beim Jobwechsel helfen!

Verwandte Empfehlungen: „Zusammenfassung der PHP-Interviewfragen 2022 (Sammlung)

1 Was ist oop?

Antwort: oop ist objektorientierte Programmierung, und objektorientierte Programmierung ist ein Computer Programmierarchitektur: Ein Grundprinzip von OOP besteht darin, dass ein Computerprogramm aus einer einzelnen Einheit oder einem einzelnen Objekt besteht, das als Unterprogramm fungieren kann.

OOP hat drei Hauptmerkmale

1: wird auch als Informationsverbergung bezeichnet, was bedeutet, dass die Verwendung und Implementierung einer Klasse getrennt werden und nur einige Schnittstellen und Methoden für den externen Kontakt übrig bleiben oder nur einige für Entwicklungsmethoden offengelegt werden vom Personal genutzt. Daher müssen Entwickler nur darauf achten, wie diese Klasse verwendet wird, und nicht auf ihren spezifischen Implementierungsprozess. Dadurch kann eine MVC-Arbeitsteilung und -Kooperation erreicht, gegenseitige Abhängigkeiten zwischen Programmen effektiv vermieden und eine lose Kopplung zwischen Codemodulen erreicht werden.

2. Vererbung: Unterklassen erben automatisch die Attribute und Methoden ihrer übergeordneten Klasse und können neue Attribute und Methoden hinzufügen oder einige Attribute und Methoden neu schreiben. Vererbung erhöht die Wiederverwendbarkeit von Code. PHP unterstützt nur die Einzelvererbung, was bedeutet, dass eine Unterklasse nur eine übergeordnete Klasse haben kann.

3. Polymorphismus: Die Unterklasse erbt die Attribute und Methoden von der übergeordneten Klasse und schreibt einige der Methoden neu. Obwohl mehrere Unterklassen dieselbe Methode haben, können von diesen Unterklassen instanziierte Objekte nach dem Aufruf derselben Methoden völlig unterschiedliche Ergebnisse erzielen.

Polymorphismus erhöht die Flexibilität von Software.

1. Einfach zu warten

Die Struktur ist objektorientiert gestaltet und aufgrund der Vererbung sehr praktisch, auch wenn sich die Anforderungen ändern und kostengünstig im Unterhalt.

2. Hohe Qualität

Beim Entwurf können vorhandene Klassen, die in früheren Projekten getestet wurden, wiederverwendet werden, um das System den Geschäftsanforderungen gerecht zu machen und eine hohe Qualität zu gewährleisten.

3. Hohe Effizienz

Während der Softwareentwicklung werden reale Dinge abstrahiert und Klassen basierend auf Designanforderungen generiert. Die Verwendung dieser Methode zur Lösung von Problemen kommt dem täglichen Leben und der natürlichen Denkweise nahe, was zwangsläufig die Effizienz und Qualität der Softwareentwicklung verbessern wird.

4. Leicht zu erweitern

Aufgrund der Eigenschaften von Vererbung, Kapselung und Polymorphismus wird auf natürliche Weise eine Systemstruktur mit hoher Kohäsion und geringer Kopplung entworfen, wodurch das System flexibler, einfacher zu erweitern und kostengünstiger wird.

2 Es gibt mehrere Möglichkeiten, zwei Arrays zusammenzuführen. Versuchen Sie, ihre Ähnlichkeiten und Unterschiede zu vergleichen.

Möglichkeiten:

1, array_merge()

2, '+'

3, array_merge_recursive

Ähnlichkeiten und Unterschiede:

array_merge führt einfach Arrays zusammen.

array_merge_recursive führt zwei Arrays zusammen. Wenn das Array genau dieselben Daten enthält, führen Sie diese rekursiv zusammen.

array_combine und '+': Zwei Arrays zusammenführen. Der Wert des ersteren wird verwendet als Schlüssel des neuen Arrays

3 Es gibt einen Fehler in der Funktion is_writeable() von PHP, der nicht genau bestimmen kann, ob ein Verzeichnis/eine Datei beschreibbar ist. Bitte schreiben Sie eine Funktion, um festzustellen, ob das Verzeichnis/die Datei absolut beschreibbar ist Antwort: Es gibt zwei Aspekte des Fehlers: 1. Wenn die Datei in Windows nur ein schreibgeschütztes Attribut hat, gibt die Funktion is_writeable() false zurück. Wenn sie true zurückgibt, ist die Datei nicht unbedingt beschreibbar.

Wenn es sich um ein Verzeichnis handelt, erstellen Sie eine neue Datei im Verzeichnis und prüfen Sie, indem Sie die Datei öffnen.

Wenn es sich um eine Datei handelt, können Sie testen, ob die Datei beschreibbar ist, indem Sie die Datei öffnen (fopen).

2. Wenn in Unix der Safe_mode in der PHP-Konfigurationsdatei aktiviert ist (safe_mode=on), ist is_writeable() ebenfalls nicht verfügbar.

Lesen Sie die Konfigurationsdatei, um zu sehen, ob der Safe_Mode aktiviert ist.

/**
* Tests for file writability
*
* is_writable() returns TRUE on Windows servers when you really can't write to
* the file, based on the read-only attribute. is_writable() is also unreliable
* on Unix servers if safe_mode is on.
*
* @access   private
* @return   void
*/
if ( ! function_exists('is_really_writable'))
{
    function is_really_writable($file){
    // If we're on a Unix server with safe_mode off we call is_writable
    if (DIRECTORY_SEPARATOR == '/' AND @ini_get("safe_mode") == FALSE){
        return is_writable($file);
    }
    // For windows servers and safe_mode "on" installations we'll actually
    // write a file then read it. Bah...
    if (is_dir($file)){
        $file = rtrim($file, '/').'/'.md5(mt_rand(1,100).mt_rand(1,100));
        if (($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE){
            return FALSE;
        }
        fclose($fp);
        @chmod($file, DIR_WRITE_MODE);
        @unlink($file);
        return TRUE;
    } elseif ( ! is_file($file) OR ($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE) {
        return FALSE;
    }
    fclose($fp);
    return TRUE;
    }
}

4 Was ist der Garbage-Collection-Mechanismus von PHP?

PHP kann den Speicher automatisch verwalten und nicht mehr benötigte Objekte löschen. PHP verwendet einen einfachen Garbage-Collection-Mechanismus namens Referenzzählung. Jedes Objekt enthält einen Referenzzähler. Jede Referenz ist mit dem Objekt verbunden und der Zähler wird um 1 erhöht. Wenn die Referenz den Wohnraum verlässt oder auf NULL gesetzt wird, wird der Zähler um 1 dekrementiert. Wenn der Referenzzähler eines Objekts Null erreicht, weiß PHP, dass Sie dieses Objekt nicht mehr verwenden müssen und gibt den von ihm belegten Speicherplatz frei.

5 Schreiben Sie eine Funktion, um die Dateierweiterung so effizient wie möglich von einer Standard-URL abzurufen,

Zum Beispiel: http://www.startphp.cn/abc/de/fg.php?id=1 Muss PHP oder .php extrahieren
<?php
    // 方案一
    function getExt1($url){
        $arr = parse_url($url);
        //Array ( [scheme] => http [host] => www.startphp.cn [path] => /abc/de/fg.php [query] => id=1 )
        $file = basename($arr[&#39;path&#39;]);
        $ext = explode(&#39;.&#39;, $file);
        return $ext[count($ext)-1];
    }
    // 方案二
    function getExt2($url){
        $url = basename($url);
        $pos1 = strpos($url,&#39;.&#39;);
        $pos2 = strpos($url,&#39;?&#39;);
        if (strstr($url,&#39;?&#39;)) {
            return substr($url,$pos1+1,$pos2-$pos1-1);
        } else {
            return substr($url,$pos1);
        }
    }
    $path = "http://www.startphp.cn/abc/de/fg.php?id=1";
    echo getExt1($path);
    echo "<br />";
    echo getExt2($path);
?>

6 Verwenden Sie reguläre Ausdrücke, um einen Teil der Markup-Sprache (HTML oder XML) zu extrahieren

Der angegebene Attributwert des angegebenen Tags im Codesegment (die Unregelmäßigkeit des Attributs muss berücksichtigt werden). Wert, z. B. Größe Es ist nicht schreibempfindlich, zwischen dem Attributnamenwert und dem Gleichheitszeichen steht ein Leerzeichen usw.). Hier wird davon ausgegangen, dass der attr-Attributwert des Test-Tags extrahiert werden muss. Bitte erstellen Sie selbst eine Zeichenfolge, die das Tag enthält (Tencent)

wie folgt:

<?php
    header("content-type:text/html;charset=utf-8");
    function getAttrValue($str,$tagName,$attrName){
        $pattern1="/<".$tagName."(s+w+s*=s*([&#39;"]?)([^&#39;"]*)())*s+".$attrName."s*=s*([&#39;"]?)([^&#39;"]*)()(s+w+s*=s*([&#39;"]?)([^&#39;"]*)(9))*s*>/i";
        $arr=array();
        $re=preg_match($pattern1,$str,$arr);
        if($re){
            echo"<br/>$arr[6]={$arr[6]}";
        }else{
            echo"<br/>没找到。";
        }
    }
    // 示例
    $str1="<test attr=&#39;ddd&#39;>";
    getAttrValue($str1,"test","attr");//找test标签中attr属性的值,结果为ddd
    $str2="<test2 attr=&#39;ddd&#39;attr2=&#39;ddd2&#39;t1="t1 value"t2=&#39;t2 value&#39;>";
    getAttrValue($str2,"test2","t1");//找test2标签中t1属性的值,结果为t1 value
?>

7 php中WEB上传文件的原理是什么,如何限制上传文件的大小?

上传文件的表单使用post方式,并且要在form中添加enctype='multipart/form-data'。

一般可以加上隐藏域:a477cd11f888a00d3a5c1a04e2bd042a,位置在file域前面。

value的值是上传文件的客户端字节限制。可以避免用户在花时间等待上传大文件之后才发现文件过大上传失败的麻烦。

使用file文件域来选择要上传的文件,当点击提交按钮之后,文件会被上传到服务器中的临时目录,在脚本运行结束时会被销毁,所以应该在脚本结束之前,将其移动到服务器上的某个目录下,可以通过函数move_uploaded_file()来移动临时文件,要获取临时文件的信息,使用$_FILES。

限制上传文件大小的因素有:

客户端的隐藏域MAX_FILE_SIZE的数值(可以被绕开)。

服务器端的upload_max_filesizepost_max_sizememory_limit。这几项不能够用脚本来设置。

自定义文件大小限制逻辑。即使服务器的限制是能自己决定,也会有需要个别考虑的情况。所以这个限制方式经常是必要的。

8 请说明 PHP 中传值与传引用的区别,什么时候传值什么时候传引用?

按值传递:函数范围内对值的任何改变在函数外部都会被忽略

按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改

优缺点:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。按引用传递则不需要复制值,对于性能提高很有好处。

9 MySQL数据库中的字段类型varchar和char的主要区别是什么?

Varchar是变长,节省存储空间,char是固定长度。查找效率要char型快,因为varchar是非定长,必须先查找长度,然后进行数据的提取,比char定长类型多了一个步骤,所以效率低一些。

10 静态化如何实现的?伪静态如何实现?

1、 静态化指的是页面静态化,也即生成实实在在的静态文件,也即不需要查询数据库就可以直接从文件中获取数据,指的是真静态。

实现方式主要有两种:一种是我们在添加信息入库的时候就生成的静态文件,也称为模板替换技术。一种是用户在访问我们的页面时先判断是否有对应的缓存文件存在,如果存在就读缓存,不存在就读数据库,同时生成缓存文件。

2、伪静态不是真正意义上的静态化,之所以使用伪静态,主要是为了SEO推广,搜索引擎对动态的文件获取难度大,不利于网站的推广。

实习原理是基于Apache或Nginx的rewrite

主要有两种方式:

一种是直接在配置虚拟机的位置配置伪静态,这个每次修改完成后需要重启web服务器。

另一种采用分布式的,可以在网站的根目录上创建.htaccess的文件,在里面配置相应的重写规则来实现伪静态,这种每次重写时不需要重启web服务器,且结构上比较清晰。

11 如何处理负载,高并发?

1、HTML静态化

效率最高、消耗最小的就是纯静态化的html页面,所以我们尽可能使我们的 网站上的页面采用静态页面来实现,这个最简单的方法其实也是最有效的方法。

2、图片服务器分离

把图片单独存储,尽量减少图片等大流量的开销,可以放在一些相关的平台上,如七牛等

3、数据库集群和库表散列及缓存

数据库的并发连接为100,一台数据库远远不够,可以从读写分离、主从复制,数据库集群方面来着手。另外尽量减少数据库的访问,可以使用缓存数据库如memcache、redis。

4、镜像:

尽量减少下载,可以把不同的请求分发到多个镜像端。

5、负载均衡:

Apache的最大并发连接为1500,只能增加服务器,可以从硬件上着手,如F5服务器。当然硬件的成本比较高,我们往往从软件方面着手。

12 PHP7的新特性?

标量类型声明:PHP 7 中的函数的形参类型声明可以是标量了。在 PHP 5 中只能是类名、接口、array 或者 callable (PHP 5.4,即可以是函数,包括匿名函数),现在也可以使用 string、int、float和 bool 了。 

Deklaration des Rückgabewerttyps: Unterstützung für die Deklaration des Rückgabetyps hinzugefügt. Ähnlich wie die Parametertypdeklaration gibt die Rückgabetypdeklaration den Typ des Rückgabewerts der Funktion an. Die verfügbaren Typen sind dieselben wie die in der Parameterdeklaration verfügbaren.

NULL-Zusammenführungsoperator: Da es viele Situationen gibt, in denen ternäre Ausdrücke und isset() im täglichen Gebrauch gleichzeitig verwendet werden, gibt der NULL-Zusammenführungsoperator seinen eigenen Wert zurück, wenn die Variable existiert und der Wert nicht NULL ist, andernfalls wird er zurückgegeben es ist der zweite Operand.

Verwendungsverbesserung: Aus demselben Namespace importierte Klassen, Funktionen und Konstanten können jetzt auf einmal über eine einzige Verwendungsanweisung importiert werden. Anonyme Klassen: Unterstützt jetzt die Instanziierung einer anonymen Klasse über eine neue Klasse. 13 Häufige PHP-Sicherheitsangriffe SQL-Injection:

Benutzer verwenden SQL-Anweisungen, um Formularfelder einzugeben, um die normale SQL-Ausführung zu beeinflussen.

Verhindern: Verwenden Sie mysql_real_escape_string(), um Daten manuell zu filtern. Verwenden Sie vorbereitete Anweisungen und binden Sie Variablen, wenn Sie eine Verbindung zur Datenbank herstellen und auf die Daten zugreifen möchten Geben Sie die Werte oder Daten ein, verwenden Sie Parameter (Parameter), um Werte anzugeben, verwenden Sie @ oder? Parameter darzustellen.

XSS-Angriff: Cross-Site-Scripting-Angriff, bei dem der Benutzer einige Daten in Ihre Website eingibt, einschließlich clientseitigem Skript (normalerweise JavaScript). Wenn Sie Daten ohne Filterung auf eine andere Webseite ausgeben, wird dieses Skript ausgeführt.

Prävention: Um XSS-Angriffe zu verhindern, verwenden Sie die PHP-Funktion htmlentities() zum Filtern und Ausgeben an den Browser.

CSRF: Fälschung von Cross-Site-Anfragen, wenn eine Seite eine Anfrage stellt, die aussieht, als handele es sich um einen vertrauenswürdigen Benutzer der Website, aber gefälscht ist.

Verhindern: Stellen Sie im Allgemeinen sicher, dass der Benutzer aus Ihrem Formular stammt und mit allen übereinstimmt Das Formular, das Sie verschickt haben. Zwei Dinge, die Sie beachten sollten: Verwenden Sie geeignete Sicherheitsmaßnahmen für Benutzersitzungen, z. B. die Aktualisierung von IDs für jede Sitzung und die Verwendung von SSL für Benutzer. Generieren Sie ein weiteres einmaliges Token und betten Sie es in das Formular ein, speichern Sie es in der Sitzung (eine Sitzungsvariable) und überprüfen Sie es beim Absenden. Wie zum Beispiel _token in Laravel

Code-Injection: Code-Injection wird durch die Ausnutzung von Computerschwachstellen durch die Verarbeitung ungültiger Daten verursacht. Das Problem tritt auf, wenn Sie versehentlich beliebigen Code ausführen, normalerweise über die Dateieinbindung. Schlecht geschriebener Code kann dazu führen, dass eine Remote-Datei eingebunden und ausgeführt wird. Wie viele PHP-Funktionen kann require eine URL oder einen Dateinamen enthalten.

Verhindern Sie das Einschleusen von Code und filtern Sie Benutzereingaben. Dadurch wird das Erfordern/Einschließen/Öffnen von Remote-Dateien deaktiviert.

14 Was sind die objektorientierten Funktionen?

Dazu gehören hauptsächlich Kapselung, Vererbung und Polymorphismus. Wenn es 4 Aspekte sind, fügen Sie hinzu: Abstraktion.

Kapselung:

Die Kapselung ist die Grundlage, um sicherzustellen, dass Softwarekomponenten eine hervorragende Modularität aufweisen. Das Ziel der Kapselung besteht darin, eine hohe Kohäsion und geringe Kopplung von Softwarekomponenten zu erreichen und die Auswirkungen von Änderungen zu verhindern, die durch gegenseitige Programmabhängigkeit verursacht werden.

Vererbung:

Beim Definieren und Implementieren einer Klasse können Sie dies auf der Grundlage einer vorhandenen Klasse tun. Sie können den von dieser vorhandenen Klasse definierten Inhalt als Ihren eigenen Inhalt verwenden oder mehrere neue hinzufügen Ändern Sie die ursprüngliche Methode, um sie für spezielle Anforderungen besser geeignet zu machen. Dies ist Vererbung. Vererbung ist ein Mechanismus für Unterklassen zum automatischen Austausch von Daten und Methoden der übergeordneten Klasse. Dabei handelt es sich um eine Beziehung zwischen Klassen, die die Wiederverwendbarkeit und Skalierbarkeit von Software verbessert.

Polymorphismus:

Polymorphismus bedeutet, dass der spezifische Typ, auf den die im Programm definierte Referenzvariable zeigt, und der über die Referenzvariable ausgegebene Methodenaufruf nicht während der Programmierung, sondern während der Ausführung des Programms bestimmt werden Auf welches Klasseninstanzobjekt eine Referenzvariable verweist und welche Klasse den von der Referenzvariablen ausgegebenen Methodenaufruf implementiert, muss während der Ausführung des Programms ermittelt werden.

Abstraktion:

Abstraktion besteht darin, die Ähnlichkeiten und Gemeinsamkeiten einiger Dinge herauszufinden und diese Dinge dann in eine Klasse einzuteilen. Diese Klasse berücksichtigt nur die Ähnlichkeiten und Gemeinsamkeiten dieser Dinge und ignoriert das aktuelle Thema und diese Aspekte die für das Ziel irrelevant sind, konzentrieren Sie sich auf diejenigen Aspekte, die für das aktuelle Ziel relevant sind. Wenn Sie beispielsweise eine Ameise und einen Elefanten sehen und sich vorstellen können, wie ähnlich sie sind, handelt es sich um Abstraktion.

15 ​​​​Welche Methoden gibt es zur Optimierung von SQL-Anweisungen? (Wählen Sie einige aus)

(1) In der Where-Klausel: Die Verbindung zwischen Where-Tabellen muss vor anderen Where-Bedingungen geschrieben werden, und jene Bedingungen, die die maximale Anzahl von Datensätzen herausfiltern können, müssen am Ende der Where-Klausel geschrieben werden HAVING ist die letzte Klausel.

(2) Ersetzen Sie IN durch EXISTS und NOT IN durch NOT EXISTS.

(3) Vermeiden Sie die Verwendung von Berechnungen für Indexspalten.

(4) Vermeiden Sie die Verwendung von IS NULL und IS NOT NULL für Indexspalten.

(5) Um Abfragen zu optimieren, sollten vollständige Tabellenscans so weit wie möglich vermieden werden Erstellen Sie Indizes für die Spalten, die an „wo“ beteiligt sind, und sortieren Sie nach.

(6) Vermeiden Sie es, Nullwerturteile zu Feldern in der Where-Klausel zu fällen, da die Engine sonst die Verwendung des Index aufgibt und einen vollständigen Tabellenscan durchführt.

(7) Versuchen Sie zu vermeiden, Ausdrücke zu Feldern in der Where-Klausel zu machen Dies führt dazu, dass die Engine die Verwendung des Index aufgibt und einen vollständigen Tabellenscan durchführt

16 Die MySQL-Datenbank wird als Speicher des Veröffentlichungssystems verwendet. Der Zuwachs von mehr als 50.000 Elementen pro Tag wird auf drei Jahre Betrieb und Wartung geschätzt.

(1) Entwerfen Sie eine gut gestaltete Datenbankstruktur, ermöglichen Sie teilweise Datenredundanz und versuchen Sie, Join-Abfragen zu vermeiden, um die Effizienz zu verbessern.

(2) Wählen Sie den entsprechenden Tabellenfelddatentyp und die Speicher-Engine aus und fügen Sie die Indizes entsprechend hinzu.

(3) Führen Sie eine Lese-/Schreibtrennung bei der MySQL-Master-Slave-Replikation durch.

(4) Teilen Sie die Datentabelle in Tabellen auf, um die Datenmenge in einer einzelnen Tabelle zu reduzieren und die Abfragegeschwindigkeit zu verbessern.

(5) Fügen Sie einen Caching-Mechanismus hinzu, z. B. Redis, Memcached usw.

(6) Generieren Sie statische Seiten für Seiten, die sich nicht häufig ändern (z. B. Ob-Caching).

(7) Schreiben Sie effizientes SQL. Beispielsweise wird SELECT * FROM TABEL in SELECT field_1, field_2, field_3 FROM TABLE geändert.

17 Welche Methode verwenden Sie bei Websites mit hohem Datenverkehr, um das Problem der Statistik von Seitenbesuchen zu lösen?

(1) Bestätigen Sie, ob der Server den aktuellen Datenverkehr unterstützen kann.

(2) Datenbankzugriff optimieren.

(3) Verbieten Sie den externen Zugriff auf Links (Hotlinking), wie z. B. das Hotlinking von Bildern.

(4) Herunterladen der Kontrolldatei.

(5) Führen Sie einen Lastausgleich durch und verwenden Sie verschiedene Hosts zum Auslagern.

(6) Nutzen Sie Browsing-Statistiksoftware, um die Anzahl der Besuche zu verstehen und gezielte Optimierungen durchzuführen.

18 Erzählen Sie mir, wie Sie den Unterschied zwischen MyISAM und InnoDB in der MySQL-Engine verstehen?

InnoDB und MyISAM sind die beiden am häufigsten verwendeten Tabellentypen bei der Verwendung von MySQL. Beide Tabellentypen haben je nach spezifischer Anwendung ihre eigenen Vor- und Nachteile. Der grundlegende Unterschied besteht darin, dass der MyISAM-Typ keine erweiterte Verarbeitung wie die Transaktionsverarbeitung unterstützt, während dies beim InnoDB-Typ der Fall ist. Die MyISAM-Typtabelle legt Wert auf Leistung und ihre Ausführungszeiten sind schneller als die des InnoDB-Typs, bietet jedoch keine Transaktionsunterstützung, während InnoDB Transaktionsunterstützung und erweiterte Datenbankfunktionen wie Fremdschlüssel bereitstellt.

Im Folgenden sind einige Details und spezifische Implementierungsunterschiede aufgeführt:

Was ist der Unterschied zwischen MyISAM und InnoDB?

1. Speicherstruktur

MyISAM: Jedes MyISAM wird als drei Dateien auf der Festplatte gespeichert. Der Name der ersten Datei beginnt mit dem Namen der Tabelle und die Erweiterung gibt den Dateityp an. .frm-Dateien speichern Tabellendefinitionen. Die Datendateierweiterung ist .MYD (MYData). Die Erweiterung der Indexdatei ist .MYI (MYIndex).

InnoDB: Alle Tabellen werden in derselben Datendatei (oder mehreren Dateien oder unabhängigen Tabellenbereichsdateien) gespeichert. Die Größe der InnoDB-Tabelle ist nur durch die Größe der Betriebssystemdatei begrenzt, die im Allgemeinen 2 GB beträgt.

2. Speicherplatz

MyISAM: Es kann komprimiert werden und hat weniger Speicherplatz. Es werden drei verschiedene Speicherformate unterstützt: statische Tabelle (Standard, aber beachten Sie, dass am Ende der Daten keine Leerzeichen stehen dürfen, da diese entfernt werden), dynamische Tabelle und komprimierte Tabelle.

InnoDB: Benötigt mehr Speicher und Speicherplatz, es wird ein eigener dedizierter Pufferpool im Hauptspeicher zum Zwischenspeichern von Daten und Indizes eingerichtet.

3. Portabilität, Sicherung und Wiederherstellung

MyISAM: Daten werden in Form von Dateien gespeichert und sind daher sehr praktisch für die plattformübergreifende Datenübertragung. Während der Sicherung und Wiederherstellung können Sie Vorgänge für eine Tabelle einzeln ausführen.

InnoDB: Zu den kostenlosen Lösungen gehören das Kopieren von Datendateien, das Sichern von Binlog oder die Verwendung von mysqldump, was relativ mühsam ist, wenn das Datenvolumen Dutzende Gigabyte erreicht.

4. Transaktionsunterstützung

MyISAM: Der Schwerpunkt liegt auf der Leistung. Jede Abfrage ist atomar und ihre Ausführungszeiten sind schneller als beim InnoDB-Typ, sie bietet jedoch keine Transaktionsunterstützung.

InnoDB: Bietet Transaktionsunterstützung, Fremdschlüssel und andere erweiterte Datenbankfunktionen. Transaktionssichere (ACID-konforme) Tabellen mit Transaktions- (Commit), Rollback- (Rollback) und Crash-Recovery-Funktionen.

5. AUTO_INCREMENT

MyISAM: Kann einen gemeinsamen Index mit anderen Feldern erstellen. Die automatisch wachsende Spalte der Engine muss ein Index sein. Wenn es sich um einen kombinierten Index handelt, muss die automatisch wachsende Spalte nicht die erste Spalte sein. Sie kann basierend auf den vorherigen Spalten sortiert und erhöht werden.

InnoDB: InnoDB muss einen Index nur mit diesem Feld enthalten. Die automatisch wachsende Spalte der Engine muss ein Index sein, und wenn es sich um einen zusammengesetzten Index handelt, muss sie auch die erste Spalte des zusammengesetzten Index sein.

6. Tabellensperrenunterschiede

MyISAM: Wenn Benutzer Myisam-Tabellen ausführen, wird die Tabelle automatisch gesperrt kann am Ende der Tabelle neue Daten einfügen.

InnoDB: Die Unterstützung von Transaktionen und Sperren auf Zeilenebene ist das größte Merkmal von innodb. Zeilensperren verbessern die Leistung gleichzeitiger Vorgänge mehrerer Benutzer erheblich. Die Zeilensperre von InnoDB gilt jedoch nur für den Primärschlüssel von WHERE. Jeder Nicht-Primärschlüssel WHERE sperrt die gesamte Tabelle.

7. Volltextindex

MyISAM: unterstützt Volltextindex vom Typ FULLTEXT

InnoDB: unterstützt keinen Volltextindex vom Typ FULLTEXT, aber innodb kann das Sphinx-Plug-in verwenden, um Volltextindex zu unterstützen, und die Wirkung ist besser.

8. Tabellenprimärschlüssel

MyISAM: Ermöglicht die Existenz von Tabellen ohne Indizes und Primärschlüssel sind die Adressen, in denen Zeilen gespeichert werden.

InnoDB: Wenn kein Primärschlüssel oder nicht leerer eindeutiger Index festgelegt ist, wird automatisch ein 6-Byte-Primärschlüssel (für den Benutzer unsichtbar) generiert. Die Daten sind Teil des Primärindex und der zusätzliche Index speichert den Wert des Primärindexes.

9. Die spezifische Anzahl der Zeilen in der Tabelle

MyISAM: Speichert die Gesamtzahl der Zeilen in der Tabelle. Wenn count(*) aus der Tabelle ausgewählt ist, wird der Wert direkt übernommen.

InnoDB: Die Gesamtzahl der Zeilen in der Tabelle wird nicht gespeichert. Wenn Sie „select count(*) from table“ verwenden, wird die gesamte Tabelle durchlaufen, was jedoch nach dem Hinzufügen der Wehr-Bedingung viel Geld verbraucht innodb handhabt es auf die gleiche Weise.

10. CURD-Operation

MyISAM: Wenn Sie eine große Anzahl von SELECTs ausführen, ist MyISAM die bessere Wahl.

InnoDB: Wenn Ihre Daten viele INSERT- oder UPDATE-Operationen durchführen, sollten Sie aus Leistungsgründen eine InnoDB-Tabelle verwenden. DELETE bietet eine bessere Leistung als InnoDB, aber wenn DELETE FROM table verwendet wird, erstellt InnoDB die Tabelle nicht neu, sondern löscht sie Zeile für Zeile. Wenn Sie eine Tabelle mit einer großen Datenmenge in InnoDB löschen möchten, ist dies am besten um den Befehl „Tabelle abschneiden“ zu verwenden.

11. Fremdschlüssel

MyISAM: Nicht unterstützt

InnoDB: Unterstützt

Durch die obige Analyse können Sie grundsätzlich erwägen, InnoDB als Ersatz für die MyISAM-Engine zu verwenden Unterstützung, Speicherverfahren, Ansichten, Sperren auf Zeilenebene usw. Bei viel Parallelität glaube ich, dass die Leistung von InnoDB definitiv viel besser sein wird als die von MyISAM. Darüber hinaus ist keine Tabelle allmächtig. Nur durch die Auswahl des geeigneten Tabellentyps passend zum Geschäftstyp können die Leistungsvorteile von MySQL maximiert werden. Wenn es sich nicht um eine sehr komplexe Webanwendung oder eine unkritische Anwendung handelt, können Sie MyISAM dennoch in Betracht ziehen. Sie können diese spezielle Situation selbst in Betracht ziehen.

19 Der Unterschied zwischen Redis- und Memeche-Cache

Zusammenfassung 1:

1. Datentyp

Redis verfügt über umfangreiche Datentypen und unterstützt Setlist- und andere Typen.

Memcache unterstützt einfache Datentypen und erfordert, dass Kunden komplexe Objekte selbst verarbeiten

2. Persistenz

Redis unterstützt persistenten Datenspeicher Modus

Memcache kann konsistentes Hashing für die Verteilung verwenden

Wertgrößen sind unterschiedlichMemcache ist ein Speichercache, die Länge des Schlüssels beträgt weniger als 250 Zeichen und die Speicherung eines einzelnen Elements beträgt weniger als 1 MB, was nicht der Fall ist geeignet für virtuelle Maschinen

4. Die Datenkonsistenz ist anders

redis verwendet ein Single-Threaded-Modell, um sicherzustellen, dass die Daten in der richtigen Reihenfolge übermittelt werden.

Memcache muss CAS verwenden, um die Datenkonsistenz sicherzustellen. CAS (Check and Set) ist ein Mechanismus zur Sicherstellung der Parallelitätskonsistenz und gehört zur Kategorie der „optimistischen Sperre“. Das Prinzip ist sehr einfach: Versionsnummer nehmen, operieren, Versionsnummer vergleichen, wenn sie konsistent ist, operieren, wenn Es ist inkonsistent, geben Sie jeden Vorgang auf Da nicht alle Daten immer im Speicher gespeichert werden, ist dies der größte Unterschied zu Memcached.

2.Redis unterstützt nicht nur einfache Daten vom Typ k/v, sondern bietet auch die Speicherung von Datenstrukturen wie Liste, Satz und Hash. 3.Redis unterstützt die Datensicherung, also die Datensicherung im Master-Slave-Modus.

4.Redis unterstützt die Datenpersistenz, wodurch Daten im Speicher auf der Festplatte verbleiben und bei einem Neustart erneut geladen werden können, um sie zu verwenden.

Ich persönlich denke, dass der wesentlichste Unterschied darin besteht, dass Redis in vielerlei Hinsicht die Eigenschaften einer Datenbank aufweist oder ein Datenbanksystem ist, während Memcached nur ein einfacher K/V-Cache ist

Zusammenfassung 3:

Der Unterschied zwischen Redis und Memecache ist: Memecache speichert alle Daten im Speicher. Die Daten können die Speichergröße nicht überschreiten auf der Festplatte gespeichert, wodurch sichergestellt wird, dass die Daten auf der Festplatte gespeichert werden.

2. Datenunterstützungstyp:

redis bietet viel mehr Datenunterstützung als Memecache.

3. Das zugrunde liegende Modell ist anders:

Die neue Version von Redis baut den VM-Mechanismus direkt selbst auf, denn wenn das allgemeine System Systemfunktionen aufruft, verschwendet es eine gewisse Zeit zum Verschieben und Anfordern.

4. Verschiedene Betriebsumgebungen:

redis unterstützt derzeit nur Linux, sodass keine Unterstützung für andere Systeme erforderlich ist. Auf diese Weise kann die Energie später besser für die Optimierung der Systemumgebung aufgewendet werden habe einen Patch dafür geschrieben. Aber es wird nicht auf dem Trunk platziert

Memcache kann nur als Cache verwendet werden. Der Inhalt von Cache

Redis kann implementiert werden, was MongoDB etwas ähnelt. Dann kann Redis auch als Cache verwendet werden. Slave kann eingerichtet werden

20 Redis Was sollten wir bei der Verwendung von First-In-First-Out in Nachrichtenwarteschlangen beachten?

Antwort: Normalerweise wird eine Liste verwendet, um Warteschlangenoperationen zu implementieren. Alle Aufgaben werden einheitlich nach dem First-In-First-Out-Prinzip bearbeitet. Dies erfordert, dass die Warteschlange Priorität hat, damit wir Aufgaben auf hoher Ebene priorisieren können mehrere Möglichkeiten, dies zu erreichen:

1)单一列表实现:队列正常的操作是 左进右出(lpush,rpop)为了先处理高优先级任务,在遇到高级别任务时,可以直接插队,直接放入队列头部(rpush),这样,从队列头部(右侧)获取任务时,取到的就是高优先级的任务(rpop)

2)使用两个队列,一个普通队列,一个高级队列,针对任务的级别放入不同的队列,获取任务时也很简单,redis的BRPOP命令可以按顺序从多个队列中取值,BRPOP会按照给出的 key 顺序查看,并在找到的第一个非空 list 的尾部弹出一个元素,redis> BRPOP list1 list2 0

list1 做为高优先级任务队列
list2 做为普通任务队列

这样就实现了先处理高优先级任务,当没有高优先级任务时,就去获取普通任务
方式1  最简单,但实际应用比较局限,方式3可以实现复杂优先级,但实现比较复杂,不利于维护
方式2  是推荐用法,实际应用最为合适

21 Redis如何防止高并发?

答:其实redis是不会存在并发问题的,因为他是单进程的,再多的命令都是一个接一个地执行的。我们使用的时候,可能会出现并发问题,比如获得和设定这一对。Redis的为什么 有高并发问题?Redis的出身决定等

Redis是一种单线程机制的nosql数据库,基于key-value,数据可持久化落盘。由于单线程所以redis本身并没有锁的概念,多个客户端连接并不存在竞争关系,但是利用jedis等客户端对redis进行并发访问时会出现问题。发生连接超时、数据转换错误、阻塞、客户端关闭连接等问题,这些问题均是由于客户端连接混乱造成。

同时,单线程的天性决定,高并发对同一个键的操作会排队处理,如果并发量很大,可能造成后来的请求超时。

在远程访问redis的时候,因为网络等原因造成高并发访问延迟返回的问题。

解决办法

在客户端将连接进行池化,同时对客户端读写Redis操作采用内部锁synchronized。

服务器角度,利用setnx变向实现锁机制。

22 做秒杀用什么数据库,怎么实现的?

答:因为秒杀的一瞬间,并发非常大,如果同时请求数据库,会导致数据库的压力非常大,导致数据库的性能急剧下降,更严重的可能会导致数据库服务器宕机。

这时候一般采用内存高速缓存数据库redis来实现的,redis是非关系型数据库,redis是单线程的,通过redis的队列可以完成秒杀过程。

23 什么情况下使用缓存?

答:当用户第一次访问应用系统的时候,因为还没有登录,会被引导到认证系统中进行登录;根据用户提供的登录信息,认证系统进行身份校验,如果通过校验,应该返回给用户一个认证的凭据--ticket;

用户再访问别的应用的时候,就会将这个ticket带上,作为自己认证的凭据,应用系统接受到请求之后会把 ticket送到认证系统进行校验,检查ticket的合法性。如果通过校验,用户就可以在不用再次登录的情况下访问应用系统2和应用系统3了。

实现主要技术点:

1、两个站点共用一个数据验证系统

2、主要通过跨域请求的方式来实现验证及session处理。

24 如何解决异常处理?

答: 抛出异常:使用try…catch,异常的代码放在try代码块内,如果没有触发异常,则代码继续执行,如果异常被触发,就会 抛出一个异常。Catch代码块捕获异常,并创建一个包含异常信息的对象。$e->getMessage(),输出异常的错误信息。

解决异常:使用set_error_handler函数获取异常(也可以使用try()和catch()函数),然后使用set_exception_handler()函数设置默认的异常处理程序,register_shutdown_function()函数来执行,执行机制是,php要把调入的函数调入到内存,当页面所有的php语句都执行完成时,再调用此函数

25 权限管理(RBAC)的实现?

1.首先创建一张用户表:id name auto(保存格式为:控制器-方法)

2.然后在后台中创建一个基类控制器,控制器里封装一个构造方法,当用户登陆成功后,使用TP框架中封装好的session函数获取保存在服务器中的session id,然后实例化模型,通过用户id获取保存在数据表中的auth数据,使用explode函数分割获取到的数据,并使用一个数组保存起来,然后使用TP框架中封装好的常量获取当前控制器和方法,然后把他们组装成字符串,使用in_array函数进行判断该数组中是否含有当前获取到的控制器和方法,如果没有,就提示该用户没有权限,如果有就进行下一步操作

26 Wie kann sichergestellt werden, dass Werbeartikel nicht überverkauft werden?

Antwort: Dieses Problem ist bei der Entwicklung aufgetreten. Der Hauptgrund für den Überverkauf ist, dass die Anzahl der aufgegebenen Bestellungen nicht mit der Anzahl der von uns gewünschten Produkte übereinstimmt Dadurch war die Anzahl der Bestellungen jedes Mal höher als die Anzahl unserer Werbeartikel. Damals diskutierte unser Team lange und entwickelte mehrere Pläne, um dies zu erreichen:

Der erste Plan : Vor jeder Bestellung haben wir beurteilt, ob die Menge der Werbeartikel ausreichend war, und durften keine Bestellung aufgeben, wenn diese nicht ausreichte. Wir haben bei der Änderung des Lagerbestands eine Bedingung hinzugefügt und nur den Lagerbestand der Produkte mit Lagerbestand geändert größer als 0. Zu diesem Zeitpunkt haben wir ab für Stresstests verwendet. Wenn die Parallelität 500 übersteigt, tritt die Anzahl der Besuche immer noch auf, wenn sie 2000 überschreitet. Also haben wir es verneint.

Zweite Lösung: Verwenden Sie MySQL-Transaktionen und exklusive Sperren, um das Problem zu lösen. Zuerst wählen wir die Speicher-Engine der Datenbank aus, die mithilfe exklusiver Sperren implementiert wird. Zu Beginn haben wir die gemeinsame Sperre getestet und festgestellt, dass sie immer noch vorhanden ist Es kommt zum Überverkauft-Phänomen. Ein Problem besteht darin, dass die Durchführung von Tests mit hoher Parallelität einen großen Einfluss auf die Leistung der Datenbank hat, einen großen Druck auf die Datenbank ausübt und letztendlich von uns abgelehnt wurde.

Die dritte Option: Dateisperrimplementierung verwenden. Wenn ein Benutzer einen Werbeartikel ergreift, wird zunächst die Dateisperre ausgelöst, um zu verhindern, dass andere Benutzer ihn betreten. Nachdem der Benutzer den Werbeartikel ergreift, wird die Dateisperre entsperrt und andere Benutzer dürfen ihn bedienen. Dies kann das Überverkaufsproblem lösen, verursacht jedoch einen hohen E/A-Overhead für die Datei.

Schließlich haben wir zur Implementierung die Redis-Warteschlange verwendet. Die Anzahl der zu bewerbenden Produkte wird in Redis in einer Warteschlange gespeichert. Immer wenn ein Benutzer ein Werbeprodukt ergreift, wird ein Datenelement aus der Warteschlange gelöscht, um sicherzustellen, dass das Produkt nicht überverkauft wird. Dies ist sehr bequem zu bedienen und äußerst effizient. Letztendlich haben wir diese Methode übernommen, um

27 Flash-Sales im Einkaufszentrum umzusetzen?

Antwort: Eilkäufe und Flash-Sales sind heutzutage ein sehr häufiges Anwendungsszenario. und die Hauptprobleme müssen gelöst werden. Es gibt zwei:

  • Der Druck, der durch hohe Parallelität in der Datenbank verursacht wird

  • Wie man die korrekte Bestandsreduzierung („Überverkauft“-Problem) im Wettbewerb löst

Für Bei der ersten Frage kann man sich leicht vorstellen, Caching zu verwenden, um Eilkäufe abzuwickeln und den direkten Betrieb der Datenbank zu vermeiden, z. B. die Verwendung von Redis.

Für die zweite Frage können wir die Redis-Warteschlange verwenden, um sie zu vervollständigen und die zu verkaufenden Produkte sofort in die Warteschlange zu stellen. Da der Pop-Vorgang atomar ist, werden sie auch dann ausgeführt, wenn viele Benutzer gleichzeitig eintreffen Die Leistung von Dateisperren und -transaktionen nimmt bei Parallelität schnell ab. Es kann jedoch auch vorkommen, dass die Snap-up-Seite statisch ist Zu diesem Zeitpunkt muss ein Benutzer eine Warteschlange und eine Eilergebniswarteschlange hinzufügen.

Bei hoher Parallelität geben Sie den Benutzer in die Warteschlange ein, verwenden Sie eine Thread-Schleife, um einen Benutzer aus der Warteschlange zu entfernen, und ermitteln Sie, ob sich der Benutzer bereits in der Warteschlange für Eilkaufergebnisse befindet wurde aufgeschnappt, andernfalls wird es nicht aufgeschnappt und der Bestand wird um 1 reduziert. Datenbank schreiben, den Benutzer in die Ergebniswarteschlange stellen.

28 Wie gehe ich mit Last und hoher Parallelität um?

Antwort: Unter dem Gesichtspunkt niedriger Kosten, hoher Leistung und hoher Skalierbarkeit gibt es die folgenden Lösungen:

1. HTML-Statisierung

Tatsächlich weiß jeder, dass die reine Statik die effizienteste und am wenigsten aufwändige Methode ist HTML-Seiten, daher versuchen wir unser Bestes, statische Seiten für die Seiten auf unserer Website zu verwenden. Diese einfachste Methode ist tatsächlich die effektivste.

2. Trennung von Bildservern

Speichern Sie Bilder separat, um den Overhead von großem Datenverkehr wie Bildern zu minimieren. Sie können auf einigen verwandten Plattformen platziert werden, z. B. auf einem Bullen usw.

3 und Bibliothekstabellen-Hashing und Cache

Die gleichzeitige Verbindung der Datenbank beträgt 100. Eine Datenbank reicht bei weitem nicht aus. Sie können mit Lese-/Schreibtrennung, Master-Slave-Replikation und Datenbank-Clustering beginnen. Um den Datenbankzugriff zu minimieren, können Sie außerdem Cache-Datenbanken wie Memcache und Redis verwenden.

4. Spiegelung:

Downloads so weit wie möglich reduzieren und unterschiedliche Anfragen auf mehrere Spiegel verteilen.

5. Lastausgleich:

Die maximale Anzahl gleichzeitiger Verbindungen von Apache beträgt 1500. Sie können nur Server hinzufügen, z. B. einen F5-Server. Natürlich sind die Kosten für Hardware relativ hoch, daher beginnen wir oft mit der Software.

Load Balancing baut auf der bestehenden Netzwerkstruktur auf. Es bietet eine kostengünstige, effektive und transparente Methode, um die Bandbreite von Netzwerkgeräten und Servern zu erweitern, den Durchsatz zu erhöhen, die Netzwerkdatenverarbeitungsfunktionen zu stärken und gleichzeitig die Flexibilität des Netzwerks zu verbessern Verfügbarkeit. Derzeit sind Nginx, LVS und HAProxy die am weitesten verbreitete Lastausgleichssoftware.

Lassen Sie uns über die Vor- und Nachteile der folgenden drei Typen sprechen:

Die Vorteile von Nginx sind:

Wenn Sie über der 7. Schicht des Netzwerks arbeiten, können Sie einige Umleitungsstrategien für http-Anwendungen entwickeln B. Domänennamen, Verzeichnisstruktur, seine regulären Regeln sind leistungsfähiger und flexibler als HAProxy, was einer der Hauptgründe dafür ist, dass Nginx allein aufgrund dessen in weit mehr Situationen ausgenutzt werden kann als LVS.

Nginx ist sehr wenig von der Netzwerkstabilität abhängig, solange es gepingt werden kann. Dies ist im Gegenteil auch eine größere Abhängigkeit von der Netzwerkstabilität Ich bin mir dessen sehr bewusst.

Nginx ist relativ einfach zu installieren und zu konfigurieren und einfacher zu testen. Es kann grundsätzlich Fehler in Protokollen ausdrucken. Die Konfiguration und das Testen von LVS dauern relativ lange und LVS ist stark auf das Netzwerk angewiesen.

Es hält einem hohen Lastdruck stand und ist stabil. Wenn die Hardware nicht schlecht ist, kann es im Allgemeinen Zehntausende Parallelität unterstützen, und der Lastgrad ist relativ geringer als bei LVS.

Nginx kann interne Serverausfälle über Ports erkennen, z. B. Statuscodes, Zeitüberschreitungen usw., die vom Server bei der Verarbeitung von Webseiten zurückgegeben werden, und sendet Anfragen, die Fehler zurückgeben, erneut an einen anderen Knoten. Der Nachteil besteht jedoch darin, dass dies nicht unterstützt wird URL-Erkennung. Wenn der Benutzer beispielsweise eine Datei hochlädt und der Knoten, der den Upload verarbeitet, während des Upload-Vorgangs fehlschlägt, schaltet Nginx den Upload zur erneuten Verarbeitung auf einen anderen Server um und LVS wird direkt getrennt, wenn eine große Datei hochgeladen wird Wichtige Dateien, Benutzer können unzufrieden sein.

Nginx ist nicht nur eine hervorragende Load-Balancer-/Reverse-Proxy-Software, sondern auch ein leistungsstarker Webanwendungsserver. LNMP ist in den letzten Jahren auch eine sehr beliebte Webarchitektur und seine Stabilität ist auch in Umgebungen mit hohem Datenverkehr sehr gut.

Nginx wird als Web-Reverse-Beschleunigungs-Cache immer ausgereifter und ist schneller als der herkömmliche Squid-Server. Sie können ihn als Reverse-Proxy-Beschleuniger verwenden.

Nginx kann als Reverse-Proxy auf mittlerer Ebene verwendet werden. Der einzige, der mit Nginx mithalten kann, ist lighttpd Die Konfiguration ist nicht so klar und leicht zu lesen. Community-Informationen sind auch weitaus weniger aktiv als bei Nginx.

Nginx kann auch als statischer Webseiten- und Bildserver verwendet werden und seine Leistung in diesem Bereich ist unübertroffen. Auch die Nginx-Community ist sehr aktiv und es gibt viele Module von Drittanbietern.

Die Nachteile von Nginx sind:

Nginx kann nur http-, https- und E-Mail-Protokolle unterstützen, daher ist der Anwendungsbereich geringer. Dies ist sein Manko.

Die Gesundheitsprüfung des Back-End-Servers unterstützt nur die Erkennung über Ports und nicht die Erkennung über URLs. Die direkte Beibehaltung der Sitzung wird nicht unterstützt, kann aber über ip_hash gelöst werden.

LVS: Verwenden Sie den Linux-Kernel-Cluster, um einen leistungsstarken, hochverfügbaren Lastausgleichsserver zu implementieren, der über gute Skalierbarkeit (Skalierbarkeit), Zuverlässigkeit (Zuverlässigkeit) und Verwaltbarkeit (Verwaltbarkeit) verfügt.

Die Vorteile von LVS sind:

Starke Lastbeständigkeit, es funktioniert nur zur Verteilung über der 4. Schicht des Netzwerks und es wird kein Datenverkehr generiert. Diese Funktion bestimmt auch die stärkste Leistung in der Lastausgleichssoftware, dem Speicher und Der CPU-Ressourcenverbrauch ist relativ gering.

Die Konfigurierbarkeit ist relativ gering, was sowohl einen Nachteil als auch einen Vorteil darstellt. Da nichts zu viel konfiguriert werden kann, ist nicht zu viel Kontakt erforderlich, was die Wahrscheinlichkeit menschlicher Fehler erheblich verringert.

Es funktioniert stabil, da es eine starke Lastbeständigkeit aufweist und über eine vollständige Hot-Backup-Lösung mit zwei Maschinen verfügt, wie z. B. LVS+Keepalived. Die Lösung, die wir bei der Projektimplementierung am häufigsten verwenden, ist LVS/DR+Keepalived.

Kein Datenverkehr, LVS verteilt nur Anfragen und der Datenverkehr geht nicht von selbst aus. Dadurch wird sichergestellt, dass die Leistung des Balancer-IO nicht durch großen Datenverkehr beeinträchtigt wird.

Es verfügt über ein breites Anwendungsspektrum. Da LVS auf Layer 4 arbeitet, kann es den Lastausgleich für nahezu alle Anwendungen durchführen, einschließlich http, Datenbanken, Online-Chatrooms usw.

Die Nachteile von LVS sind:

Die Software selbst unterstützt die Verarbeitung regulärer Ausdrücke nicht und viele Websites stellen diesbezüglich mittlerweile hohe Anforderungen. Dies ist der Vorteil von Nginx/HAProxy+Keepalived .

Wenn die Website-Anwendung relativ groß ist, ist die Implementierung von LVS/DR+Keepalived komplizierter. Insbesondere wenn sich dahinter ein Windows-Server befindet, ist der Implementierungs-, Konfigurations- und Wartungsprozess relativ kompliziert. HAProxy+Keepalived ist viel einfacher.

HAProxy-Funktionen sind:

HAProxy unterstützt auch virtuelle Hosts.

Die Vorteile von HAProxy können einige der Nachteile von Nginx ergänzen, z. B. die Unterstützung der Sitzungsaufbewahrung und der Cookie-Anleitung. Außerdem unterstützt es die Erkennung des Back-End-Serverstatus durch Abrufen der angegebenen URL.

HAProxy ähnelt LVS, es handelt sich lediglich um eine Lastausgleichssoftware, rein im Hinblick auf die Effizienz. HAProxy hat eine bessere Lastausgleichsgeschwindigkeit als Nginx und ist auch bei der gleichzeitigen Verarbeitung besser als Nginx.

HAProxy unterstützt die Lastausgleichsweiterleitung des TCP-Protokolls. Es kann MySQL-Lesevorgänge ausgleichen und die Backend-MySQL-Knoten erkennen und ausgleichen. Sie können LVS+Keepalived für den Lastausgleich zwischen MySQL-Master und -Slave verwenden.

HAProxy verfügt derzeit über viele Lastausgleichsalgorithmen:

① Roundrobin, was einfache Abfragen bedeutet,

② static -rr, Es wird empfohlen, auf die Gewichtung zu achten.

③ Leastconn bedeutet, dass die am wenigsten verbundenen Daten zuerst verarbeitet werden ähnelt dem IP_hash-Mechanismus von Nginx. Wir verwenden ihn als Sitzungslösung. Es wird empfohlen, darauf zu achten

⑤ ri, stellt den angeforderten URI dar;

⑥ rl_param, stellt den angeforderten URL-Parameter „balance url_param“ dar, erfordert einen URL-Parameternamen;

⑦ hdr(name), stellt das Sperren jeder HTTP-Anforderung basierend auf dem HTTP-Anforderungsheader dar ;

⑧ RDP-Cookie (Name) bedeutet, jede TCP-Anfrage basierend auf Cookie (Name) zu sperren und zu hashen.

Zusammenfassung des Vergleichs zwischen Nginx und LVS:

Nginx arbeitet auf der 7. Schicht des Netzwerks und kann daher Umleitungsstrategien für die http-Anwendung selbst implementieren, wie z. B. Domänennamen, Verzeichnisstrukturen usw. Im Gegensatz dazu LVS verfügt nicht über diese Funktionen, sodass Nginx allein auf dieser Grundlage in weit mehr Situationen als LVS verwendet werden kann. Diese nützlichen Funktionen von Nginx machen es jedoch anpassbarer als LVS, sodass Sie oft zu viel berühren, berühren und berühren müssen. Auch die Wahrscheinlichkeit menschlich verursachter Probleme wird größer sein.

Nginx ist weniger von der Netzwerkstabilität abhängig, solange der Ping erfolgreich ist und der Webseitenzugriff normal ist. Dies ist ein großer Vorteil von Nginx. Nginx kann auch zwischen internen und externen Netzwerken unterscheiden, was einer einzelnen Maschine mit einer Backup-Leitung entspricht. Derzeit sind die Server in der Dasselbe Netzwerksegment und LVS verwenden den Direktmodus zum Auslagern. Der Effekt ist garantierter.

Beachten Sie außerdem, dass LVS mindestens eine weitere IP beim Hosting-Anbieter beantragen muss, um als visuelle IP verwendet zu werden. Es scheint, dass es seine eigene IP nicht als VIP verwenden kann. Um ein guter LVS-Administrator zu sein, müssen Sie wirklich viel Wissen über die Netzwerkkommunikation nachverfolgen und erlernen, die nicht mehr so ​​einfach ist wie HTTP.

Nginx ist relativ einfach zu installieren und zu konfigurieren und auch sehr bequem zu testen, da es grundsätzlich Fehler in Protokollen ausdrucken kann. Die Installation, Konfiguration und das Testen von LVS dauern relativ lange. In vielen Fällen ist eine erfolgreiche Konfiguration auf Netzwerkprobleme und nicht auf Konfigurationsprobleme zurückzuführen schwieriger zu lösen.

Nginx hält auch hohen Belastungen stand und ist stabil, aber die Belastung und Stabilität ist gering: Nginx verarbeitet den gesamten Datenverkehr und ist daher durch die Maschinen-E/A und die Konfiguration begrenzt.

Nginx kann interne Serverfehler wie Statuscodes, Zeitüberschreitungen usw. erkennen, die vom Server zurückgegeben werden, der Webseiten verarbeitet, und sendet Anforderungen, die Fehler zurückgeben, erneut an einen anderen Knoten. Derzeit kann ldirectd in LVS auch die Überwachung der internen Bedingungen des Servers unterstützen, das Prinzip von LVS verhindert jedoch, dass Anfragen erneut gesendet werden. Wenn der Benutzer beispielsweise eine Datei hochlädt und der Knoten, der den Upload verarbeitet, während des Upload-Vorgangs fehlschlägt, schaltet Nginx den Upload zur erneuten Verarbeitung auf einen anderen Server um und LVS wird direkt getrennt, wenn eine große Datei hochgeladen wird Wichtige Dateien, Benutzer könnten dadurch verärgert sein.

Die asynchrone Verarbeitung von Anforderungen durch Nginx kann dem Knotenserver helfen, die Last zu reduzieren. Wenn Apache zur direkten Bedienung externer Parteien verwendet wird, belegt der Apache-Server viel Speicher und kann nicht freigegeben werden Ein weiterer Nginx wird als Apache-Proxy verwendet. Diese Nginx-Verbindung wird von Nginx blockiert, sodass sich nicht zu viele Anfragen auf Apache häufen, wodurch die Ressourcennutzung erheblich reduziert wird. Die Verwendung von Squid hat in dieser Hinsicht den gleichen Effekt. Auch wenn Squid selbst so konfiguriert ist, dass es nicht zwischenspeichert, ist es für Apache dennoch sehr hilfreich.

Nginx kann http, https und E-Mail unterstützen (die E-Mail-Funktion wird weniger häufig verwendet), und LVS unterstützt diesbezüglich mehr Anwendungen als Nginx. In Bezug auf die Verwendung sollte die vom Front-End verwendete Strategie im Allgemeinen LVS sein, dh der DNS sollte an den LVS-Equalizer weitergeleitet werden. Aufgrund seiner Vorteile eignet sich LVS sehr gut für diese Aufgabe.

Wichtige IP-Adressen werden am besten von LVS gehostet, z. B. Datenbank-IPs, Webservice-Server-IPs usw. Diese IP-Adressen werden mit der Zeit immer häufiger verwendet. Wenn die IP-Adressen geändert werden, kommt es zu Störungen. Daher ist es am sichersten, diese wichtigen IPs zum Hosten an LVS zu übergeben. Der einzige Nachteil besteht darin, dass die Anzahl der erforderlichen VIPs höher ist.

Nginx kann als LVS-Knotenmaschine verwendet werden. Erstens kann es die Funktionen von Nginx nutzen. Zweitens kann es die Leistung von Nginx nutzen. Natürlich können Sie Squid auf dieser Ebene auch direkt verwenden. Die Funktionen von Squid sind viel schwächer als die von Nginx und auch die Leistung ist schlechter als die von Nginx.

Nginx kann auch als Mid-Level-Proxy verwendet werden. Der einzige, der Nginx erschüttern kann, ist lighttpd Die Konfiguration ist nicht so klar und leicht zu lesen. Darüber hinaus ist auch die IP des Agenten der mittleren Ebene wichtig, sodass es für den Agenten der mittleren Ebene die perfekteste Lösung ist, auch über einen VIP und ein LVS zu verfügen.

Die spezifische Anwendung muss im Detail analysiert werden (das tägliche PV beträgt weniger als 10 Millionen), wenn es viele Maschinen gibt, können Sie DNS-Abfragen verwenden Bei großen Websites oder wichtigen Diensten sollten Sie die Verwendung von LVS in Betracht ziehen, wenn die Maschine keine Probleme hat.

Empfohlenes Lernen: „PHP-Video-Tutorial

Das obige ist der detaillierte Inhalt von[Hematemesis] 28 Interviewfragen zur PHP-Kerntechnologie, die Ihnen beim Jobwechsel helfen!. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:公众号-PHP面试题. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen