Les questions d'entretien avancées PHP récemment publiées sont ici ! [Réponse ci-jointe]

藏色散人
Libérer: 2023-04-09 10:28:01
avant
9308 Les gens l'ont consulté

En fait, je travaille encore depuis peu, mais je suis en train de démissionner, j'ai donc posté mon CV mais je ne l'ai pas soumis. Quand j'ai vu les invitations, j'ai interviewé quelques-unes qui me correspondaient parfaitement et j'ai reçu plusieurs offres les unes après les autres. Rappelez-vous une vague de questions d’entretien. Je les ai divisés en catégories, car certains d'entre eux ont également oublié à quel entretien ils se trouvaient. Les questions énumérées étaient toutes des questions impressionnantes, et certains d'entre eux ont oublié. Si la réponse est fausse, veuillez me corriger. (Plus : Résumé des questions d'entretien PHP )

<strong>mysql</strong>

1. Parlez de ce à quoi vous devez prêter attention. lors de l'écriture d'instructions SQL Quels sont les points ?

Réponse :

1. Sélectionnez * question, donnez au client ce dont il a besoin et ne donnez pas de champs supplémentaires. Cette situation peut également empêcher la déclaration qui aurait pu couvrir l'index. pouvoir accéder à l'index de couverture.
2. N'effectuez pas d'opérations de fonction sur les champs de l'instruction de requête, car cela invaliderait l'index.
3. Assurez-vous d'éviter la conversion automatique de type MySQL, par exemple où « 9 » = 9.
4. Essayez de ne pas définir de champs qui autorisent null si possible, car null entraînera une couche de jugement supplémentaire de la part de MySQL.
5. Lors de l'utilisation de like, si le caractère générique % est au début, une analyse complète du tableau sera également effectuée.
Les ajouts sont les bienvenus.

2. Vous venez de parler d'indexation, dites-moi certaines des compétences que vous connaissez en matière d'indexation

Réponse :

1. Créez un index, sinon l'index n'a aucun sens.
2. Lors de la création d'un index de chaîne, faites attention à la taille. Si la longueur de l'index est trop longue, elle prendra plus de place. Vous pouvez l'intercepter de manière appropriée pour l'indexation. . Disposez-le de manière appropriée en fonction de l'entreprise.
3. Lors de l'établissement d'un index commun, vous devez connaître le principe du préfixe le plus à gauche, par exemple (nom, email, téléphone). Au final, les seuls qui peuvent utiliser cet index commun sont (nom), (nom). , e-mail), (nom, e-mail, téléphone), les autres ne peuvent accéder qu'à l'intégralité de la table et l'ordre des index conjoints doit être défini de manière appropriée en fonction de l'entreprise.

3. Quelle est la structure de données sous-jacente de l'index ?

Réponse : arbre B+.

4. Pourquoi utilise-t-on des arbres B+ et non des arbres rouge-noir ou autres ?

Réponse : Vous pouvez utiliser des arbres rouge-noir. Cependant, cela peut rendre la hauteur de l'arborescence trop élevée, ce qui signifie que pour la même requête, davantage d'E/S disque seront effectuées, affectant les performances. Cependant, l'arborescence B+ peut empêcher la hauteur de l'arborescence d'être trop élevée. haut. La réponse à cette question n’est pas très bonne, c’est plus que cela, bienvenue à ajouter.

5. Connaissez-vous le pushdown d'index ?

Essentiellement, il s'agit d'une optimisation pour les index ordinaires qui doivent être renvoyés à la table. Autrement dit, pendant le processus de parcours du pointeur d'index, la couche moteur effectue d'abord des jugements de priorité et filtre. ceux qui ne remplissent pas les conditions. Peuvent réduire les E/S du disque.

6. Supposons que quelqu'un exploite la base de données et exécute accidentellement une mauvaise instruction et supprime par erreur un grand nombre de données. Peut-elle être restaurée à ce moment-là ? Comment récupérer.

Réponse : Tout d'abord, bin-log doit être activé. S'il n'est pas activé, la récupération peut ne pas être possible. Cela dépend si le système de fichiers spécifique peut être restauré. Lorsque bin-log est activé, le paramètre de type doit être défini sur row ou Mixed, et l'instruction ne peut pas être définie. Ensuite, si une ligne est supprimée par erreur, l'événement de suppression correspondant peut être remplacé par un événement d'insertion et exécuté sur la base de données de secours. Si la table est supprimée par erreur, vous pouvez d'abord obtenir la sauvegarde complète la plus récente, la placer dans la base de données de secours, puis supprimer le bin-log. À l'exception des événements qui ne sont pas supprimés, les autres événements seront rejoués dans l'ordre. .

