Heim >Backend-Entwicklung >PHP-Tutorial >Teilen Sie die neuesten 28 PHP-Interviewfragen im Jahr 2023 (mit Antworten)
Dieser Artikel stellt 28 PHP-Interviewfragen (mit Antworten) zusammen, um Ihnen beim Sortieren des Grundwissens zu helfen. Ich hoffe, dass er für alle hilfreich ist.
Verwandte Empfehlungen: Sammlung von PHP-Interviewfragen im Jahr 2023 (Sammlung)
Nach dem neuen Jahr habe ich festgestellt, dass ich viele grundlegende Fragen nicht verstanden und studiert habe Ich habe die Fragen im Vorstellungsgespräch vorher gründlich genug gestellt, um mich zu ermutigen, weiterzumachen und sie in Foren und Suchmaschinen zusammenzufassen. Einige der Fragen sind Fragen oder Antworten, die von Senioren im Forum geteilt werden Fragen, auf die ich in den letzten Interviews gestoßen bin, habe ich auf der Grundlage meiner eigenen Erkenntnisse und der Aussagen von Senioren archiviert, sodass ich sie in der Hoffnung weitergebe, dass sie anderen Freunden hilfreich sein werden. Ich hoffe auch, Rat von den Großen zu erhalten Zu den Missverständnissen werde ich in naher Zukunft weiter aktualisieren
hash-Tabelle speichert den Zeiger der aktuellen Schleife, sodass foreach schneller ist als für
Bucket: Speichert den Schlüssel und die Summe des Array-Elementwerts und den Hash-Wert h
2. Wird zum Speichern der Indizes von Elementen im tatsächlichen Speicherarray verwendet
3. Elemente werden in der Reihenfolge der Zuordnungstabelle in das tatsächliche Speicherarray eingefügt
4. Die Zuordnungstabelle ist einfach Tatsächlich gibt es keine tatsächliche Zuordnungstabelle. Wenn der Bucket-Speicher während der Initialisierung zugewiesen wird, wird auch die gleiche Menge an uint32_t-Speicherplatz zugewiesen, und dann wird arData an den Ort verschoben, an dem sich das Elementarray befindet gelagert.
2. Offene Adressierungsmethode: Wenn das Schlüsselwort auf eine Einheit verweist, für die bereits Daten vorhanden sind, suchen Sie weiter nach anderen Einheiten, bis eine verfügbare Einheit gefunden wird (die andere Einheitenpositionen belegt, ist mehr). wahrscheinlich Hash-Konflikte und Leistungseinbußen)
verknüpfte Liste: Element + Zeiger, der auf das nächste Element zeigt
doppelt verknüpfte Liste: Zeiger zeigt auf das vorherige Element + Element + zeigt nach unten. Ein-Element-Zeiger
2. Die zeitliche und räumliche Komplexität der Blasensortierung
$arr = [2, 4, 1, 5, 3, 6]; for ($i = 0; $i < (count($arr)); $i++) { for ($j = $i + 1; $j < (count($arr)); $j++) { if ($arr[$i] <= $arr[$j]) { $temp = $arr[$i]; $arr[$i] = $arr[$j]; $arr[$j] = $temp; } } } result : [6,5,4,3,2,1]
Erste Runde: Vergleichen Sie das erste Element des Arrays mit allen anderen Elementen Element größer ist, ändern Sie die Reihenfolge und blasen Sie dann das erste Element auf
Erste Runde: Vergleichen Sie das zweite Element des Arrays mit allen anderen Elementen (das erste größte Element wurde herausgefiltert und Nr Sie müssen mit dem Vergleichen fortfahren), welches Element auch immer größer ist, ändern Sie die Reihenfolge, wodurch das zweitgrößte Element heraussprudelt
... und so weiter, wobei das Array von groß nach klein sortiert wird
Durchschnittliche Zeitkomplexität: O(n^2) ;
O(n)
, muss eine Entscheidung treffen. Wenn es in der ersten Schleife keinen Austausch gibt, springe aus die Schleife direkt Raumkomplexität: O( 1)
, der von temporären Variablen beim Austausch von Elementen belegte Platz
O(1)
, sortiert, nein müssen Positionen austauschen durch den Algorithmus, da die Leistung verschiedener Maschinen inkonsistent ist, nur eine allgemeine Methode zur Effizienzberechnung) Darstellungsmethode: Big-O-Notation O(n^2)
;
最优时间复杂度:O(n)
,需要加判断,第一次循环如果一次都没有交换就直接跳出循环
空间复杂度:O(1)
,交换元素的时候的临时变量占用的空间
最优空间复杂度:O(1)
Konstante Ordnung O(1)
Lineare Ordnung O(n)
Quadratische Ordnung O(n²)
Kubische Ordnung O(n³)
K-te Ordnung O(n^k)
Exponentielle Ordnung ( 2^ n)
Logarithmische Ordnung O(logN)
Lineare logarithmische Ordnung O(nlogN)
Zeitreplikationstyp:
Beste Zeitkomplexität
Schlechteste Zeitkomplexität
Durchschnitt Zeitkomplexität
Amortisierte Zeitkomplexität
Raumkomplexität: Vollständige asymptotische Raumkomplexität, Schätzung der Nutzung des Computerspeichers (Beschreibung des Trends des vom Algorithmus belegten Speicherplatzes, nicht des tatsächlich belegten Speicherplatzes, das gleiche wie oben)
Referenz:
Ein Artikel über die zeitliche und räumliche Komplexität des Algorithmus
Anwendungsschicht, Präsentationsschicht, Sitzungsschicht, Transport Schicht, Netzwerkschicht, (Daten-) Verbindungsschicht, physikalische Schicht
Speicherroutine:
Erstes Wort: Tabelle-zu-Tabelle-Übertragung (Thing-Chain-Netzwerk)
Erstes Wort: Anwendungsschicht (Anzahl der Vorkommen (mehr, einfach zu Denken Sie daran)
Die ersten vier Vorwärtsrichtungen: sollten ausgedrückt werden – werden übertragen
Die letzten drei Rückwärtsrichtungen: Die Homophonie des Internets der Dinge ist leichter zu merken als das Internet der Dinge
1. Sie sind alle Transportschichtprotokolle
2. TCP
ist verbindungsorientiert und kann daher nur eins-zu-eins
orientiert sein Übertragung
Daten sind zuverlässig und gehen nicht verloren
Vollduplex-Kommunikation
3. UDP (umgekehrt gemäß TCP-Eigenschaften)
Keine Verbindung, unterstützt Eins-zu-Eins , eins-zu-viele, viele-zu-viele
Orientiert an der Wärmeerhaltungsübertragung
Der Header-Overhead ist gering, die Daten sind nicht unbedingt zuverlässig, aber die Geschwindigkeit ist schneller
1. Drei-Wege-Handshake:
1) Zum ersten Mal: Client sendet SYN = 1, seq = client_isn
Funktion:
Client: Keine
Server: Bestätigen Sie seine eigene Empfangsfunktion und die Sendefunktion des Clients
2) Zweites Mal: Server sendet SYN = 1. SEQ = Server_ISN, ACK = Client_isn +1
:
3) Das dritte Mal: Der Client sendet SYN = 0, ACK = server_isn+1,seq =client_isn+1
2. Viermal winken
1) Das erste Mal: Der Client sendet FIN
2) Zweites Mal: Der Server sendet ACK
3) Das dritte Mal : Der Server sendet FIN
4) Das vierte Mal: Der Client sendet ACK
30 2: Temporäre mobile
400 fehlerhafte Anfrage: Syntaxfehler der Clientanfrage
401 nicht autorisiert: Der Client hat keine Berechtigung
403 verboten: Der Server lehnt die Client-Anfrage ab
404 nicht gefunden: Die vom Client angeforderte Ressource existiert nicht
500 Interner Serverfehler: Interner Serverfehler
502 Schlechtes Gateway: Wenn ein Server, der als Gateway oder Proxy arbeitet, versucht, eine Anfrage auszuführen, wird eine ungültige Antwort vom Upstream-Server empfangen
503 Überlastung des Dienstes nicht verfügbar oder Systemwartung
504 Gateway-Timeout: Gateway-Timeout
Gründe und Lösungen für 3, 502
Ursache: Nginx hat die Anfrage an das Gateway (php-fpm) gesendet, um die Ausnahme zu behandeln, was zu
1) Fastcgi-Puffereinstellung führt zu klein
fastcgi_buffers 8 16k; code><code>fastcgi_buffers 8 16k;
fastcgi_buffer_size 32k;
2)php-cgi的进程数设置过少
查看FastCgi进程数:netstat -anpo | grep "php-cgi"| wc -l
调整参数最大子进程数:max_children
一般按照单个进程20M计算需要需要设置的子进程数
3)max_requests(内存溢出或频繁重启)
参数指明每个children最多能处理的请求数量,到达最大值之后会重启children。
设置过小可能导致频繁重启children:
php将请求轮询给每个children,在大流量的场景下,每一个children 到达最大值的时间差不多,如果设置过小可能多个children 在同一时间关闭,nginx无法将请求转发给php-fpm,cpu降低,负载变高。
设置过大可能导致内存泄露
4)php执行时间超过nginx等待时间
fastcgi_connect_timeout
fastcgi_send_timeout
fastcgi_read_timeout
5)fastcgi执行时间
max_execution_time
fastcgi_buffer_size 32k;
2) Die Anzahl der PHP-CGI-Prozesse ist zu niedrig eingestellt
Überprüfen Sie die Anzahl der FastCgi-Prozesse :netstat -anpo |. grep "php-cgi"|. wc - l
Passen Sie die maximale Anzahl untergeordneter Prozesse an:
Im Allgemeinen die Anzahl der untergeordneten Prozesse Der Wert, der eingestellt werden muss, wird auf der Grundlage eines einzelnen Prozesses von 20 Mio. berechnet. Der Parameter gibt die maximale Anzahl von Anfragen an, die jedes Kind verarbeiten kann. Kinder werden nach Erreichen des Maximalwerts neu gestartet .max_children
zu read_timeout G5) Fastcgi-Ausführungszeit
max_execution_time
7. Der Unterschied zwischen http und HTTPS
1. Port: http 80; https: 4438. Redis verteilte Sperren und Probleme 1. Implementierung: 1. Sperrung: setnx Probleme (hängt auf, nachdem die Einstellungen nach dem Sperren verfügbar sind)
Redis 2.6.12 oder höher fügt optionale Parameter für die SET-Anweisung hinzu. Dies kann den Befehl setnx ersetzen.Lösung: Starten Sie den Daemon-Prozess und verzögern Sie die Sperre, bis der aktuelle Prozess abläuft.安全4) Einzelpunkt-Instanz-Sicherheitsproblem
2) Andere Prozesssperren sind versehentlich nach Zeitüberschreitung gelöscht. (Bei der Ausführung von Prozess A tritt eine Zeitüberschreitung auf, wodurch die Sperre aufgehoben wird. Zu diesem Zeitpunkt erhält Prozess B die Sperre und beginnt mit der Verarbeitung der Anforderung. Zu diesem Zeitpunkt schließt Prozess A die Verarbeitung ab und die Sperre von Prozess B wird gelöscht Fehler) Lösung: Sie können nur die Sperre Ihres eigenen Prozesses löschen (Lua-Skript verhindert, dass Prozess B versehentlich die Sperre von Prozess A löscht, nachdem er die abgelaufene Sperre erworben hat)
3) Parallelitätsszenario, das Ausführungszeitlimit des Prozesses A bewirkt, dass die Sperre aufgehoben wird, und Prozess B erhält zu diesem Zeitpunkt die Sperre.
Was sollten Sie bei der Implementierung verteilter Sperren in Redis beachten? [Zusammenfassung der Notizen]
9 Warum ist Redis Single-Threaded? Warum schnell?
Empfohlene Lektüre: https://www.php.cn/redis/475918.html
🎜10. Datentypen und Anwendungsszenarien von Redis🎜🎜🎜🎜1. Zeichenfolge: 🎜🎜🎜 gewöhnlicher Schlüssel/Wert Speicher🎜🎜🎜2, Hash:🎜🎜Hashmap: Schlüsselwert-Team-Sammlung, die Objektinformationen speichert
Doppelt verknüpfte Liste: Nachrichtenwarteschlange
HashMap, deren Wert immer null ist: ungeordnete Sammlung und keine Wiederholung : Berechnen Sie Schnittmenge, Vereinigung, Differenzmenge, Deduplizierungswert
5, zset:
Geordneter Satz ohne Duplikation: hashMap (Entfernung von Duplikationen) + Skiplist-Sprungtabelle (garantierte Reihenfolge): Rangliste
Referenz:
5 Datentypen und Anwendungsszenarien von Redis Datensatz auf Festplatte
1) Verzweigen Sie einen Unterprozess und schreiben Sie den Snapshot-Inhalt in eine temporäre RDB-Datei (dump.rdb). Wenn der Unterprozess den Snapshot-Inhalt schreibt, ersetzt die neue Datei die alte Datei
2 ) Die gesamte Redis-Datenbank enthält nur eine Sicherungsdatei 4) Ausfallzeiten vor der Persistenz können zu Datenverlust führen
1) Verwenden Sie jedes Mal, wenn ein Schreibbefehl empfangen wird, die Schreibfunktion, um an die Datei appendonly.aof anzuhängen. 2) Die persistente Datei wird immer größer, es gibt viele redundante Protokolle (0 erhöht sich um das 100-fache auf 100, es werden 100 Protokolldatensätze generiert)3) Verschiedene Fsync-Strategien können eingestellt werden
appendfsync everysec: einmal alle 1s, bis zu 1s Daten gehen verloren (Standard)
appendfsync Always: Wird bei jeder Änderung einmal ausgeführt
appendfsync No: Nicht verarbeitet
4) Die AOF-Datei wird neu geschrieben, wenn sie zu groß ist: Komprimieren Sie die AOF-Dateigröße
4. Verteilte SperreMethode: setnx + Expire (nicht atomar, Set stellt Atomizität nach Redis2.6 sicher) Zeitüberschreitung der Sperre freigeben (automatische Erneuerung des Daemons aktivieren)
5. Cache-Daten
Methode:
Cache-Aufschlüsselung: Aufwärmen der Cache-Daten + Bloom-Filter/leerer Cache
Cache-Lawine: Cache-Einstellungen Zufällige Ablaufzeit, um Ablauf zu verhindern gleichzeitig
6. Lagerbestand und Bestellungen
Lagerbestand abziehen
redis verringert den Lagerbestand selbst, was in gleichzeitigen Szenarien zu negativen Zahlen führen und sich auf die Lagerrendite auswirken kann: Verwenden Sie Lua-Skript, um die Atomizität sicherzustellen
Nachdem Redis den Lagerbestand zurückhält, werden dann asynchrone Nachrichten verwendet, um Bestellungen zu erstellen und Lagerbestandsänderungen zu aktualisieren.
Die Datenbank aktualisiert den Lagerbestand mithilfe einer optimistischen Sperre: wobei stock_num - sale_num > 0
Datensatztabelle für Nachrichtenversand hinzufügen und Wiederholungsmechanismus, um den Verlust asynchroner Nachrichten zu verhindern
Zurück zum Lager
1. Sonderzeichen filtern
3. Überprüfen Sie den Datentyp und das Format.
4. Verwenden Sie den vorkompilierten Modus und binden Sie Variablen Daten: Schmutziges Lesen
Die Transaktion sperrt die aktuell gelesenen Daten nicht
Commit Read: Die gelesenen Daten Zwischen dem Start und dem Ende der Transaktion sind die Daten möglicherweise inkonsistent: Nichtwiederholbarkeit
Die Transaktion verfügt über eine gemeinsame Sperre auf Zeilenebene für die aktuell gelesenen Daten (wenn sie gelesen werden). Lesen Sie die vollständige Freigabe
Wiederholbares Lesen: Die vor Beginn und Ende der Transaktion gelesenen Daten sind konsistent. und andere Transaktionen in der Transaktion können die Daten nicht ändern: kann Wiederholtes Lesen
Die Transaktion fügt den aktuell gelesenen Daten vom Beginn der Transaktion an eine gemeinsame Sperre auf Zeilenebene hinzu
Serialisierung
Fügen Sie bei Transaktionen gemeinsame Sperren auf Tabellenebene hinzu Daten lesen
Ein Datenelement hat mehrere Versionen. Jedes Mal, wenn eine Transaktion Daten aktualisiert, wird eine neue Datenversion generiert. Die alten Daten bleiben erhalten im Undo-Log
Wenn eine Transaktion gestartet wird, sind nur alle übermittelten Transaktionsergebnisse sichtbar
Aktuell gelesen: Die neueste Version lesen
Eine exklusive Sperre auf Zeilenebene wird zum Zeitpunkt der Aktualisierung hinzugefügt, bis die Transaktion freigegeben wird.
Ein Prozess sendet Commit
Der Index ist eine Speicherstruktur, die der Datenbank hilft, Daten effizient zu finden. Sie wird auf der Festplatte gespeichert und erfordert Festplatten-IO
myisam unterstützt Tabellensperren und trennt Indizes und Daten. Der Speicher ist für die serverübergreifende Migration geeignet. Innodb unterstützt Zeilensperren, Indizes und Datenspeicherung in einer Datei. Indextyp: Hash-Index. Geeignet Für präzise Abfragen und hohe Effizienz sind ähnlich). Schlüssel. Ein Festplatten-E/A kann mehr Knoten erhalten. Sowohl interne Knoten als auch Blattknoten müssen keine Blattknoten finden, um Daten direkt zurückzugeben +tree fügt Zeiger von Blattknoten auf benachbarte Knoten hinzu, um das Durchlaufen von Rückabfragen zu erleichtern
Die Vorteile und das Potenzial des gruppierten Index
1. Der Index und die Daten sind zusammen, und die Daten derselben Seite werden im (Puffer-)Speicher zwischengespeichert. Wenn Sie also die Daten derselben Seite anzeigen, müssen Sie sie nur aus dem Speicher entfernen.16. Tabellenpartitionierung (Strategie für Sharding
Horizontale Aufteilung in mehrere Tabellen basierend auf Feldern
Die Struktur jeder Tabelle ist gleich
Die Sammlung aller Untertabellen ist die vollständige Menge
Verwenden Sie verteilte automatische Inkrementierende ID
Erweiterungsproblem
Upgrade der Slave-Datenbank
Doppelte Schreibmigration:
Neue Daten werden doppelt geschrieben und gleichzeitig in die neue und alte Datenbank geschrieben
Serverschicht: Connector->Cache->Analysator (Präprozessor)->Optimierer->Executor
Engine-Schicht: Daten abfragen und speichern
2, Ausführungsprozess auswählen
Der Client sendet eine Anfrage und stellt eine Verbindung her
Die Serverschicht durchsucht den Cache und gibt bei einem Treffer direkt zurück, andernfalls fahren Sie fort
Analyse sieben Analysen von SQL-Anweisungen und Vorverarbeitung (Feldlegalität und -typ überprüfen usw.)
Der Optimierer generiert einen Ausführungsplan.
Der Ausführende ruft die Engine-API auf, um die Ergebnisse abzufragen
Der Pufferpool (Cache-Pool) befindet sich im Speicher. Wenn Sie die Daten derselben Seite das nächste Mal lesen, können Sie sie direkt aus dem Pufferpool (dem Clustered-Index von innodb) zurückgeben.
Aktualisieren Sie den Puffer, wenn Sie Daten aktualisieren Zuerst den Pool und dann die Festplatte aktualisieren
Engine-Benachrichtigung Die Serverschicht beginnt damit Daten übermitteln
Die Serverschicht schreibt das Binlog-Protokoll und ruft die Innodb-Schnittstelle auf, um eine Commit-Anfrage zu stellen.
Die Engine-Schicht sendet das Commit nach Erhalt der Anfrage
Wenn der Redo-Log-Status „Festschreiben“ lautet, senden Sie ihn direkt.
3. Es gibt keinen Eintrag im Bin-Log-Protokoll. Wenn Sie die Daten wiederherstellen müssen, ist der Wert = 9
Schreiben Sie zuerst das Binlog, bevor Sie das Redo-Log schreiben
2. Nach dem Neustart ist kein Redo-Log vorhanden, daher ist der Wert immer noch 9
18. Die Rolle von Binlog und die drei Formate
2. Master-Slave-Replikation
2. Um eine Tabelle zu löschen, müssen Sie nur eine SQL-Anweisung aufzeichnen, und es ist nicht erforderlich, Änderungen in jeder Zeile aufzuzeichnen, wodurch IO eingespart, die Leistung verbessert und die Anzahl der Protokolle reduziert wird.
3 -Slave-Inkonsistenz kann auftreten (gespeicherte Prozeduren, Funktionen usw.)
4. Da die Binlog-Aufzeichnungsreihenfolge in der Transaktions-Commit-Reihenfolge aufgezeichnet wird, kann es zu Inkonsistenzen im Master-Slave kommen Replikation. Dies kann durch die Einführung von Lückensperren auf der Ebene der wiederholbaren Lesevorgänge gelöst werden.
2) Zeile
1. Zeichnen Sie die Änderung jedes Datensatzes auf, ohne den Kontextdatensatz der SQL-Anweisung aufzuzeichnen
2. Dies führt zu einer großen Menge an Binlog-Protokollen
3 Tabelle: Notieren Sie die Situation jedes gelöschten Datensatzes
3) gemischt
1 Eine gemischte Version der ersten beiden Formate
2. Wählen Sie automatisch aus, welches Sie verwenden möchten, basierend auf der Anweisung:
Allgemein: Um die SQL-Anweisung zu ändern, verwenden Sie die Anweisung
, um die Tabellenstruktur, die Funktion, die gespeicherte Prozedur und andere Vorgänge zu ändern. Alle aufgezeichneten Änderungen werden weiterhin aufgezeichnet
Datensicherung, hohe Verfügbarkeit, Single Point of Failure vermeiden
Lese-/Schreibtrennung erreichen und Datenbankdruck entlasten
Upgrade-Test (verwenden Sie eine höhere Version von MySQL als Slave-Bibliothek)
Hybridreplikation
1) Grundlegend Konzepte
Generieren Sie zwei Threads aus der Bibliothek.
E/A-Thread.
SQL-Thread
6 Der Master-Slave-Knoten lokalisiert die Master-Slave-Synchronisation Position durch die Binlog-Datei + Positionsoffset. Wenn der Slave-Knoten ausfällt und neu startet, initiiert er automatisch die Synchronisierung von der Positionsposition.
7 Kopieren und lesen Sie den Inhalt Lokales Relay-Protokoll aus dem SQL-Thread des Knotens, analysieren Sie es in bestimmte Vorgänge und führen Sie diese aus, um die Master-Slave-Datenkonsistenz sicherzustellen1. Kann eine Master-Slave-Inkonsistenz verursachen (Master-Slave-Verzögerung)
3 ist eine globale Variable und der Dienst muss nach der Änderung neu gestartet werden
Die Standard-Replicate-Same-Server-ID = 0, die Slave-Bibliothek überspringt alle Master-Slave-Synchronisierungsdaten, was zu einer Inkonsistenz der Master-Slave-Daten führt führt zur Ausführung einer drahtlosen Schleife in SQL Master-Bibliothek (A) findet die gleiche Server-ID und wird getrennt. Die Verbindung wird erneut registriert.
Die Verbindung der B- und C-Slave-Bibliotheken wird immer wieder neu verbunden.
MySQL-Dienst erstellt und generiert automatisch die Server-UUID-Konfiguration Replicate-Same-Server-ID=1 (nicht empfohlen)
3) Master-Slave-Verzögerung
Die Leistung der Slave-Bibliothek ist schlechter als die der Hauptbibliothek
Ausführung großer Transaktionen: Das Binlog wird erst geschrieben, wenn die Transaktion ausgeführt wird, und die Leseverzögerung der Slave-Bibliothek
Hauptbibliotheks-DDL (Ändern, Löschen, Erstellen)
1. Beenden Sie die Prozesse (töten Sie sie alle)
1. Grund
Methode:
Szenario: Aktualisierungssatzwert = 10, wobei Wert = 9
1) Redis-Update ist erfolgreich: Redis-Wert = 103) Prozess A schließt die Anfrage ab und sendet die Transaktion, schreibt den Cache: Redis-Wert = 10; ; Redis-Wert = 10
3. Löschen Sie zuerst den Cache und aktualisieren Sie dann die Datenbank Szenario: Prozess A aktualisiert den Wert = 9; Prozess B fragt den Wert ab;1) Prozess A löscht zuerst den Cache Dann war keine Zeit, die Daten zu ändern, oder die Transaktion wurde nicht übermittelt.
2) Prozess B begann mit der Abfrage und traf nicht auf den Cache, also überprüfte er die Datenbank und schrieb sie in den Cache. Redis-Wert = 95) Schließlich ist der MySQL-Wert = 10; der Redis-Wert ist leer (überprüfen Sie beim nächsten Mal direkt die Datenbank)
6) Der Grund für die Verzögerung besteht darin, zu verhindern, dass Prozess B in den Cache schreibt
2. Serialisierung anfordern
1) Erstellen Sie zwei Warteschlangen: Aktualisierungswarteschlange und Abfragewarteschlange
2) Wenn die Cache nicht existiert und die Datenbank überprüft werden muss, wird der Schlüssel in der Update-Warteschlange gespeichert
3) Wenn eine neue Anfrage eingeht, bevor die Abfrage abgeschlossen ist, und festgestellt wird, dass der Schlüssel noch in der Update-Warteschlange vorhanden ist , der Schlüssel wird in die Abfragewarteschlange gestellt und gewartet; Wenn er nicht vorhanden ist, wiederholen Sie den zweiten Schritt
4) Wenn die abgefragten Daten feststellen, dass die Abfragewarteschlange bereits vorhanden ist, besteht keine Notwendigkeit, erneut in die Warteschlange zu schreiben
5) Nachdem die Datenaktualisierung abgeschlossen ist, aktualisiert rpop die Warteschlange, und gleichzeitig fragt rpop die Warteschlange ab und gibt die Abfrageanforderung frei.
6) Abfrageanforderungen können while + Sleep verwenden, um den Cache abzufragen und die maximale Verzögerungszeit festzulegen . Wenn es nicht abgeschlossen ist, wird es leer zurückgegeben . pconnect (lange Verbindung): Die Verbindung wird nicht freigegeben, wenn das Skript endet, und ihr Lebenszyklus folgt dem Lebenszyklus des PHP-FPM-Prozesses Die Verbindung wird nicht freigegeben. Es ist nur so, dass Redis im aktuellen PHP-CGI-Prozess nicht erneut angefordert werden kann. Nachfolgende Verbindungen im aktuellen PHP-CGI können weiterhin wiederverwendet werden, bis PHP-FPM den Lebenszyklus beendet
2. Reduzieren Sie den Verbrauch beim Herstellen von Redis-Verbindungen3. Reduzieren Sie die Anzahl der von einem PHP-FPM hergestellten Verbindungen.
4. Verbrauchen Sie mehr Speicher und die Anzahl der Verbindungen steigt weiter
5. Die vorherige Anfrage des Worker-Unterprozesses (php-cgi) kann sich auf die nächste Anfrage auswirken 1; Variable B wählt Datenbank aus 2; wirkt sich auf Variable A aus? Lösung: Jede Datenbank erstellt eine Verbindungsinstanz. 24. Das Prinzip der Verwendung von Skiplist für die Redis-Zset-geordnete Sammlung. 1. Grundkonzept2. Skiplist wird tatsächlich auf der Grundlage geordneter verknüpfter Listen entwickelt und ist mehrschichtig Verknüpfte Listen
4. Jeder Knoten hat einen Rückzeiger mit einer Höhe von 1, der für die Iteration von verwendet wird Kopfrichtung zur Schwanzrichtung
The Die Anzahl der Zeiger für jeden Knoten des ausgeglichenen Baums beträgt 2
3) Einfüge- und Löschvorgänge
skiplist Sie müssen nur die Zeiger benachbarter Knoten ändern der Unterbaum
1. Herkömmliche Strategie zum abgelaufenen Löschen
1) Geplantes Löschen
Verwenden Sie den Timer, um sofort zu löschen, wenn er abläuft
Der Speicher ist Rechtzeitig freigegeben, verbraucht aber mehr CPU. Bei großer Parallelität werden CPU-Ressourcen verbraucht und die Geschwindigkeit der Verarbeitungsanfragen wird beeinträchtigt Überprüfen Sie, ob die Schlüssel abgelaufen sind. Überprüfen Sie, ob sie abgelaufen sind, und löschen Sie sie, wenn Sie sie das nächste Mal herausnehmen müssen. CPU-freundlich verzögertes Löschen + regelmäßiges Löschen, übernommen von Redis
Testen Sie regelmäßig nach dem Zufallsprinzip einige Schlüssel mit zur Überprüfung festgelegter Ablaufzeit und löschen Sie sie nach Ablauf
3. Eliminierungsstrategie (der Speicher reicht nicht aus, um neue Daten zur Ausführungszeit zu schreiben)
volatile-lru: Die Ablaufzeit ist festgelegt und je weniger kürzlich verwendet wurde, desto Priorität wird der Eliminierung gegeben.
volatile-ttl: Die Ablaufzeit ist festgelegt. Je früher die Ablaufzeit liegt, desto Priorität hat die Eliminierung eliminiert
volatile-random : Ablauf wird nach dem Zufallsprinzip festgelegt und rechtzeitig gelöscht
allkeys-lru : Je früher die Ablaufzeit aller Schlüssel ist, desto höher wird die Priorität eliminiert
allkeys-random : Alle Schlüssel werden gelöscht zufällig im Ablauf gelöscht
keine Enviction: Eliminierung ist nicht zulässig, nicht genügend Speicher Fehlerberichterstattung
1. Cache-Lawine: Eine große Anzahl von Cache-Fehlern am Gleichzeitig führt dies dazu, dass Anfragen die Datenbank direkt abfragen, was den Datenbankspeicher und die CPU-Belastung oder sogar Ausfallzeiten erhöht. Lösung: Hotspot-Daten laufen nie ab oder werden auf verschiedene Instanzen verteilt, wodurch Probleme bei Ausfällen einzelner Maschinen reduziert werden Fügen Sie der Cache-Zeit Zufallszahlen hinzu, um zu verhindern, dass eine große Anzahl von Caches gleichzeitig ungültig wird
Führen Sie einen Second-Level-Cache oder einen Double-Cache aus. A ist der ursprüngliche Cache mit kurzer Aktualität, B ist der Backup-Cache, der gültig ist für eine lange Zeit. Doppelter Schreibcache beim AktualisierenVerwenden Sie mehrere verschiedene Hash-Funktionen, um mehrere zu generieren Der Indexwert , geben Sie den Wert ein, der mehreren Positionen entspricht, ist 1
Der Bloom-Filter kann prüfen, ob der Wert „vielleicht in der Menge“ oder „definitiv nicht in der Menge“ ist1) CGI-Protokoll
Die Codedatei der dynamischen Sprache muss das entsprechende übergeben. Der Parser kann vom Server erkannt werden
Das CGI-Protokoll wird verwendet, um dem Server und dem Interpreter die Kommunikation miteinander zu ermöglichen Sonstiges
Der Server benötigt den PHP-Interpreter und das entsprechende CGI-Protokoll, um die PHP-Datei zu analysieren.
php-cgi ist ein CGI-Programm, das dem CGI entspricht Protokoll
und ist auch ein PHP-Interpreter
Standard-CGI analysiert php.ini für jede Anfrage, initialisiert die Ausführungsumgebung usw. und verringert so die Leistung
Jedes Mal, wenn Sie die Konfiguration ändern, müssen Sie dies tun re-php-cgi, damit php.ini wirksam wird
Sie können Arbeiter nicht dynamisch planen, Sie können nur die Anzahl der Arbeiter am Anfang angeben
3) FastCGI-Protokoll
Es ist auch ein Protokoll /standard wie CGI, aber auf Basis von CGI optimiert und effizienter. Es wird zur Verbesserung der Leistung von CGI-Programmen verwendet. 4) FastCGI-Programm = php-fpm php-fpm ist ein FastCGI-Programm, das dem FastCGI-Protokoll entspricht.
Der Verwaltungsmodus des FastCGI-Programms für CGI-Programme. Starten Sie einen Master-Prozess, analysieren Sie die Konfigurationsdatei und initialisieren Sie die Umgebung. Starten Sie mehrere Worker-Sub -Prozesse
Übergeben Sie die Anforderung nach Erhalt zur Ausführung an den Arbeitsprozess.
Neustarttyp
Anmutiger Neustart
Neustart erzwingen
PHP-FPM-Lebenszyklus: https://www.abelzhou.com/php/php-fpm-lifespan/#
Referenz:
Lassen Sie uns über den Kommunikationsmechanismus zwischen PHP-FPM und Nginx sprechen
Eine kurze Analyse Mehrere Timeout-Konfigurationen in der PHP-Konfigurationsdatei
1 1 )TCP-Socket
Serverübergreifend: Wenn sich Nginx und PHP nicht auf demselben Computer befinden, können Sie nur diese Methode verwendenSprechen wir über den Kommunikationsmechanismus zwischen PHP-FPM und Nginx Dieser Artikel analysiert kurz den Kommunikationsmechanismus zwischen Nginx und PHP-FPM. Neunundzwanzig, Web-Schwachstellen und Probleme. 1. SQL-Injection. 2. Wie kann man XSS-Angriffe verhindern? ](https://tech.meituan.com/2018/09/27/fe-security.html)
Empfohlene Lektüre: [Front-End-Sicherheitsserie (2): Anleitung CSRF-Angriffe verhindern? ](https://tech.meituan.com/2018/10/11/fe-security-csrf.html)5. Domänenübergreifende Probleme:
1) jsonp 2) cors
3) Nginx-ProxyEmpfohlenes Lernen: „
PHP-Video Tutorial"
Das obige ist der detaillierte Inhalt vonTeilen Sie die neuesten 28 PHP-Interviewfragen im Jahr 2023 (mit Antworten). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!