Heim  >  Artikel  >  Backend-Entwicklung  >  Hier finden Sie frisch veröffentlichte PHP-Interviewfragen für Fortgeschrittene! [Antwort beigefügt]

Hier finden Sie frisch veröffentlichte PHP-Interviewfragen für Fortgeschrittene! [Antwort beigefügt]

藏色散人
藏色散人nach vorne
2020-07-22 13:37:059183Durchsuche

Eigentlich arbeite ich noch vor kurzem, aber ich bin dabei, zu kündigen, also habe ich meinen Lebenslauf gepostet, ihn aber nicht eingereicht. Als ich die Einladungen sah, führte ich ein Vorstellungsgespräch mit einigen, die sehr gut zu mir passten, und bekam nacheinander mehrere Angebote. Erinnern Sie sich an eine Welle von Interviewfragen. Ich habe sie nach Kategorien unterteilt, da einige von ihnen auch vergessen haben, an welchem ​​Interview sie teilgenommen haben. Die aufgelisteten Fragen waren allesamt beeindruckende Fragen, und einige von ihnen haben es vergessen. Wenn die Antwort falsch ist, korrigieren Sie mich bitte. (Mehr: Zusammenfassung der PHP-Interviewfragen )

<strong>mysql</strong>

1. Sprechen Sie darüber, worauf Sie achten müssen Was sind die Punkte beim Schreiben von SQL-Anweisungen?

Antwort:

1. Wählen Sie * Frage aus, geben Sie dem Client alles, was er benötigt, und geben Sie keine zusätzlichen Felder an. Diese Situation kann auch dazu führen, dass die Aussage, die den Index hätte abdecken können, nicht angezeigt wird in der Lage sein, zum Deckungsindex zu gelangen.
2. Führen Sie keine Funktionsoperationen für Abfrageanweisungsfelder aus, da dies den Index ungültig macht.
3. Vermeiden Sie unbedingt die automatische Typkonvertierung von MySQL, z. B. „9“ = 9.
4. Versuchen Sie, nach Möglichkeit keine Felder festzulegen, die Null zulassen, da Null eine zusätzliche Beurteilungsebene durch MySQL verursacht.
5. Wenn bei Verwendung von „like“ das Platzhalterzeichen % vorne steht, wird auch ein vollständiger Tabellenscan durchgeführt.
Ergänzungen sind willkommen.

2. Sie haben gerade über die Indizierung gesprochen. Erzählen Sie mir einige der Fähigkeiten, die Sie über die Indizierung kennen.

Antwort:

1. Erstellen Sie einen Index, sonst ist der Index bedeutungslos.
2. Achten Sie beim Erstellen eines String-Index auf die Größe. Wenn die Indexlänge zu lang ist, kann sie entsprechend abgefangen werden. Der Nachteil besteht darin, dass Sie den abdeckenden Index nicht verwenden können . Ordnen Sie es entsprechend dem Unternehmen an.
3. Wenn Sie einen gemeinsamen Index erstellen, müssen Sie das Präfixprinzip ganz links kennen. Am Ende können nur (Name), (Name) verwendet werden , E-Mail), (Name, E-Mail, Telefon), andere können nur auf die gesamte Tabelle zugreifen und die Reihenfolge der gemeinsamen Indizes muss je nach Unternehmen entsprechend festgelegt werden.

3. Welche Datenstruktur liegt dem Index zugrunde?

Antwort: B+ Baum.

4. Warum werden B+-Bäume verwendet und nicht rot-schwarze Bäume oder andere?

Antwort: Sie können rot-schwarze Bäume verwenden. Dies kann jedoch dazu führen, dass die Höhe des Baums zu hoch ist, was bedeutet, dass für dieselbe Abfrage mehr Festplatten-E/A ausgeführt wird, was sich auf die Leistung auswirkt. Der B+-Baum kann jedoch dazu führen, dass die Höhe des Baums zu hoch ist hoch. Die Antwort auf diese Frage ist nicht sehr gut, es ist mehr als das, gerne hinzufügen.

