1. Une brève introduction au chargement automatique en PHP
Lors de l'utilisation d'une classe en PHP, nous devons la charger avant utilisation, que ce soit via require ou include, mais il y a deux manières. Cette question affecte notre décision de charger. La première est que je ne sais pas où ce fichier de classe est stocké, et l'autre est que je ne sais pas quand je dois utiliser ce fichier. Surtout lorsqu’il y a beaucoup de fichiers de projet, il est impossible d’écrire une longue liste d’exigences au début de chaque fichier.
Mécanisme de chargement automatique, lorsqu'une classe est instanciée via new, PHP chargera le fichier correspondant via la fonction de chargement automatique définie. Si ce fichier de classe utilise extends ou implémente et doit utiliser d'autres fichiers de classe, PHP redémarrera. Exécutez le chargement automatique pour rechercher. et chargez les fichiers de classe. Si deux requêtes pour le même fichier de classe se produisent, une erreur sera signalée.
2. Quels sont les avantages et les inconvénients des variables statiques ?
Caractéristiques des variables locales statiques : 1. Elle ne changera pas au fur et à mesure que la fonction est appelée et se termine. Cependant, bien que la variable continue d'exister, elle ne peut pas être utilisée. Si la fonction qui la définit est à nouveau appelée, elle peut continuer à être utilisée et la valeur restante après l'appel précédent est enregistrée. 2. Les variables locales statiques ne seront initialisées qu'une seule fois. 3. Les propriétés statiques ne peuvent être initialisées qu'avec une valeur de caractère ou une constante, et les expressions ne peuvent pas être utilisées. Même si la variable statique locale est définie sans valeur initiale, le système attribuera automatiquement une valeur initiale de 0 (pour les variables numériques) ou un caractère nul (pour les variables de caractères) ; Lorsqu'une fonction est appelée plusieurs fois et envisagez d'utiliser des variables locales statiques lorsque vous devez conserver la valeur de certaines variables entre les appels. Bien que les variables globales puissent également être utilisées pour atteindre l'objectif ci-dessus, les variables globales provoquent parfois des effets secondaires inattendus, il est donc toujours préférable d'utiliser des variables statiques locales.
3. Quelle est la différence entre strtr et str_replace ? sont utilisés dans Dans quel scénario ?
La fonction str_replace() remplace certains caractères de la chaîne par d'autres caractères (sensible à la casse)
La fonction strtr() convertit des caractères spécifiques dans la chaîne.
La version 5.6 de str_replace est 10+ fois plus efficace que strtr, et la version 7.0 a fondamentalement la même efficacité, mais str_replace de 5.6 est 3 fois plus efficace que 7.0
4. Méthode magique
__construct() : La méthode constructeur par défaut de la classe. Si __construct() et une méthode du même nom que la classe apparaissent ensemble, __construct() sera appelée par défaut à la place de la méthode avec. le même nom.
__call() : Lors de l'appel d'une méthode qui n'existe pas ou qui est inaccessible, la méthode __call($name, $arguments) sera appelée.
__toString() : Sera appelé directement lors de l'impression de l'objet. Tel que echo $object;
__clone() : appelé directement lorsque l'objet est copié.
__isset() : Lorsque isset() ou empty() est utilisé pour des propriétés inexistantes ou inaccessibles, __isset() sera appelé
__destruct() : destructeur de la classe , exécuté lorsque toutes les références à l'objet sont supprimées ou que l'objet est explicitement détruit.
5. Comme indiqué ci-dessous, quel sera le résultat ?
foreach ($array as $key => $item) { $array[$key + 1] = $item + 2; echo "$item"; } print_r($array); 结果示例: $array = [3,6,7,8]; 3678 //echo 输出数组内元素的值Array( [0] => 3 //$key 保持不变 [1] => 5 //每次的$eky + 1,对应的值加2, [2] => 8 [3] => 9 [4] => 10)
laravel
Les avantages et inconvénients de laravel par rapport aux autres frameworks
laravel
Avantages : Utilisateur numéro un au monde, documentation complète , structure du cadre L'organisation est claire et un grand nombre de packages d'extension tiers sont disponibles pour référence. Il convient au développement collaboratif de grands sites Web et les outils de développement artisanaux fournis ont une efficacité de développement élevée. L'extension Composer se charge automatiquement, middleware
Inconvénients : légèrement complexe, plus lent à démarrer que les frameworks généraux ; un grand nombre de packages tiers sont référencés, mais dans certains scénarios nous n'utilisons que certaines méthodes de la classe, et le code semble un peu redondant
ThinkPHP
Avantages : Il s'agit d'un framework de développement PHP léger, rapide et simple, basé sur MVC et orienté objet. Il est publié conformément à l'accord open source Apache2. , adhérant à des principes de conception simples et pratiques, tout en conservant d'excellentes performances et un minimum de code, il accorde une attention particulière à l'expérience de développement et à la facilité d'utilisation, et possède de nombreuses fonctions et fonctionnalités originales, offrant un support solide pour le développement d'applications WEB. Simple, clair, pratique et rapide à prendre en main
Inconvénients : manque de conception orientée objet, la version 5 est essentiellement orientée objet, et il existe peu d'outils auxiliaires liés à la communauté framework
Mysql
1. Dans Mysql, la différence entre int(10) et int(11)
BIT[M] type de champ de bits, M représente le nombre de chiffres dans chaque valeur, allant de 1 à 64, si M est ignoré, la valeur par défaut est 1
TINYINT [(M)] [UNSIGNED] [ZEROFILL] M est par défaut 4. Très petit entier. La plage signée est de -128 à 127. La plage non signée va de 0 à 255.
SMALLINT[(M)] [UNSIGNED] [ZEROFILL] M est par défaut 6. petit entier. La plage signée va de -32768 à 32767. La plage non signée va de 0 à 65 535.
MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL] M est par défaut 9. Entier de taille moyenne. La plage signée va de -8388608 à 8388607. La plage non signée va de 0 à 16777215.
INT[(M)] [UNSIGNED] [ZEROFILL] M est par défaut 11. Un entier de taille normale. La plage signée va de -2147483648 à 2147483647. La plage non signée va de 0 à 4294967295.
BIGINT[(M)] [UNSIGNED] [ZEROFILL] M est par défaut 20. Grand entier. La plage signée va de -9223372036854775808 à 9223372036854775807. La plage non signée va de 0 à 18446744073709551615.
Remarque : M ici ne représente pas la longueur spécifique stockée dans la base de données. Dans le passé, on a toujours cru à tort que int(3) ne pouvait stocker que des nombres de 3 longueurs, et int(11) stockerait 11 longueurs. Les chiffres sont complètement faux. En fait, lorsque nous choisissons d'utiliser le type int, que ce soit int(3) ou int(11), il stocke une longueur de 4 octets dans la base de données. Lors de l'utilisation de int(3), si vous saisissez 10, il vous donnera le bit de stockage 010 par défaut, ce qui signifie que 3 représente une longueur par défaut Lorsque vous avez moins de 3 chiffres, cela vous aidera avec la longueur incomplète. Lorsque vous dépassez 3 chiffres, il n'y aura aucun impact.
**int(M) M indique la largeur d'affichage maximale. La largeur d’affichage effective maximale est de 255. La spécification facultative de la largeur d’affichage est utilisée pour remplir la largeur à partir de la gauche lorsque la largeur d’affichage est inférieure à la largeur de colonne spécifiée. La largeur d'affichage ne limite pas la plage de valeurs pouvant être conservées dans la colonne, ni l'affichage des valeurs qui dépassent la largeur spécifiée de la colonne.
2. Principe de l'index gauche :
comme, lors de la correspondance de chaînes, ne commencez pas par un caractère générique, le côté gauche doit être corrigé, l'index du champ fonctionnera
Index composé , lorsque le champ de gauche est fixe, l'index de droite n'est valide que lorsque l'index correspond. Étant donné que le tri des mots clés de l'index composé est basé sur le champ de gauche, si le champ de gauche est le même, il est trié en fonction du champ de droite.
3. Avantages et inconvénients de la création d'index :
Avantages :
La création d'un index peut grandement améliorer les performances du système
Grâce à une indexation unique, la base de données peut être garantie Le caractère unique de chaque ligne de données dans la table
Accélére considérablement la récupération
Accélére la connexion entre les tables
Lors de l'utilisation de clauses de regroupement et de tri des données récupération, réduisez le temps de regroupement et de tri dans les requêtes
En utilisant des index, vous pouvez utiliser des caches d'optimisation pendant le processus de requête pour améliorer les performances du système
Inconvénients :
Créer et maintenir index Cela prend du temps et augmente à mesure que la quantité de données augmente
L'index prend de l'espace physique
Lors de l'ajout, de la suppression ou de la modification de données dans la table, l'index doit être maintenu dynamiquement, ce qui réduit la vitesse de maintenance des données
4. Veuillez décrire comment les serveurs maître et esclave MySQL synchronisent les données. Quel type de SQL empêchera le maître et l'esclave de se synchroniser correctement ?
Retard du réseau
Étant donné que la réplication maître-esclave MySQL est une réplication asynchrone basée sur binlog, les fichiers binlog sont transmis via le réseau. Bien sûr, le retard du réseau constitue la grande majorité des raisons pour lesquelles le maître-esclave est présent. synchronisation esclave. Surtout pour la synchronisation des données entre les salles informatiques, la probabilité que cela se produise est très élevée, donc séparez la lecture et l'écriture et faites attention à la conception initiale de la couche métier.
Les charges des machines maître et esclave sont incohérentes
Parce que la réplication maître-esclave mysql démarre 1 thread io sur la base de données maître, et démarre 1 thread sql et 1 thread io d'en haut, parmi La charge sur n'importe quelle machine est très élevée et elle est trop occupée. Par conséquent, l'un des threads ne dispose pas de ressources suffisantes et une incohérence maître-esclave se produira.
Les paramètres max_allowed_packet sont incohérents
Le max_allowed_packet défini sur la base de données maître est plus grand que celui sur la base de données esclave Lorsqu'une instruction SQL volumineuse peut être exécutée sur la base de données maître, le paramètre sur l'esclave. la base de données est trop petite et ne peut pas être exécutée, ce qui entraîne une incohérence maître-esclave.
Incohérence maître-esclave causée par une incohérence entre la valeur de la clé à partir de la clé d'incrémentation automatique de la clé et le paramètre de pas d'incrémentation automatique.
Lorsque mysql est anormalement en panne, si sync_binlog=1 ou innodb_flush_log_at_trx_commit=1 n'est pas défini, il est très probable que le fichier binlog ou relaylog soit endommagé, entraînant une incohérence maître-esclave.
Synchronisation maître-esclave provoquée par un bug dans MySQL lui-même.
Les versions sont incohérentes, surtout lorsque la version supérieure est le maître et la version inférieure est l'esclave, la fonction supportée sur la base de données maître n'est pas supportée sur la base de données esclave
5. est un tableau de commande, comme suit, trouvez les deux utilisateurs avec le plus d'achats
order_id
user_id
goods
100000 100 Apple
100001 100 Pomme
100002 101 orange
100003 102 pomme
100004 102 banane
sql:
SELECT order_id,user_id ,COUNT(order_id) AS count FROM order GROUP BY user_id ORDER BY count DESC limite 2
Linux
Comment savoir que le service Web est lent
top : Vérifiez les performances du système
Nginx : Ajoutez $request_time au dernier champ
Listez les pages dont le temps de requête de page PHP dépasse 3 secondes, comptez le nombre d'occurrences et affichez les 100 premières items
cat access.log|awk '($ NF > 1 && $7~/.php/){print $7}'|sort -n|uniq -c|sort -nr|head -100
Implémenté dans le code, écrivez l'heure au début et écrivez à la fin Heure d'entrée
Complet
1 La différence entre AES et RSA :
RSA est le cryptage asymétrique. , le chiffrement à clé publique, le déchiffrement à clé privée et vice versa. Inconvénients : Vitesse d’exécution lente et difficile à implémenter matériellement. Les longueurs de clé privée courantes sont de 512 bits, 1 024 bits, 2 048 bits et 4 096 bits. Plus la longueur est longue, plus elle est sécurisée, mais plus la génération de clé est lente et plus le cryptage et le déchiffrement prennent du temps.
Cryptage symétrique AES, la clé la plus longue ne fait que 256 bits, exécution rapide et facile à implémenter dans le matériel. Puisqu’il s’agit d’un cryptage symétrique, la clé doit être connue des deux parties communicantes avant la transmission.
AES加密数据块分组长度必须为128比特,密钥长度可以是128比特、192比特、256比特中的任意一个(如果数据块及密钥 长度不足时,会补齐)
总结:采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,这样我们就集成了两类加密算法的优点,既实现了加密速度快的优点,又实现了安全方便管理密钥的优点。
RBAC:基于角色的访问控制
一个用户属于多个角色
角色拥有多个动作的权限
用户是否具有某些动作的权限
表:用户表、角色表、动作表,用户角色关联表、角色动作关联表
MongoDB
MongoDB数据类型:
String(字符串): mongodb中的字符串是UTF-8有效的。
Integer(整数): 存储数值。整数可以是32位或64位,具体取决于您的服务器。
* Boolean(布尔): 存储布尔(true/false)值。
Double(双精度): 存储浮点值。
Min/ Max keys(最小/最大键): 将值与最低和最高BSON元素进行比较。
Arrays(数组): 将数组或列表或多个值存储到一个键中。
Timestamp(时间戳): 存储时间戳。
Object(对象): 嵌入式文档。
Null (空值): 存储Null值。
Symbol(符号): 与字符串相同,用于具有特定符号类型的语言。
Date(日期): 以UNIX时间格式存储当前日期或时间。
Object ID(对象ID) : 存储文档ID。
Binary data(二进制数据): 存储二进制数据。
Code(代码): 将JavaScript代码存储到文档中。
Regular expression(正则表达式): 存储正则表达式
算法
1. 排序算法
* 快速排序
快速排序是十分常用的高效率的算法,其思想是:我先选一个标尺,用它把整个队列过一遍筛选,以保证其左边的元素都不大于它,其右边的元素都不小与它function quickSort($arr){ // 获取数组长度
$length = count($arr); // 判断长度是否需要继续二分比较 if($length <= 1){ return $arr; } // 定义基准元素 $base = $arr[0]; // 定义两个空数组,用于存放和基准元素的比较后的结果 $left = []; $right = []; // 遍历数组 for ($i=1; $i < $length; $i++) { // 和基准元素作比较 if ($arr[$i] > $base) { $right[] = $arr[$i]; }else { $left[] = $arr[$i]; } } // 然后递归分别处理left和right $left = quickSort($left); $right = quickSort($right); // 合并 return array_merge($left,[$base],$right); }
冒泡排序
思路:法如其名,就像冒泡一样,每次从数组中冒出一个最大的数
比如:2,4,1
第一次冒出4:2,1,4
第二次冒出2:1,2,4
function bubbleSort($arr){ // 获取数组长度 $length = count($arr); // 第一层循环控制冒泡轮次 for ($i=0; $i < $length-1; $i++) { // 内层循环控制从第0个键值和后一个键值比较,每次冒出一个最大的数 for ($k=0; $k < $length-$i; $k++) { if($arr[$k] > $arr[$k+1]){ $tmp = $arr[$k+1]; $arr[$k+1] = $arr[$k]; $arr[$k] = $tmp; } } } return $arr; }
选择排序
思路:每次选择一个相应的元素,然后将其放到指定的位置
function selectSort($arr){ // 实现思路 // 双重循环完成,外层控制轮数,当前的最小值,内层控制比较次数 // 获取长度 $length = count($arr); for ($i=0; $i < $length - 1; $i++) { // 假设最小值的位置 $p = $i; // 使用假设的最小值和其他值比较,找到当前的最小值 for ($j=$i+1; $j < $length; $j++) { // $arr[$p] 是已知的当前最小值 // 判断当前循环值和已知最小值的比较,当发下更小的值时记录下键,并进行下一次比较 if ($arr[$p] > $arr[$j]) { $p = $j; // 比假设的值更小 } } // 通过内部for循环找到了当前最小值的key,并保存在$p中 // 判断 日光当前$p 中的键和假设的最小值的键不一致增将其互换 if ($p != $i) { $tmp = $arr[$p]; $arr[$p] = $arr[$i]; $arr[$i] = $tmp; } } // 返回最终结果 return $arr; }
相关推荐:
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!