7. Pourquoi ne peut-il pas être défini sur déclaration ?

Réponse : définissez-le sur instruction. Le journal bin réel stocke les instructions SQL (identifiants de clé primaire supprimés de manière non spécifique). Dans ce cas, s'il s'agit d'une architecture maître-esclave, le maître et l'esclave. l'esclave peut ne pas choisir l'index car l'index sélectionné n'est pas le même. Cela entraîne une incohérence maître-esclave.

8. Vous venez de parler de maître-esclave, alors pouvez-vous parler du mécanisme de fonctionnement maître-esclave

Réponse : Tout d'abord, la bibliothèque principale ? il faut encore activer bin-log et slave. La bibliothèque configure d'abord la bibliothèque principale pour qu'elle soit connectée, change de maître... puis exécute start slave. À ce stade, la bibliothèque esclave créera deux threads, un io_thread, qui est principalement. responsable de la connexion à la base de données principale. Un sql_thread est principalement responsable de l'exécution des instructions de journal de relais. Tout d'abord, la bibliothèque principale reçoit la demande de synchronisation de la bibliothèque esclave et envoie le fichier binaire à la bibliothèque esclave en fonction du nom du fichier bin-log transmis et de l'emplacement où la synchronisation commence. La bibliothèque esclave io_thread est chargée de placer les données reçues. dans le journal de transit, puis sql_thread est responsable de la lecture et de l'analyse de l'exécution à partir du journal de transfert. Lorsque l'exécution est terminée, l'indicateur de position synchronisée est mis à jour.

9. Connaissez-vous le délai maître-esclave ? Parfois, le délai peut être assez long. Que devez-vous faire si vous rencontrez cette situation ?

Réponse : Veuillez faire attention à ce genre de question. Points forts. Lorsqu'un problème survient et que vous recherchez une solution, vous devez prescrire la bonne solution. En d'autres termes, vous pouvez réfléchir à ce problème de cette manière, dans quelles circonstances le retard maître-esclave est provoqué.
1. Si les configurations de la base de données maître et du serveur de base de données esclave sont différentes et que la base de données esclave est différente, le délai peut être allongé. Pour le moment, passez simplement au même serveur de configuration de serveur.
2. La pression sur la bibliothèque esclave est trop forte. Généralement, le système maître-esclave est utilisé et la bibliothèque esclave est essentiellement utilisée pour les requêtes. Par exemple, l'opérateur ou le développeur peut effectuer une série d'opérations SQL sur la bibliothèque esclave. C'est facile. Allouez plusieurs bibliothèques d'esclaves supplémentaires pour partager la pression, un maître et plusieurs esclaves.
3. Les grandes affaires. Par exemple, les instructions de suppression ne doivent pas être limitées par une limite. Si la quantité de données est trop importante, l'exécution de la bibliothèque principale prendra beaucoup de temps, puis sa synchronisation avec la bibliothèque esclave. Cet intervalle de temps est trop long.

<strong>设计模式</strong>

Quels modèles de conception connaissez-vous et les utilisez-vous tous les jours ? Pouvez-vous le décrire en fonction de votre scénario commercial ?

Ici, je vais donner un exemple d'utilisation de Laravel dans la vie quotidienne, qui utilise beaucoup de modèles de conception, tels que façade, combinaison, décoration, observateur... J'apporterai la scène spécifique, puis parlons sur la base de la scène commerciale précédente. Jetons un coup d'œil..., et enfin, j'ai dit que les modèles de conception ne sont pas des solutions miracles. Ce n'est qu'en utilisant le bon modèle dans le bon scénario que sa valeur peut être reflétée.

<strong>手写算法</strong>

Étant donné un tableau trié et une valeur spécifiée, renvoie la position en indice de la valeur spécifiée dans le tableau, si elle n'existe pas , renvoie la position de l'index après avoir inséré la valeur donnée dans le tableau. Faites attention à la complexité temporelle.