5. Kennen Sie sich mit Index-Pushdown aus?

Im Wesentlichen handelt es sich um eine Optimierung für normale Indizes, die an die Tabelle zurückgegeben werden müssen. Das heißt, während des Durchlaufs des Indexzeigers trifft die Engine-Ebene zunächst einige Prioritätsbeurteilungen und filtert sie heraus diejenigen, die die Bedingungen nicht erfüllen, können die Festplatten-IO reduzieren.

6. Angenommen, jemand betreibt die Datenbank und führt versehentlich die falsche Anweisung aus und löscht versehentlich viele Daten. Kann sie zu diesem Zeitpunkt wiederhergestellt werden? So erholen Sie sich.

Antwort: Zunächst muss Bin-Log aktiviert sein. Wenn es nicht aktiviert ist, ist möglicherweise keine Wiederherstellung möglich. Es hängt davon ab, ob das spezifische Dateisystem wiederhergestellt werden kann. Wenn Bin-Log aktiviert ist, muss die Typeinstellung auf „row“ oder „mixed“ festgelegt werden und die Anweisung kann nicht festgelegt werden. Wenn dann versehentlich eine Zeile gelöscht wird, kann das entsprechende Löschereignis durch ein Einfügeereignis ersetzt und in der Standby-Datenbank ausgeführt werden. Wenn die Tabelle versehentlich gelöscht wird, können Sie zunächst die neueste vollständige Sicherung abrufen, sie in die Standby-Datenbank einfügen und dann das Bin-Protokoll herausnehmen. Mit Ausnahme der Ereignisse, die nicht gelöscht werden, werden andere Ereignisse wiedergegeben Sequenz.

7. Warum kann es nicht auf „Anweisung“ eingestellt werden?

Antwort: Setzen Sie es auf Anweisung. Das eigentliche Bin-Protokoll speichert SQL-Anweisungen (nicht spezifisch gelöschte Primärschlüssel-IDs). In diesem Fall handelt es sich um eine Master-Slave-Architektur Der Slave wählt den Index möglicherweise nicht aus, da der ausgewählte Index nicht derselbe ist. Dies führt auch zu einer Master-Slave-Inkonsistenz.

8. Sie haben gerade über den Master-Slave-Betrieb gesprochen.

Antwort: Zunächst die Hauptbibliothek Bin-Log muss noch aktiviert werden, und die Slave-Bibliothek stellt zuerst die zu verbindende Hauptbibliothek ein, ändert den Master ... und führt dann den Start-Slave aus. Zu diesem Zeitpunkt erstellt die Slave-Bibliothek zwei Threads, einen io_thread, der hauptsächlich ist Verantwortlich für die Verbindung zur Hauptdatenbank. Ein sql_thread ist hauptsächlich für die Ausführung von Relay-Log-Anweisungen verantwortlich. Zunächst empfängt die Hauptbibliothek die Synchronisierungsanforderung von der Slave-Bibliothek und sendet die Binärdatei entsprechend dem übergebenen Bin-Log-Dateinamen und dem Speicherort, an dem die Synchronisierung beginnt. Die Slave-Bibliothek io_thread ist für die Speicherung der empfangenen Daten verantwortlich in das Transitprotokoll, und dann ist sql_thread dafür verantwortlich, die Ausführung aus dem Übertragungsprotokoll zu lesen und zu analysieren. Wenn die Ausführung abgeschlossen ist, wird das Flag für die synchronisierte Position aktualisiert.

9. Kennen Sie die Master-Slave-Verzögerung? Manchmal kann die Verzögerung recht lang sein. Was sollten Sie tun, wenn Sie auf diese Situation stoßen?

