Dieser Artikel vermittelt Ihnen relevantes Wissen über PHP. Er stellt hauptsächlich PHP-Interviewfragen vor und fasst 39 häufige Interviewfragen zusammen. Es gibt viele Arten von PHP-Interviewfragen, aber sie sind alle untrennbar mit den Grundlagen verbunden Häufige PHP-Interviewfragen. Ich hoffe, dass sie für alle hilfreich sind.
Empfohlene Studie: „PHP-Tutorial“
Das ist der Kern des Problems Domänennamenauflösung und Serverauflösung (Nginx). Grundsätzlich können diese beiden Teile im Detail erklärt werden.
Schritt 1. Analysieren Sie die URL
Der Browser analysiert die aktuellen URL-Daten, um festzustellen, ob es sich bei der URL um einen legalen Link handelt. Wenn es sich um einen legitimen Link handelt, fahren Sie normal mit dem nächsten Schritt fort. Wenn es sich nicht um einen legalen Link handelt, wird die Suchfunktion ausgeführt, z. B. Baidu, 360, Google-Suche usw.
Schritt 2, Domänennamen auflösen
Der Server existiert in Form einer IP. Der Domänenname muss in IP aufgelöst werden. Es gibt drei kleine Schritte, um IP aufzulösen:
1), die Domänennamendaten aus dem Browser-eigenen Cache analysieren
2), den Domänennamen aus der HOST-Datei des lokalen auflösen Computer
3), den Domänennamen über den DNS-Server auflösen
Schritt 3, Informationen abrufen
In diesem Schritt erhalten wir die URL-Informationen, hauptsächlich die IP- und Portinformationen.
Schritt 4. Paketieren und Drei-Wege-Handshake durchführen
Der Browser packt die Anforderungsinformationen und überträgt die Daten über den Drei-Wege-Handshake von TCP an den Server.
Schritt 5: Server analysiert, verarbeitet und gibt Daten zurück
Der Server erhält die übergebenen Daten über verschiedene Ebenen und Methoden, analysiert und verarbeitet die Daten und gibt schließlich Antwort-MIME-Typdaten zurück. Der normale Statuscode ist 200 und die abnormalen Fehlercodes sind 404, 500, 501 usw.
Schritt 6. Der Browser ruft die Daten ab, rendert sie und zeigt sie an
Der Browser ruft die Daten vom Server ab, lädt Ressourcen, rendert die Seite usw. und zeigt die Seite dem Benutzer an.
1) Das HTTP-Stateless-Protokoll kann nicht unterscheiden, ob der Benutzer von derselben Website kommt oder nicht Seiten können nicht als derselbe Benutzer betrachtet werden.
2), SESSION wird auf der Serverseite gespeichert und COOKIE wird auf der Clientseite gespeichert. Sitzungen sind relativ sicher. Cookies können auf bestimmte Weise geändert werden und sind nicht sicher. Die Sitzung ist für die Bereitstellung auf Cookies angewiesen.
Nach der Deaktivierung von Cookies kann die Sitzung nicht normal genutzt werden. Nachteile der Sitzung: Sie wird auf der Serverseite gespeichert und jeder Lesevorgang wird vom Server gelesen, was Ressourcen auf dem Server verbraucht. Die Sitzung wird in einer Datei oder Datenbank auf der Serverseite gespeichert. Der Dateipfad wird standardmäßig durch session.save_path in der PHP-Konfigurationsdatei angegeben. Sitzungsdateien sind öffentlich.
Eins, zwei, drei, vier und fünf Prinzipien: 1. Nachrichtenserie 2, Erfolgsserie 3. Redirect-Serie 4. Request-Fehlerserie 5. Serverseitige Fehlerserie
302: Temporäre Übertragung erfolgreich, der angeforderte Inhalt ist vorhanden wurde an den neuen Standort übertragen 403 :Zugriff verboten 500: Interner Serverfehler 401 bedeutet nicht autorisiert.
Tar.gz:
Verpackung: tar czf file.tar.gz file.txt
Dekomprimieren: tar xzf file.tar.gz
Bz2 :
Paket: bzip2 [-k]-Datei
Dekomprimieren: bunzip2 [-k]-Datei
Gzip (nur Dateien, Originaldatei nicht behalten)
Paket: gzip-Datei1.txt
Dekomprimieren: gunzip-Datei1. txt.gz
Zip: -r Packen Sie das Verzeichnis
: zip file1.zip file1.txt
Dekomprimieren: entpacken Sie file1.zip
Int Integer char Zeichen mit fester Länge Varchar Zeichen mit variabler Länge Datetime Datetime-Typ Text Texttyp Der Unterschied zwischen Varchar und char char besteht darin, wie viel Platz ein Zeichentyp mit fester Länge belegt. Varchar ist ein Zeichentyp mit variabler Länge. Er nimmt genauso viel Platz ein wie der Inhalt, wodurch effektiv Platz gespart werden kann. Da der Typ varchar variabel ist, muss der Server zusätzliche Vorgänge ausführen, wenn sich die Datenlänge ändert, sodass die Effizienz geringer ist als beim Typ char.
Der MyISAM-Typ unterstützt keine Transaktionen und Tabellensperren und ist anfällig für Fragmentierung. Er muss häufig optimiert werden und verfügt über schnellere Lese- und Schreibgeschwindigkeiten, während der InnoDB-Typ Transaktionen und Zeilensperren unterstützt und über Funktionen zur Wiederherstellung nach Abstürzen verfügt. Die Lese- und Schreibgeschwindigkeiten sind langsamer als bei MyISAM.
Index erstellen: Alarmtabelle Tabellenname Index hinzufügen (‘Feldname’)
Verstehen: Wenn session_start() aktiviert ist, wird eine konstante SID generiert. Wenn COOKIE aktiviert ist, ist diese Konstante leer. Wenn COOKIE geschlossen ist, wird der Wert von PHPSESSID in dieser Konstante gespeichert. Durch Hinzufügen eines SID-Parameters nach der URL zur Übergabe des Werts von SESSIONID kann die Clientseite den Wert in SESSION verwenden. Wenn der Client COOKIE öffnet und der Server SESSION öffnet. Wenn der Browser die erste Anfrage stellt, sendet der Server ein COOKIE an den Browser, um die SESSIONID zu speichern. Wenn der Browser die zweite Anfrage stellt, speichert er die vorhandene
Isset Um festzustellen, ob eine Variable vorhanden ist, können Sie mehrere Variablen übergeben. Wenn eine der Variablen nicht vorhanden ist, wird false zurückgegeben übergeben werden. Wenn es leer ist, wird true zurückgegeben.
Antwort: Es gibt zwei Hauptmethoden:
1) Die Snapshot-Persistenz
wurde in der Redis-Konfigurationsdatei automatisch aktiviert.
Das Format lautet: N M speichern
bedeutet, dass Redis mindestens N Sekunden lang gespeichert hat M Vorkommen Nach der Änderung erstellt Redis einen Snapshot auf der Festplatte.
Natürlich können wir den Befehl save oder bgsave (asynchron) auch manuell ausführen, um einen Snapshot zu erstellen
2) Nur Datei anhängen AOF-Persistenz
Insgesamt gibt es drei Modi, z. B.
appendfsync everysec Der Standardwert ist erzwingen einmal pro Sekunde auf die Festplatte schreiben
appendfsync erzwingt bei jedem Schreibvorgang immer das Schreiben auf die Festplatte
appendfsync hängt nicht vollständig vom Betriebssystem ab, die Leistung ist am besten, die Persistenz kann jedoch nicht garantiert werden
Der dritte Modus ist der beste . Redis übernimmt standardmäßig auch den dritten Modus.
Antwort: Die häufig verwendeten sind hauptsächlich in zwei Typen unterteilt, einer ist Innodb und der andere ist Myisam. Der Hauptunterschied zwischen den beiden ist
1) Myisam unterstützt keine Transaktionsverarbeitung , während innoDB die Transaktionsverarbeitung durchführt
2) myisam unterstützt keine Fremdschlüssel, innoDB unterstützt Fremdschlüssel
3) myisam unterstützt den Volltextabruf, während innoDB den Volltextabruf erst nach MySQL5.6-Version unterstützt
4) Die Die Speicherform der Daten ist unterschiedlich, Mysiam-Tabelle wird in drei Dateien gespeichert: Struktur, Index und Daten, und der Index und die Daten werden als eine Datei gespeichert Hinzufügen von Daten und innoDB führt eine höhere Stapellöschung durch.
6) myisam unterstützt Tabellensperren, während innoDB Zeilensperren unterstützt
11 Was ist SQL-Injection und wie kann man SQL-Injection verhindern?1) Die Platzhaltermethode besteht darin, die SQL-Anweisung vorzuverarbeiten und dann die SQL-Anweisung auszuführen
2) Über addslashes oder mysql_real_escape_string Die beiden Funktionen maskieren die Werte Vom Benutzer eingegebene Zeichen und Escapezeichen für einige Sonderzeichen.
12. Haben Sie eine Vorverarbeitung verwendet?Antwort: MySQL-Optimierung wird hauptsächlich aus den folgenden Aspekten erreicht:
1) Entwurfsperspektive: Auswahl der Speicher-Engine, Auswahl des Feldtyps, Paradigma
2) Funktionale Perspektive: Sie können die eigenen Eigenschaften von MySQL nutzen, z Indizes, Abfrage-Caching, Defragmentierung, Partitionierung, Tabellenaufteilung usw.
3) Optimierung von SQL-Anweisungen: Versuchen Sie, Abfrageanweisungen so weit wie möglich zu vereinfachen, so wenige Abfragefelder wie möglich zu verwenden, Paging-Anweisungen, Gruppierungsanweisungen usw. zu optimieren.
4) Stellen Sie ein Architektursystem mit großer Last bereit: Der Datenbankserver ist getrennt. Wenn die Last hoch ist, können Master-Slave-Replikation und Lese-/Schreib-Trennmechanismus für das Design verwendet werden.
5) Aktualisieren Sie den Datenbankserver von der Hardware.
Übergabe als Wert: Alle Änderungen am Wert innerhalb des Funktionsumfangs werden außerhalb der Funktion ignoriert.
Übergabe als Referenz: Alle Änderungen am Wert innerhalb des Funktionsumfangs spiegeln diese Änderungen auch außerhalb der Funktion wider.
Vor- und Nachteile : Drücken Sie Wenn ein Wert übergeben wird, muss PHP den Wert kopieren. Insbesondere bei großen Strings und Objekten kann dies ein kostspieliger Vorgang sein. Bei der Referenzübergabe ist kein Kopieren des Werts erforderlich, was sich positiv auf die Leistungsverbesserung auswirkt.
Stellen Sie die Fehlerstufe von PHP ein und geben Sie die aktuelle Stufe zurück.
Prinzip: Die Schnellsortierung verwendet die Divide-and-Conquer-Strategie, um die zu sortierende Datensequenz in zwei Teilsequenzen aufzuteilen :
(1) Wählen Sie ein Element aus der Sequenz aus und nennen Sie dieses Element das „Datum“.
(2) Scannen Sie das Array einmal und ordnen Sie alle Elemente, die kleiner als die „Basis“ sind, vor der Basis und alle Elemente, die größer als die „Basis“ sind, hinter der Basis an.
(3) Teilen Sie jede Teilsequenz durch Rekursion in kleinere Sequenzen auf, bis das Unterarray von Elementen, die kleiner als der Referenzwert sind, und das Unterarray von Elementen, die größer als der Referenzwert sind, sortiert sind.
//快速排序(数组排序) function QuickSort($arr){ $num = count($arr); $l=$r=0; for($i=1;$i<$num;$i++){ if($arr[$i] < $arr[0]){ $left[] = $arr[$i]; $l++; }else{ $right[] = $arr[$i]; $r++; } } if($l > 1){ $left = QuickSort($left); } $new_arr = $left; $new_arr[] = $arr[0]; if($r > 1){ $right = QuickSort($right); } for($i=0;$i<$r;$i++){ $new_arr[] = $right[$i]; } return $new_arr; }
//二分查找(数组里查找某个元素) function bin_sch($array, $low, $high, $k){ if ($low <= $high){ $mid = intval(($low+$high)/2); if ($array[$mid] == $k){ return $mid; }elseif ($k < $array[$mid]){ return bin_sch($array, $low, $mid-1, $k); }else{ return bin_sch($array, $mid+1, $high, $k); } } return -1; } //顺序查找(数组里查找某个元素) function seq_sch($array, $n, $k){ $array[$n] = $k; for($i=0; $i<$n; $i++){ if($array[$i]==$k){ break; } } if ($i<$n){ return $i; }else{ return -1; } }
//二维数组排序, $arr是数据,$keys是排序的健值,$order是排序规则,1是升序,0是降序 function array_sort($arr, $keys, $order=0) { if (!is_array($arr)) { return false; } $keysvalue = array(); foreach($arr as $key => $val) { $keysvalue[$key] = $val[$keys]; } if($order == 0){ asort($keysvalue); }else { arsort($keysvalue); } reset($keysvalue); foreach($keysvalue as $key => $vals) { $keysort[$key] = $key; } $new_array = array(); foreach($keysort as $key => $val) { $new_array[$key] = $arr[$val]; } return $new_array; }
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; } }
答:用getimagesize来判断上传图片的类型比$_FILES函数的type更可靠
同一个文件,使用不同的浏览器php返回的type类型是不一样的,由浏览器提供type类型的话,
就有可能被黑客利用向服务器提交一个伪装撑图片后缀的可执行文件。
可以通过getimagesize()函数来判断上传的文件类型,如果是头像文件 会返回这样的一个数组
Array ( [0] => 331 [1] => 234 [2] => 3 [3] => width="331" height="234" [bits] => 8 [mime] => image/png );
答:基本原则:不对外界展示服务器或程序设计细节(屏蔽错误),不相信任何用户提交的数据(过滤用户提交)
1)屏蔽错误,将display_errors 设置为off
2)过滤用户提交参数,这里需要注意的是不能仅仅通过浏览器端的验证,还需要经过服务器端的过滤
这里是需要注意最多的地方,因为所有用户提交的数据入口都在这里,这是过滤数据的第一步。 1 考虑是否过滤select,insert,update,delete,drop,create等直接操作数据的命令语句 2 使用addslashes 将所有特殊字符过滤 3 打开magic_quotes_gpc,开启该参数数后自动将sql语句转换,将 ' 转换成 \'
3)可以考虑设置统一入口,只允许用户通过指定的入口访问,不能访问未经许可的文件等内容
4)可以考虑对安全性要求高的文件进行来源验证,比如要想执行b.php必须先执行a.php,可以在b.php中判断来自a.php的referer,避免用户直接执行b.php
答:由于 –enable-cli 和 –enable-cgi 同时默认有效,因此,不必再配置行中加上 –enable-cli 来使得 CLI 在 make install 过程中被拷贝到 {PREFIX}/bin/php
php -f “index.php” php -r “print_r(get_defined_constants());”
说明:
1)如果,你熟悉PHP源码,那么请从源码入手,回答些问题,会获得额外加分
2)如果,你不熟悉PHP源码,那么尽你所能,多写点东西,包括利用自己的编程直觉得到的信息,都可以。
3)对,则有分,错误不扣,不写无分。
答:PHP可以自动进行内存管理,清除不再需要的对象。PHP使用了引用计数(referencecounting)这种单纯的垃圾回收(garbagecollection)机制。每个对象都内含一个引用计数器,每个reference连接到对象,计数器加1。当reference离开生存空间或被设为NULL,计数器减1。当某个对象的引用计数器为零时,PHP知道你将不再需要使用这个对象,释放其所占的内存空间。
1. get是从服务器上获取数据,post是向服务器传送数据。 2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。 3. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。 4. get安全性非常低,post安全性较高。但是执行效率却比Post方法好。
一:在php.ini中设置session.gc_maxlifetime = 1440 //默认时间 二:代码实现 $ lifeTime = 24 * 3600; //保存一天 session_set_cookie_params($ lifeTime); 在session_start();
他问的是已经支付成功后,但是回调失败了。
自己可以创建定时任务在每天的凌晨执行,去微信那边对账,然后更新数据库订单状态。
来自PHP技术交流群 群友分享
看看你的服务的访问日志,在防火墙中加过滤,或者在web服务器中加过滤吧。方法有以下几种。
是消耗服务器资源为主还是纯流量攻击?消耗资源的可以通过配置防火墙过滤规则防御中小规模的攻击。如果是纯流量攻击,考虑你用的是linode真心无解。即便你封了IP封了端口也没用,人家不管你接不接受他的请求,他都会塞满你的带宽。linode必然认为你是被流量攻击或者消耗过多资源然后给你挂起。
Groupadd mysql 添加一个用户组mysql Useradd -g mysql mysql 添加一个mysql用户指定分组为mysql Cd /lamp/mysql 进入mysql目录 ./configure –prefix=/usr/local/mysql/ –with-extra-charsets=all Make Make all
优化程序,优化数据库,如果程序和数据库已经最优化,使用以下解决方法:
1)索引的目的是什么?
2) 索引对数据库系统的负面影响是什么?
负面影响:创建索引和维护索引需要耗费时间,这个时间随着数据量的增加而增加;索引需要占用物理空间,不光是表需要占用数据空间,每个索引也需要占用物理空间;当对表进行增、删、改的时候索引也要动态维护,这样就降低了数据的维护速度。
3) 为数据表建立索引的原则有哪些?
4) 什么情况下不宜建立索引?
单引号不能解释变量,而双引号可以解释变量。
单引号不能转义字符,在双引号中可以转义字符。
方法一: <?php class Dtime{ function get_days($date1, $date2){ $time1 = strtotime($date1); $time2 = strtotime($date2); return ($time2-$time1)/86400; } } $Dtime = new Dtime; echo $Dtime->get_days(’2021-2-5′, ’2021-3-6′); ?> 方法二: <?php $temp = explode(‘-’, ’2021-2-5′); $time1 = mktime(0, 0, 0, $temp[1], $temp[2], $temp[0]); $temp = explode(‘-’, ’2021-3-6′); $time2 = mktime(0, 0, 0, $temp[1], $temp[2], $temp[0]); echo ($time2-$time1)/86400; 方法三:echo abs(strtotime(“2021-2-5″)-strtotime(“2021-3-1″))/60/60/24 计算时间差
<?php function BubbleSort(&$arr){ $cnt=count($arr); $flag=1; for($i=0;$i<$cnt;$i++){ if($flag==0){ return; } $flag=0; for($j=0;$j<$cnt-$i-1;$j++){ if($arr[$j]>$arr[$j+1]){ $tmp=$arr[$j]; $arr[$j]=$arr[$j+1]; $arr[$j+1]=$tmp; $flag=1; } } } } $test=array(1,3,6,8,2,7); BubbleSort($test); var_dump($test);
推荐学习:《PHP视频教程》
Das obige ist der detaillierte Inhalt vonFassen Sie 39 PHP-Interviewfragen zusammen und organisieren Sie sie (Zusammenfassungsfreigabe). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!