Par exemple, étant donné un tableau ordonné [1,3,5,6] et une valeur donnée de 5. Renvoyez ensuite l'indice 2.
Étant donné un tableau ordonné [1,3,5 , 6] Étant donné une valeur de 7, renvoie l'indice 4.

Réponse :

    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;
    }
Copier après la connexion

Généralement, la bissection peut être utilisée et la complexité temporelle est O(log2n). Complexité spatiale O(1).

<strong>网络</strong>

1. Quels sont les principaux protocoles de la couche transport ?

Réponse : Il existe principalement des protocoles TCP et UDP. La différence entre eux est que TCP nécessite une négociation à trois pour se connecter et peut garantir la fiabilité du message. UDP ne nécessite pas de connexion et ne garantit pas la fiabilité des messages.

2. Pouvez-vous parler de la poignée de main à trois de TCP en général ?

Réponse : Tout d'abord, le serveur écoute un certain port et le client lance une demande pour transporter un paquet de données de synchronisation (pour la première fois, le serveur reçoit ce paquet de données et renvoie la synchronisation). /ack au client (la deuxième fois), et enfin le client envoie à nouveau un paquet de données (la troisième fois).

4. Pourquoi une poignée de main à trois est-elle nécessaire ?

Réponse : Principalement pour confirmer si les deux parties reçoivent normalement.
Première fois : Le client ne peut rien confirmer. Le serveur peut confirmer que l'envoi et la réception du client sont normaux, et sa propre réception est normale
La deuxième fois : le client peut confirmer que ses propres envois et réceptions sont normaux, et que l'envoi et la réception du serveur sont normaux. Le serveur peut confirmer qu'il reçoit normalement et que le client envoie normalement.
Troisième fois : Tout peut être confirmé.

并发

Supposons qu'il existe plusieurs entrées qui peuvent être exploitées en même temps en utilisant un seul compte. ne coûte que dix yuans. Quelles méthodes peuvent être utilisées pour éviter des déductions excessives ? Pour les questions ouvertes, tant que cela peut résoudre le problème, c'est une bonne solution. Il n'y a pas de réponse unique.

Réponse : mysql : vous pouvez directement utiliserwhere montant>=current_amount et montant>0... , ou un verrouillage pessimiste pour la mise à jour. redis:script lua. Au niveau PHP, vous pouvez utiliser les verrous de fichiers et les fonctionnalités de file d'attente. Il n'y a qu'un seul point de consommation.

<code><strong>设计</strong>Conception

Si de nombreux projets dans notre entreprise ont des fonctions de connexion, comment les concevoir ? ?

Réponse : Cette connexion doit être développée séparément en tant que module, similaire au centre de connexion. Toutes les autres connexions du sous-système doivent être authentifiées à partir de ce système.

<strong>其他</strong>

Autres

1 Vérifiez si vous avez mentionné l'utilisation de swoole dans votre projet, écrivez quelque chose. aussi Allez, peux-tu me dire la différence entre leurs coroutines ?

Réponse : Leur conception est la même. La principale différence est le mode de planification de la coroutine. Le planificateur de coroutines de Swoole est monothread et le planificateur de coroutines de Go est multithread. Cela signifie que swoole n'a qu'une seule coroutine exécutée en même temps, tandis que go peut avoir plusieurs coroutines exécutées en même temps. Par conséquent, il n’est pas nécessaire de verrouiller les variables globales dans la coroutine swoole. De plus, swoole est essentiellement monothread et multi-processus, ce qui signifie qu'il n'a pas de variables super-globales, seulement des variables au niveau du processus. Quant au multi-threading, le multi-threading aura inévitablement le problème des verrouillages de variables critiques. Bien sûr, go fournit également des verrous de synchronisation en lecture-écriture prêts à l'emploi, ou vous pouvez utiliser les canaux directement à la place.

2. Pouvez-vous parler du modèle de planification GMP de Go ?

Réponse : Balabala pendant longtemps, j'avais l'impression de ne pas l'expliquer clairement. Eh bien, je ne le comprends pas très bien. À ce moment-là, je suppose que dans l'esprit de l'intervieweur, cela aurait été fini s'il avait simplement dit qu'il ne savait pas

3. Parlez-moi de la partie la plus difficile de votre projet et comment. l'as-tu résolu ?

Cela dépend de votre maîtrise du projet et de la valeur du projet.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:learnku.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!