Antwort: Bitte beachten Sie diese Art von Frage. Machen Sie wichtige Punkte. Wenn ein Problem auftritt und Sie nach einer Lösung suchen, müssen Sie die richtige Lösung vorschreiben. Mit anderen Worten, Sie können auf diese Weise über die Umstände nachdenken, unter denen die Master-Slave-Verzögerung verursacht wird.
1. Wenn die Konfigurationen der Master-Datenbank und des Slave-Datenbankservers unterschiedlich sind und die Slave-Datenbank unterschiedlich ist, kann sich die Verzögerungszeit verlängern. Wechseln Sie zu diesem Zeitpunkt einfach zum gleichen Serverkonfigurationsserver.
2. Der Druck auf die Sklavenbibliothek ist zu groß. Im Allgemeinen wird das Master-Slave-System verwendet, und die Slave-Bibliothek wird grundsätzlich für Abfragen verwendet. Beispielsweise kann der Bediener oder Entwickler eine Reihe von SQL-Operationen für die Slave-Bibliothek ausführen. Das ist einfach. Weisen Sie mehrere weitere Slave-Bibliotheken zu, um den Druck zu teilen, einen Master und mehrere Slaves.
3. Große Angelegenheiten. Beispielsweise sollten Löschanweisungen nicht durch ein Limit begrenzt werden. Wenn die Datenmenge zu groß ist, dauert es lange, bis die Hauptbibliothek ausgeführt und dann mit der Slave-Bibliothek synchronisiert wird.

<strong>设计模式</strong>

Welche Designmuster kennen Sie und verwenden Sie sie täglich? Können Sie es anhand Ihres Geschäftsszenarios beschreiben?

Hier werde ich ein Beispiel für die Verwendung von Laravel im täglichen Leben geben, das viele Designmuster verwendet, wie z. B. Fassade, Kombination, Dekoration, Beobachter ... Ich werde die spezifische Szene einbringen, Und dann sprechen wir auf der Grundlage der vorherigen Geschäftsszene. Abschließend habe ich gesagt, dass Designmuster keine Allheilmittel sind, wenn man das richtige Muster im richtigen Szenario verwendet.

<strong>手写算法</strong>

Gibt bei einem sortierten Array und einem angegebenen Wert die tiefgestellte Position des angegebenen Werts im Array zurück, falls dieser nicht vorhanden ist , gibt die Indexposition zurück, nachdem der angegebene Wert in das Array eingefügt wurde. Achten Sie auf die zeitliche Komplexität.

Zum Beispiel ein geordnetes Array [1,3,5,6] und ein gegebener Wert von 5. Geben Sie dann Index 2 zurück.
Gegeben ein geordnetes Array [1,3,5 , 6] Geben Sie bei einem Wert von 7 den Index 4 zurück.

Antwort:

    function searchInsert($nums, $target) {
        if (!count($nums))  return 0;
        $l=0;
        $r = count($nums)-1;
        while ($l <= $r){
            $middle = $l + (($r - $l) >> 1);
            if ($nums[$middle] == $target) return $middle;
            if ($nums[$middle] < $target){
                $l = $middle+1;
            }else{
                $r = $middle-1;
            }    
        }
        return $l;
    }

Typischerweise kann Halbierung verwendet werden und die Zeitkomplexität beträgt O(log2n). Raumkomplexität O(1).

<strong>网络</strong>

1 Was sind die wichtigsten Protokolle in der Transportschicht?

Antwort: Es gibt hauptsächlich TCP- und UDP-Protokolle. Der Unterschied besteht darin, dass TCP für die Verbindung einen Drei-Wege-Handshake erfordert und die Zuverlässigkeit der Nachricht gewährleisten kann. UDP erfordert keine Verbindung und garantiert keine Nachrichtenzuverlässigkeit.

2. Können Sie allgemein über den Drei-Wege-Handshake von TCP sprechen?

Antwort: Zuerst lauscht der Server auf einen bestimmten Port und der Client initiiert eine Anfrage zum Transport eines Syn-Datenpakets (zum ersten Mal empfängt der Server dieses Datenpaket und gibt das Syn zurück). /ack-Datenpaket an den Client (zum zweiten Mal) und schließlich sendet der Client erneut ein Bestätigungspaket (zum dritten Mal).

4. Warum ist ein Drei-Wege-Handschlag erforderlich?

Antwort: Hauptsächlich um zu bestätigen, ob beide Parteien normal empfangen.
Erstes Mal: ​​Der Kunde kann nichts bestätigen. Der Server kann bestätigen, dass das Senden und Empfangen des Clients normal ist und dass sein eigener Empfang normal ist
Das zweite Mal: ​​Der Client kann bestätigen, dass sein eigenes Senden und Empfangen normal ist und dass das Senden und Empfangen des Servers normal ist. Der Server kann bestätigen, dass er normal empfängt und der Client normal sendet.
Zum dritten Mal: ​​Alles kann bestätigt werden.

并发

Gehen Sie davon aus, dass mehrere Eingänge gleichzeitig mit einem Konto bedient werden können kostet nur zehn Yuan. Mit welchen Methoden können übermäßige Abzüge vermieden werden? Für offene Fragen gibt es keine einheitliche Antwort, solange das Problem gelöst werden kann.

Antwort: MySQL: Sie können where amount>=current_amount und amount>0... direkt verwenden oder eine pessimistische Sperre für die Aktualisierung. redis:lua-Skript. Auf PHP-Ebene können Sie Dateisperren und Warteschlangenfunktionen verwenden. Es gibt nur einen Verbrauchsausgang.

<code><strong>设计</strong>Design

Wenn viele Projekte in unserem Unternehmen über Anmeldefunktionen verfügen, wie gestaltet man diese? ?

Antwort: Dieses Login muss separat als Modul entwickelt werden, ähnlich wie das Login-Center. Alle anderen Subsystem-Logins müssen von diesem System aus authentifiziert werden.

<strong>其他</strong>

Andere

1. Schreiben Sie etwas auf, wenn Sie die Verwendung von Swoole in Ihrem Projekt erwähnt haben too Go, kannst du über den Unterschied zwischen ihren Coroutinen sprechen?

Antwort: Sie sind im Design gleich. Der Hauptunterschied ist der Coroutine-Scheduler-Modus. Der Coroutine-Scheduler von Swoole ist Single-Threaded und der Coroutine-Scheduler von Go ist Multi-Threaded. Das bedeutet, dass in Swoole nur eine Coroutine gleichzeitig ausgeführt wird, während in Go mehrere Coroutinen gleichzeitig ausgeführt werden können. Daher ist es nicht erforderlich, globale Variablen in der Swoole-Coroutine zu sperren. Darüber hinaus ist Swoole im Wesentlichen Single-Threaded und Multi-Processing, was bedeutet, dass es keine superglobalen Variablen, sondern nur Variablen auf Prozessebene hat. Was Go-Multithreading betrifft, so wird Multithreading zwangsläufig das Problem kritischer Variablensperren haben. Natürlich bietet Go auch sofort synchrone Lese-/Schreibsperren, oder Sie können stattdessen direkt Kanäle verwenden.

2. Können Sie etwas über das GMP-Planungsmodell von Go sagen?

Antwort: Balabala hatte lange Zeit das Gefühl, dass ich es nicht klar erklärt habe. Nun, ich verstehe es nicht sehr gut. Ich schätze, wenn der Interviewer zu diesem Zeitpunkt einfach gesagt hätte, er wüsste es nicht, wäre es vorbei

3. Erzählen Sie mir vom schwierigsten Teil Ihres Projekts und Wie hast du es gelöst?

Es hängt von Ihrer eigenen Beherrschung des Projekts und dem Wert des Projekts ab.

Das obige ist der detaillierte Inhalt vonHier finden Sie frisch veröffentlichte PHP-Interviewfragen für Fortgeschrittene! [Antwort beigefügt]. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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