Heim  >  Artikel  >  Backend-Entwicklung  >  PHP-Interviewfragen zusammengestellt und geteilt

PHP-Interviewfragen zusammengestellt und geteilt

小云云
小云云Original
2018-03-27 11:14:284359Durchsuche

In diesem Artikel geht es vor allem um die Sammlung und Weitergabe von PHP-Interviewfragen, in der Hoffnung, Ihnen dabei zu helfen, das Vorstellungsgespräch reibungsloser zu gestalten.

Serveraspekt

1. Nginx reibungsloser Neustart

Nginx führt einen neuen Worker-Prozess aus und schließt den alten Worker-Prozess ruhig, benachrichtigt den Worker-Prozess, den Listening-Socket zu schließen, stellt aber weiterhin eine Verbindung her bis hin zur aktuellen Bereitstellung von Dienstleistungen für Kunden. Nachdem alle Client-Dienste abgeschlossen sind, wird der alte Arbeitsprozess
geschlossen. Wenn die Anwendung der neuen Konfigurationsdatei fehlschlägt, arbeitet Nginx weiterhin mit der alten Konfigurationsdatei.
Um es einfach auszudrücken: Nginx verarbeitet die vorherige Anfrage weiter und startet einen neuen Prozess, um die neue Anfrage zu bearbeiten. Der alte Prozess wird beendet, nachdem die Verarbeitung abgeschlossen ist.

2. Holen Sie sich die letzten 10 Zeilen der Datei.
tail -10 a.log

3. Überprüfen Sie die Prozesse, die mehr Systemressourcen beanspruchen
top
ps: Drücken Sie nach Eingabe des oberen Befehls 1, um die Speicher- und CPU-Auslastung anzuzeigen

3. Funktion zum Vorkommen von Schlüsselwörtern anzeigen
grep -n 'Ich bin das Schlüsselwort, das Sie finden möchten' a.txt | Zeile erscheint:
grep -n „Schlüsselwort“ „Dateipfad“ |. cut -d :“ -f1
Die letzte Zeilennummer, in der das Schlüsselwort in der Statistikdatei erscheint:
grep -n „Schlüsselwort“ „Dateipfad“ |. tail -n 1 |. cut -d ":" -f1


4. Suchen Sie im Verzeichnis /root/ nach Dateien terminal:
find /root/ –type f |. Verzeichnis, die Anzahl der js-Dateien:
find demo/ -name "*.js" |wc -l
Zählen Sie die Anzahl der Codezeilen aller js Dateien im Demo-Verzeichnis:
find demo/ -name "*.js" " |xargs cat|wc -l
wc -l `find ./ -name "*.js"`|tail -n1
Zählen Sie die Anzahl der Codezeilen in allen js-Dateien im Demo-Verzeichnis und filtern Sie Leerzeilen heraus:
find /demo -name "*.js" |xargs cat|grep -v ^$|wc -l

6. Überwachen Sie eine Datei in Echtzeit
tail -f a.log

Die 100 am häufigsten besuchten IPs und die Anzahl der Besuche im Nginx-Protokoll
Die 100 am häufigsten besuchte IPs und die Anzahl der Besuche im Nginx-Protokoll
awk '{print $1}' /opt/software/nginx/logs/ access.log | head -n 100

8. Fügen Sie im kompilierten PHP eine neue Erweiterung hinzu
------ -------------------- -----------
Quellcode-Installation
1. Finden Sie das Quellcodeverzeichnis von PHP
2. Springen Sie zum EXT-Verzeichnis
3. Führen Sie phpize aus, um die Konfiguration zu generieren Datei
4. ./configure --with-php-config=/usr/local/php/bin/php-config
5. Make kompilieren
6. make install kompilieren und installieren
7 . Ändern Sie php.ini extension=/usr/local/***.so
8. Starten Sie php-fpm neu

YUM-Installation:
1. Gehen Sie zur offiziellen Website von PHP, um den Quellcode herunterzuladen (htpp://pecl.php.net)
2. Entpacken Sie die Datei
3. Führen Sie phpize aus, um die Konfigurationsdatei zu generieren
4. ./ configure --with-php-config=/usr/ local/php/bin/php-config
5. Kompilieren Sie make
6. Kompilieren und installieren Sie make install
7. Ändern Sie php.ini extension=/usr /local/***.so
8. Starten Sie php-fpm neu
————————————————————————————————————— --- -------
PHP-Optimierung Nginx-Optimierung MySQL-Optimierung

PHP-Optimierung:
1 Definieren Sie die Klassenmethode als statisch.
2. Versuchen Sie, einfache Anführungszeichen zu verwenden.
3. Ändern Sie die Anzahl der PHP-FPM-Prozesse.
4. Ändern Sie den maximal nutzbaren Speicher eines einzelnen Skripts.
5. Große Arrays müssen umgehend nach der Nutzung freigegeben werden.
6. Stellen Sie beim Schleifen die maximale Anzahl von Schleifen ein.
Verwenden Sie kein @, um Fehler abzuschirmen.
Verwenden Sie die Anzahl der integrierten Funktionen Anstelle von require_once

Nginx-Optimierung:
1. Ändern Sie die Anzahl der untergeordneten Nginx-Prozesse. [Maximal 65535]
2. Statischen Cache aktivieren
3. Ändern Sie die Anzahl der Hauptprozesse. Es wird empfohlen, entsprechend der Anzahl der CPUs anzugeben, normalerweise ein Vielfaches davon (z. B. werden 2 Quad-Core-CPUs als 8 gezählt)
4. Aktivieren Sie die gzip-Ausgabe [Wenn gzip aktiviert ist, kann die ob-Funktion nicht verwendet werden verwendet werden]
5. keepalive_timeout

MySQL-Optimierung:
1. Sequentielles Lesen
4. Legen Sie die automatische Inkrementierungs-ID fest.
6. Legen Sie die Feldtypen entsprechend fest.
8. Erstellen Sie geeignete Indizes
10. Vermeiden Sie die Verwendung von ressourcenintensiven Operationen null
12 Versuchen Sie, beim Abfragen eines Datenelements kein LIMIT 1 zu verwenden 🎜>14. Aktivieren Sie den Abfrage-Cache
15. Führen Sie eine sinnvolle Auswertung der Daten durch und unterteilen Sie die Tabellen
16. Vermeiden Sie die Verwendung von Fuzzy-Abfragen Integrierte Funktionen von MySQL
18. Verwenden Sie mehrere Slaves, um langsame Abfragen zu lösen. Frage

Wie erreicht man einen Flash-Sale?

Die Anzahl der gleichzeitigen Flash-Verkäufe, die wir tätigen, beträgt Hunderttausende, und die folgende Version ist Hunderttausende:

1 Spezialisiert auf Flash-Verkäufe [ps: wenn das Volumen groß ist, sagen wir Wenn es also klein ist, ist das nicht nötig.]
2. Erzeugen Sie eine statische Seite. [ ps: Wenn es immer noch groß ist, können Sie diese Datei auf CDN ablegen ]
3. Der Countdown und das Inventar werden vom Server abgerufen [Nach Ablauf des Countdowns wird der Server aufgefordert, zu prüfen, ob er gestartet wurde]
4. Speichern Sie die zu löschende Datenbank in redis [Schlüsselwert] stock= 10
5. Richten Sie eine Redis-Warteschlange ein [Liste als Warteschlange verwenden] lpop rpush
6 Wenn der Benutzer eine Anfrage stellt, wird beurteilt, ob der Benutzer am Flash teilgenommen hat Wenn nicht, werden die Benutzerdaten in die Warteschlange geschrieben und der Bestand reduziert. 1. Wenn Sie teilgenommen haben, werden Sie aufgefordert, teilgenommen zu haben
ps: Dieser Abschnitt verwendet die atomare Operation von redid, as sowie Transaktion Multi und Watch
redis optimistic lock cas ==== dient dazu, vor dem Festlegen zu beurteilen, ob sich der Wert geändert hat
7 Flash-Verkäufe können nicht durchgeführt werden, wenn der Lagerbestand um 0 reduziert wird
8 . Asynchrones Skript verarbeitet Warteschlangendaten [crontab + PHP-Datei]

Wenn Sie sagen, dass es 10.000 bis 30.000 sind, besteht keine Notwendigkeit, einen Server separat zu mieten

Wenn Sie nach geschäftlichen Aspekten gefragt werden Fragen, einfach entsprechend anpassen! ! ! !

Zum Beispiel: Was soll ich tun, wenn 10 Benutzer es kaufen, aber nicht bezahlen?
Die erste Aussage:
Es wird gesagt, dass die Nachfrage nach dem Produkt zu diesem Zeitpunkt darin bestand, dass es ohne Bezahlung kein Problem gab und andere Benutzer es nicht kaufen konnten Produkt, und wenn das Produkt sagen würde, dass es normal sei, würden Benutzer zahlen, weil billiger
Die zweite Aussage:
wird die nächste Runde der Flash-Verkäufe starten. Beispielsweise bei Xiaomi können Sie es nach 2 Stunden weiter kaufen! !
Der dritte Stopp:
Ja. . . .

Wie stellt man sicher, dass es nicht überkauft ist?
Beim Reduzieren des Lagerbestands handelt es sich um einen atomaren Vorgang, bei dem die optimistische Cas-Sperre verwendet wird. Während des Tests gab es keine Überkaufsituation

Außerdem ist während des Flash-Sales kein Warenkorb erforderlich. Wenn Sie darauf klicken, werden Sie in die Warteschlange gestellt


Q1 : Wie kann man das Zähneputzen verhindern? Generell gibt es bei Eilverkäufen tolle Rabatte. Wenn jemand böswillig betrügt, verlieren normale Benutzer die Möglichkeit zum Kauf. Wenn zum Beispiel die Anzahl der gekauften Produkte 1.000 beträgt und jemand in böswilliger Absicht 900 erwischt, werden von normalen Benutzern nur 100 erbeutet.
Nachdem die böswillig erbeuteten 900 im anschließenden Zahlungsvorgang überprüft wurden, ist die Schnappzeit möglicherweise abgelaufen. Selbst wenn alle 900 böswillig erbeuteten Gelder erfolgreich bezahlt würden, wäre dies gegenüber normalen Benutzern immer noch unfair.
In diesem Geschäftsszenario stellen wir die Produkte aus und erteilen das Recht zum Kauf der Produkte. Der tatsächliche Verbrauch wird von einem Dritten generiert. Dann muss das Problem des Benutzerbetrugs von uns und der Zahlungsseite des Drittanbieters kontrolliert werden. Nachdem der Benutzer das Kaufkontingent über den Warteschlangenmechanismus
erhalten hat, übertragen wir beim Springen zu einem Dritten die verschlüsselten Informationen gemäß der mit dem Dritten vereinbarten Verschlüsselungsmethode, und der Dritte erlaubt dem Benutzer nur die Zahlung Nach erfolgreicher Entschlüsselung gemäß der vereinbarten Entschlüsselungsmethode kann der Ver- und Entschlüsselungsprozess
Inhalte mit einem Lebenszyklus enthalten. Wenn ein Benutzer ein Produkt auf einer Hochfrequenz-Zahlungsseite erhält, kann er es tatsächlich nur über Folgendes erhalten: 1) das verschlüsselte Paar 2) beim ersten Mal; Allerdings geht es beim Dritten ausschließlich um den Verkauf von Waren, sodass der Erfolg einer solchen Zusammenarbeit
unwahrscheinlich ist. Eine böswillige Überprüfung zeigt tatsächlich, dass das Produkt auf unserer Geschäftsebene nicht vorrätig ist. Dadurch verlieren kaufwillige Nutzer zwar die Chance, es kann aber sichergestellt werden, dass Dritte nicht geschädigt werden. Wenn wir diese Brushing-Situation auf unserer Geschäftsebene vermeiden wollen, handelt es sich meiner Meinung nach um ein allgemeines
Anti-SPAM-Problem. Ich weiß wirklich nicht viel darüber.

F2: Wenn Sie Pinsel genau platzieren möchten, gibt es viele Beurteilungsdimensionen und die Logik ist dazu widersprüchlich; ein Eilkauf erfordert eine schnelle Reaktion.
Ja, aufgrund des hohen Nachfragedrucks und der hohen Parallelität bei Hot-Ticket-Käufen im Eilkaufgeschäft ist es wichtig, nicht zu viel Logik hinzuzufügen oder sich zu sehr auf das Backend zu verlassen. Je einfacher, desto besser der Effekt. Wenn wir das System entwerfen, gibt es viele Dinge, die unser System nicht abdecken kann
Wir müssen einige erforderliche Module und Funktionen bereithalten, bevor unser System ordnungsgemäß funktionieren kann. Es wird empfohlen, ein Kontosystem und Benutzerverbrauchsaufzeichnungen aufzubauen.
Frage 3: Dient der Abgleich nur dazu, den Warenbestand mit einem Dritten zu vergleichen?
Der Abgleich ist eigentlich ein Vergleich von Verbrauchsdaten. Um zu vermeiden, dass unsere Statistiken heute den Verbrauch von X Artikeln mit einem Gesamtwert von Y anzeigen, gibt der Dritte den Verbrauch von N Artikeln mit einem Gesamtwert von M an. Vermeiden Sie Unstimmigkeiten bei den Beträgen, die zu Problemen wie Abrechnung und Aufteilung führen könnten.
Ich denke, das Bestandsunterschiedsproblem in Ihrer Frage erfordert, dass ein Dritter die von ihm bereitgestellten Produkte regelmäßig über die Schnittstelle unserer Datenschicht aktualisiert. Tatsächlich dürfen Produkte in unserer Produktbibliothek nicht unbedingt nur von Dritten bereitgestellt werden. Wir können auch Dritten erlauben, Produkte über die Schnittstelle zu reduzieren, wenn wir beispielsweise mit einem Dritten zusammenarbeiten, der Früchte verkauft Party gab letzte Woche bekannt, dass es 100 Stück gibt, aber diese Woche verkaufen sie sich gut offline, und es sind nur noch 20 Stück übrig. Wir sollten auch Dritten erlauben, auf einen niedrigeren Wert zu aktualisieren. Aber auf diese Weise wird unser
System ziemlich kompliziert.

F4: Anti-Swipe, um Probleme mit Werbeaktionen Dritter zu vermeiden, die nicht effektiv sind.
Ja, die Benutzer-ID-Dimension und die IP-Dimension sind beide effektive Methoden. Schauen Sie sich das konkrete Szenario an. Für Unternehmen mit einem Kontosystem besteht der beste Effekt darin, die Benutzer-ID-Dimension zu verwenden. Verwenden Sie einfach den Speicher, um die Kaufdatensätze jedes Benutzers zur Kontrolle aufzuzeichnen. E-Commerce-Websites auf dem Markt erfordern grundsätzlich eine Anmeldung für Eilkäufe und begrenzen die Anzahl der Käufe einer einzelnen Person für jeden Artikel. Tatsächlich speichern und zeichnen sie den Verbrauch des Benutzers auf und generieren erneut Abfragen vor dem Verbrauch und fügen Sie Codelogik hinzu, um es zu steuern.

F5: Benötige ich für jedes Rush-Sale-Event einen neuen Bestätigungscode?
Der Verifizierungscode ist ein Turing-Test. Solange die Testmethode gut ist und die jedes Mal generierten Verifizierungsinformationen garantiert nie erscheinen und unregelmäßig sind, ist es ein guter Verifizierungscode.

So finden Sie diejenige mit den meisten Wiederholungen in massiven Datenmengen

Die IP des Benutzers wird im Website-Protokoll aufgezeichnet, finden Sie die IP mit den meisten Besuchen

Angenommen, es gibt solche 1kw-ID-Nummern und die entsprechenden Daten. Die ID-Nummer kann wiederholt werden. Daher müssen Sie die ID-Nummer finden, die am häufigsten vorkommt.

Es gibt eine Datei mit einer Größe von 1 GB, jede Zeile darin ist ein Wort, die Größe des Wortes überschreitet nicht 16 Byte und das Speicherlimit beträgt 1 MB. Gibt die 100 häufigsten Wörter zurück.

Es gibt 10 Dateien, jede Datei ist 1 GB groß. Jede Zeile jeder Datei speichert die Abfrage des Benutzers. Sie werden aufgefordert, nach Abfragehäufigkeit zu sortieren.

Blasensortierung:
Prinzip:
Vergleichen Sie die erste Zahl mit allen Zahlen und stoßen Sie dann auf eine große Austauschposition, sodass die größte zum ersten Mal am Ende platziert wird, und dann Beim zweiten Vergleich wird die letzte Zahl nicht verglichen, da festgestellt wurde, dass sie die größte ist, und so weiter.

1. Blasensortiermethode

 *     思路分析:法如其名,就是像冒泡一样,每次从数组当中 冒一个最大的数出来。 
 *     比如:2,4,1    // 第一次 冒出的泡是4 
 *                2,1,4   // 第二次 冒出的泡是 2 
 *                1,2,4   // 最后就变成这样

Zeitkomplexität:
Blasensortierung ist eine Sortiermethode, bei der Zeit gegen Platz eingetauscht wird. Die Situation ist am schlimmsten Ändern Sie die sequentielle Anordnung in eine umgekehrte Reihenfolge oder ändern Sie die umgekehrte Reihenfolge in eine sequentielle Reihenfolge.


$arr=array(1,43,54,62,21,66,32,78,36,76,39);  
function getpao($arr)
{  
  $len=count($arr);
  //设置一个空数组 用来接收冒出来的泡
  //该层循环控制 需要冒泡的轮数
  for($i=1;$i<$len;$i++)
  { //该层循环用来控制每轮 冒出一个数 需要比较的次数
    for($k=0;$k<$len-$i;$k++)
    {
       if($arr[$k]>$arr[$k+1])
        {
            $tmp=$arr[$k+1];
            $arr[$k+1]=$arr[$k];
            $arr[$k]=$tmp;
        }
    }
  }
  return $arr;
}
2. Auswahlsortierung:


http://jingyan.baidu.com/article/f3ad7d0f07516d09c3345b19.html
http://mmm2010.blog.163.com/blog/static/174230348201292273310140/
function select_sort($arr) {
//实现思路 双重循环完成,外层控制轮数,当前的最小值。内层 控制的比较次数
    //$i 当前最小值的位置, 需要参与比较的元素
    for($i=0, $len=count($arr); $i<$len-1; $i++) {
        //先假设最小的值的位置
        $p = $i;
        //$j 当前都需要和哪些元素比较,$i 后边的。
        for($j=$i+1; $j<$len; $j++) {
            //$arr[$p] 是 当前已知的最小值
            if($arr[$p] > $arr[$j]) {
     //比较,发现更小的,记录下最小值的位置;并且在下次比较时,
 // 应该采用已知的最小值进行比较。
                $p = $j;
            }
        }
        //已经确定了当前的最小值的位置,保存到$p中。
 //如果发现 最小值的位置与当前假设的位置$i不同,则位置互换即可
        if($p != $i) {
            $tmp = $arr[$p];
            $arr[$p] = $arr[$i];
            $arr[$i] = $tmp;
        }
    }
    //返回最终结果
    return $arr;
}
3.快速排序法  
function quick_sort($arr) {
    //先判断是否需要继续进行
    $length = count($arr);
    if($length <= 1) {
        return $arr;
    }
    //如果没有返回,说明数组内的元素个数 多余1个,需要排序
    //选择一个标尺
    //选择第一个元素
    $base_num = $arr[0];
    //遍历 除了标尺外的所有元素,按照大小关系放入两个数组内
    //初始化两个数组
    $left_array = array();//小于标尺的
    $right_array = array();//大于标尺的
    for($i=1; $i<$length; $i++) {
        if($base_num > $arr[$i]) {
            //放入左边数组
            $left_array[] = $arr[$i];
        } else {
            //放入右边
            $right_array[] = $arr[$i];
        }
    }
    //再分别对 左边 和 右边的数组进行相同的排序处理方式
    //递归调用这个函数,并记录结果
    $left_array = quick_sort($left_array);
    $right_array = quick_sort($right_array);
    //合并左边 标尺 右边
    return array_merge($left_array, array($base_num), $right_array);
}
4. Einfügungssortiermethode

Szenariobeschreibung:
gefolgt von Blasensortierung , die Schüler haben es jedes Mal versucht und ausprobiert, aber da es immer mehr Schüler gibt, stellt der Lehrer fest, dass jedes Mal, wenn die Warteschlange beendet ist, der größte Teil des Unterrichts verzögert wird, und sagt: „Wir müssen nicht sprudeln, das ist es.“ ein bisschen OUT, heute werden wir die Sortierung einfügen.
Zu diesem Zeitpunkt übernahm der Sportlehrer die Verantwortung eines Mathematiklehrers und brachte den Schülern eine Warteschlangenmethode – Einfügungssortierung – bei.
1. Beginnen Sie mit dem ersten Klassenkameraden als Maßstab und beginnen Sie mit dem zweiten Klassenkameraden, um ihn mit dem ersten Klassenkameraden zu vergleichen. Wenn er größer ist, bleiben Sie stehen, wenn er niedriger ist, ändern Sie die Position.
Der dritte Klassenkamerad sollte zuerst beginnen. Vergleichen Sie mit dem zweiten Klassenkameraden vor Ihnen. Wenn er niedriger ist, wechseln Sie mit dem zweiten. Gehen Sie dann vorwärts und vergleichen Sie mit dem ersten. Wenn er niedriger ist, wechseln Sie erneut. Andernfalls blockieren Sie und vergleichen Sie nicht mehr
3. Reihenfolge von vorne nach hinten. Führen Sie Schritt 2 aus, ein Schüler kommt einer nach dem anderen heraus, vergleichen Sie jedes Mal mit dem Klassenkameraden vor ihm, finden Sie eine geeignete Position zum Einfügen, die anderen Schüler bewegen sich zurück
zum Geeignete Position: Der vorherige Schüler ist gleich oder kleiner als seine eigene Körpergröße und der nächste Schüler. Jeder Schüler ist größer als er selbst.
Mit dieser Methode können die Schüler nacheinander die richtige Position finden und müssen nicht mehr benachbarte vergleichen Jedes Mal eine, und nachdem die Position gefunden wurde, ist kein Vergleich mit der Vorderseite erforderlich ...

Idee der Einfügesortiermethode: Fügen Sie die zu sortierenden Elemente an der angegebenen Position des Arrays ein, an der sich die Sortiernummer befindet angenommen wurde.

function insert_sort($arr) {
    //区分 哪部分是已经排序好的
    //哪部分是没有排序的
    //找到其中一个需要排序的元素
    //这个元素 就是从第二个元素开始,到最后一个元素都是这个需要排序的元素
    //利用循环就可以标志出来
    //i循环控制 每次需要插入的元素,一旦需要插入的元素控制好了,
    //间接已经将数组分成了2部分,下标小于当前的(左边的),是排序好的序列
    for($i=1, $len=count($arr); $i<$len; $i++) {
        //获得当前需要比较的元素值。
        $tmp = $arr[$i];
        //内层循环控制 比较 并 插入
        for($j=$i-1;$j>=0;$j--) {
   //$arr[$i];//需要插入的元素; $arr[$j];//需要比较的元素
            if($tmp < $arr[$j]) {
                //发现插入的元素要小,交换位置
                //将后边的元素与前面的元素互换
                $arr[$j+1] = $arr[$j];
                //将前面的数设置为 当前需要交换的数
                $arr[$j] = $tmp;
            } else {
                //如果碰到不需要移动的元素
           //由于是已经排序好是数组,则前面的就不需要再次比较了。
                break;
            }
        }
    }
    //将这个元素 插入到已经排序好的序列内。
    //返回
    return $arr;
}
/**
     * 插入排序,默认第一位已经排好序,从第二位开始依次向前比较,确定自己的位置后插入,即前一位小余或等于当前,且后一位大于当前。
     * 插入后,自己新位置后面的元素依次向后移位, 完成一轮插入排序
     * @param arr
     * @return
     */
    public static int[] insertSort(int[] arr) {
        int len = arr.length;
        for (int i = 1; i < len; i++) {
            if (arr[i - 1] > arr[i]) {
                int k = arr[i];
                int j = i;
                while (j > 0 && arr[j - 1] > k) {
                    arr[j] = arr[j - 1];
                    j--;
                }
                arr[j] = k;
            }
        }
        return arr;
    }

1,2,3,4,5,6,7
Ich möchte jetzt 7 finden
Ich werde zuerst die mittlere Zahl 4 herausnehmen
zur Beurteilung Ist es die Zahl, nach der Sie suchen? Wenn Sie feststellen, dass sie klein ist
, gehen Sie nach rechts und suchen Sie
und nehmen Sie dann alle Zahlen auf der rechten Seite heraus
Nehmen Sie die Zahl 6 heraus in der Mitte
und finde, dass es immer noch klein ist
und suche weiter. Das Array auf der rechten Seite
hat 7 gefunden, ok! ! !

Das schlimmste Szenario ist, dass diese Nummer nicht existiert =====

 1 <?php
 2     #二分查找
 3     function binarySearch(Array $arr, $target) {
 4         $low = 0;
 5         $high = count($arr) - 1;
 6         
 7         while($low <= $high) {
 8             $mid = floor(($low + $high) / 2);
 9             #找到元素
10             if($arr[$mid] == $target) return $mid;
11             #中元素比目标大,查找左部
12             if($arr[$mid] > $target) $high = $mid - 1;
13             #重元素比目标小,查找右部
14             if($arr[$mid] < $target) $low = $mid + 1;
15         }
16         
17         #查找失败
18         return false;
19     }
20     
21     $arr = array(1, 3, 5, 7, 9, 11);
22     $inx = binarySearch($arr, 1);
23     var_dump($inx);
24 ?>

安全方面:
xss :跨站脚本攻击
csrf :  跨站请求伪造
Ddos:用很多机器对网址进行请求,把服务器某方面搞挂。
sql注入: 通过关键字或者非法字符的注入,实现一些对数据库一些非正常的操作

最简单的demo :
在用户登陆的时候,用户名和密码的判断,密码后加上 or 1=1

如何防止sql注入:
关键字的过滤
pdo预处理
php 配置文件 php.ini 中的 magic_quotes_gpc选项没有打开,被置为 off
addslashes stripslashes
mysql_real_escape_string
对一些数据类型做强制的校验

如何防止xss攻击?
xss攻击最简单的方式就是通过地址栏输入3f1c4e4b6b16bbbd69b2ee476dc4f83a2cacc6d41bbb37262a98f745aa00fbf0,最简单的列子我们在php在使用一个get的a参数的时候,如何客户端传过来是3f1c4e4b6b16bbbd69b2ee476dc4f83aalert(1)2cacc6d41bbb37262a98f745aa00fbf0,
这样的话就会在我们的浏览器弹出来1,如果是页面的跳转,或者是一些其它脚本、病毒的话,可能对我们网站的安全造成很大的隐患。

最简单的解决办法
不要相信客户端的任何输入,在程序做严格的判断以及处理
htmlspecialchars进行过滤

csrf :
这个我们在学curl的时候做的模拟登陆就是跨站请求伪造!!!!
最简单的大白话就是:
a网站往b网站请求数据。
加个token防止下就行了,简单,粗暴,有效

Dos和Ddos防止:
阿里云 高防ip
idc机房
放弃一部分请求不处理。


正则方面的问题:

贪婪模式和非贪婪模式的区别:
贪婪模式匹配到内容之后会继续向后匹配
非贪婪模式则不回继续匹配


匹配中文字符的正则表达式: [\u4e00-\u9fa5]
评注:匹配中文还真是个头疼的事,有了这个表达式就好办了
匹配双字节字符(包括汉字在内):[^\x00-\xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
匹配空白行的正则表达式:\n\s*\r
评注:可以用来删除空白行
匹配HTML标记的正则表达式:706b83c79d2c696ac46a98098db7b11b]*>.*?c0f8603dd44f0db5dcc943cf687721b3|7ced4b295831648a0fce6ecb53f5fd4b
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力
匹配首尾空白字符的正则表达式:^\s*|\s*$
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式
匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
评注:表单验证时很实用
匹配网址URL的正则表达式:[a-zA-z]+://[^\s]*
评注:网上流传的版本功能很有限,上面这个基本可以满足需求
匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
评注:表单验证时很实用
匹配国内电话号码:\d{3}-\d{8}|\d{4}-\d{7}
评注:匹配形式如 0511-4405222 或 021-87888822
匹配腾讯QQ号:[1-9][0-9]{4,}
评注:腾讯QQ号从10000开始
匹配中国邮政编码:[1-9]\d{5}(?!\d)
评注:中国邮政编码为6位数字
匹配身份证:\d{15}|\d{18}
评注:中国的身份证为15位或18位
匹配ip地址:\d+\.\d+\.\d+\.\d+
评注:提取ip地址时有用
匹配特定数字:
^[1-9]\d*$    //匹配正整数
^-[1-9]\d*$   //匹配负整数
^-?[1-9]\d*$   //匹配整数
^[1-9]\d*|0$  //匹配非负整数(正整数 + 0)
^-[1-9]\d*|0$   //匹配非正整数(负整数 + 0)
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$   //匹配正浮点数
^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$  //匹配负浮点数
^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$  //匹配浮点数
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$   //匹配非负浮点数(正浮点数 + 0)
^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$  //匹配非正浮点数(负浮点数 + 0)
评注:处理大量数据时有用,具体应用时注意修正
匹配特定字符串:
^[A-Za-z]+$  //匹配由26个英文字母组成的字符串
^[A-Z]+$  //匹配由26个英文字母的大写组成的字符串
^[a-z]+$  //匹配由26个英文字母的小写组成的字符串
^[A-Za-z0-9]+$  //匹配由数字和26个英文字母组成的字符串
^\w+$  //匹配由数字、26个英文字母或者下划线组成的字符串

下面是一些特殊字符:
正则表达式中的特殊字符: (学习参考书-<<精通正则表达式>>)
字符
Bedeutung: Bei Zeichen bedeutet dies normalerweise die wörtliche Bedeutung, was darauf hinweist, dass es sich bei den folgenden Zeichen um Sonderzeichen ohne Erklärung handelt.
Zum Beispiel: /b/ entspricht dem Zeichen 'b', indem vor b ein Backslash eingefügt wird, d Wort.
Oder:
Bei mehreren Zeichen wird meist angegeben, dass sie etwas Besonderes sind, was darauf hinweist, dass die folgenden Zeichen nichts Besonderes sind und wörtlich interpretiert werden sollten.
Zum Beispiel: * ist ein Sonderzeichen, das mit einer beliebigen Anzahl von Zeichen übereinstimmt (einschließlich 0 Zeichen); zum Beispiel: /a*/ bedeutet, dass es mit 0 oder mehr Zeichen übereinstimmt.
Um ein Literal * zu finden, fügen Sie einen Backslash vor a ein; zum Beispiel: /a*/ entspricht „a*“.

Zeichen^
Bedeutung: Zeigt an, dass das passende Zeichen vorne stehen muss.
Zum Beispiel: /^A/ stimmt nicht mit dem „A“ in „an A“ überein, sondern mit dem ersten „A“ in „An A.“

Zeichen$
Bedeutung: Ähnlich wie ^, entspricht dem letzten Zeichen.
Zum Beispiel: /t$/ stimmt nicht mit dem „t“ in „eater“ überein, aber mit dem „t“ in „eat“.

Zeichen*
Bedeutung: Entspricht dem Zeichen vor * 0 oder n-mal.
Zum Beispiel: /bo*/ entspricht dem „boooo“ in „Ein Geist hat ausgebuht“ oder dem „b“ in „Ein Vogel trällerte“, stimmt aber mit keinem Zeichen in „Eine Ziege g
runted“ überein.

Zeichen +
Bedeutung: Passen Sie das Zeichen vor dem +-Zeichen ein- oder n-mal an. Entspricht {1,}.
Zum Beispiel: /a+/ entspricht dem „a“ in „candy“ und allen „a“ in „caaaaaaandy“.

Zeichen?
Bedeutung: Übereinstimmung mit dem Zeichen vor 0 oder 1 Mal.
Zum Beispiel: /e?le?/ entspricht dem „el“ in „angel“ und dem „le“ in „angle“.

Zeichen
Bedeutung: (Dezimalpunkt) entspricht allen einzelnen Zeichen außer Zeilenumbrüchen.
Zum Beispiel: /.n/ stimmt mit „an“ und „on“ in „nein, ein Apfel ist auf dem Baum“ überein, aber nicht mit „nein“.


Zeichen (x)
Bedeutung: Übereinstimmung mit „x“ und Notieren des übereinstimmenden Werts.
Zum Beispiel: /(foo)/ sucht nach „foo“ und zeichnet es in „foo bar“ auf. Der passende Teilstring kann von den Elementen [1], ..., [n] im Ergebnisarray oder von den Eigenschaften $1, ..., $9 des RegExp-Objekts zurückgegeben werden.

Zeichen x|y
Bedeutung: Übereinstimmung mit „x“ oder „y“.
Zum Beispiel: /green|red/ entspricht dem „Grün“ in „grüner Apfel“ und dem „Rot“ in „roter Apfel“.

Zeichen {n}
Bedeutung: n ist hier eine positive ganze Zahl. Entspricht den ersten n Zeichen.
Zum Beispiel: /a{2}/ stimmt nicht mit dem „a“ in „candy“ überein, sondern mit allen „a“ in „caandy“ und den ersten beiden
'a in „caaandy“. .

Zeichen {n,}
Bedeutung: n ist hier eine positive ganze Zahl. Entspricht mindestens n vorherigen Zeichen.
Zum Beispiel: /a{2,} stimmt nicht mit dem „a“ in „candy“ überein, sondern mit allen „a“ in „caandy“ und allen „a“ in „caaaaaaandy“.

Zeichen {n,m}
Bedeutung: n und m sind hier beide positive ganze Zahlen. Entspricht mindestens n und höchstens m vorherigen Zeichen.
Zum Beispiel: /a{1,3}/ stimmt mit keinem Zeichen in „cndy“ überein, stimmt aber mit dem „a“ in „candy“ und den ersten beiden
„a“ in „caandy“ überein. Und die ersten drei 'a's in "caaaaaaandy", Hinweis: Auch wenn es viele 'a's in "caaaaaaandy" gibt, stimmt es nur mit den ersten drei
'a's überein, also mit "aaa".

Zeichen [xyz]
Bedeutung: Eine Liste von Zeichen, die mit jedem Zeichen in der Liste übereinstimmen. Mit dem Bindestrich - können Sie einen Zeichenbereich angeben.
Zum Beispiel: [abcd] ist dasselbe wie [a-c]. Sie entsprechen dem „b“ in „brisket“ und dem „c“ in „ache“.

Zeichen[^xyz]
Bedeutung: Ein-Zeichen-Komplement, d. h. es stimmt mit allem außer den aufgelisteten Zeichen überein. Sie können Bindestriche verwenden, um einen
-Zeichenbereich anzugeben.
Zum Beispiel: [^abc] und [^a-c] sind gleichwertig, sie stimmen zuerst mit dem „r“ in „brisket“ und dem „h“ in „chop“ überein.

Zeichen
Bedeutung: Entspricht einem Leerzeichen (nicht zu verwechseln mit b)

Zeichen b
Bedeutung: Entspricht einer Trennlinie eines Wortes, z. B. einem Leerzeichen (nicht zu verwechseln). zu verwechseln)
Zum Beispiel: /bnw/ entspricht dem „no“ in „noonday“, /wyb/ entspricht dem „ly“ in „möglicherweise gestern“.

Zeichen B
Bedeutung: Entspricht der geschützten Zeile eines Wortes
Zum Beispiel: /wBn/ entspricht dem „on“ in „noonday“, /yBw/ entspricht dem „in“möglicherweise gestern.“ Ja.

Zeichen cX
Bedeutung: Das X ist hier ein Steuerzeichen. Entspricht einer Zeichenfolge aus Steuerzeichen.
Zum Beispiel: /cM/ entspricht Control-M in einer Zeichenfolge.

Zeichen d
Bedeutung: Entspricht einer Zahl, äquivalent zu [0-9].
Zum Beispiel: /d/ oder /[0-9]/ entspricht der „2“ in „B2 ist die Suite-Nummer.“

Zeichen D
Bedeutung: Entspricht einer beliebigen Zahl, die keine Zahl ist, entsprechend [^0-9].
Zum Beispiel: /D/ oder /[^0-9]/ entspricht dem „B“ in „B2 ist die Suite-Nummer.“

Zeichen f
Bedeutung: Entspricht einem Formularzeichen

Zeichen n
Bedeutung: Übereinstimmung mit einem Zeilenumbruchzeichen

Zeichen r
Bedeutung: Übereinstimmung mit einem Wagenrücklaufzeichen

Zeichen s
Bedeutung: Übereinstimmung mit einem einzelnen Leerzeichen, einschließlich Leerzeichen, Tabulatorzeichen und Formular Feed, Zeilenumbruchzeichen, entspricht [fnrtv].
Zum Beispiel: /sw*/ stimmt mit „bar“ in „foo bar“ überein.

Zeichen S
Bedeutung: Entspricht einem einzelnen Zeichen außer Leerzeichen, äquivalent zu [^ fnrtv].
Zum Beispiel: /S/w* stimmt mit „foo“ in „foo bar“ überein.

Zeichen t
Bedeutung: Entspricht einem Tabulatorzeichen

Zeichen v
Bedeutung: Entspricht einem Kopfzeilen-Tabulatorzeichen

Zeichen w
Bedeutung: Entspricht allen Zahlen, Buchstaben und Unterstriche, äquivalent zu [A-Za-z0-9_].
Zum Beispiel: /w/ entspricht dem „a“ in „apple“, der „5“ in „$5,28“ und der „3“ in „3D“.

Zeichen W
Bedeutung: Entspricht anderen Zeichen außer Zahlen, Buchstaben und Unterstrichen, äquivalent zu [^A-Za-z0-9_].
Zum Beispiel: /W/ oder /[^$A-Za-z0-9_]/ entspricht dem „%“ in „50 %“.

Zeichen n
Bedeutung: n ist hier eine positive ganze Zahl. Der Wert von n, der mit der letzten Teilzeichenfolge eines regulären Ausdrucks übereinstimmt (linke Klammern mitgezählt).


Probleme mit PHP-Funktionen:

1. Array-Funktion

array_key_exists bestimmt, ob der Schlüssel existiert
is_array bestimmt, ob es sich um ein Array handelt
in_array bestimmt, ob der angegebene Wert in den Daten erscheint
array_count_values ​​​​bestimmt, wie oft der Wert erscheint
array_search array search
array_merge array merge
array_map verwendet eine benutzerdefinierte Funktion für jedes Element des array
array_change_case ändert das Array Key case
sort array sorting
array_push Fügt ein oder mehrere Elemente am Ende des Arrays ein
array_pop Pop das letzte Element des Arrays
array_unshift Fügt mehrere Elemente ein der Anfang des Arrays
array_shift Das erste Element der Array-Elemente öffnen
Array in String implodieren
Shuffle die Sortierung des Arrays unterbrechen
array_rand zufällig mehrere Einheiten aus dem Array entfernen
array_chunk teilen das Array in ein neues Array umwandeln
array_diff different set
array_inestsert Intersection
array_flip Schlüsselwerte austauschen
array_keys Alle Schlüssel des Arrays zurückgeben
count Berechnet die Länge des Arrays

2. String-Funktion
addcslashes – Füge Backslashes zu einigen Zeichen in der Zeichenfolge hinzu. Escape-Zeichen
addslashes – Escape-Zeichen in einer Zeichenfolge auf eine bestimmte Art und Weise.
bin2hex – Binärdaten in hexadezimale Darstellung konvertieren.
chop – Alias ​​Funktion von rtrim()
chr – Gibt den ASCII-Code eines Zeichens zurück
chunk_split – Teilt eine Zeichenfolge entsprechend einer bestimmten Zeichenlänge in kleine Teile auf
convert_cyr_string – Konvertiert kyrillische Zeichen in andere Zeichen
Convert_uudecode – Entschlüsselt eine Zeichenfolge
convert_uuencode – Verschlüsselt eine Zeichenfolge
count_chars – Gibt die Zeichenverwendungsinformationen in einer Zeichenfolge zurück
crc32 – Berechnet das crc32-Polynom einer Zeichenfolge
crypt – Einweg-Hash-Verschlüsselungsfunktion
echo – Zum Anzeigen einiger Inhalte verwenden
explode – Konvertieren Sie eine Zeichenfolge mithilfe von Trennzeichen in ein Array
fprintf – Geben Sie Daten nach Bedarf zurück und schreiben Sie sie direkt in den Dokumentstrom
get_html_translation_table – Gibt mögliche HTML-Entitäten zurück konvertiert
hebrev – Konvertieren Sie eine hebräisch codierte Zeichenfolge in visuellen Text.
hebrevc – Konvertieren Sie eine hebräisch codierte Zeichenfolge in visuellen Text.
html_entity_decode – Die Umkehrfunktion der Funktion htmlentities(). Konvertieren Sie HTML-Entitäten. Konvertieren Sie sie in Zeichen
htmlentities – Konvertieren Sie einige Zeichen in der Zeichenfolge in HTML-Entitäten.
htmlspecialchars_decode – Die Umkehrfunktion der Funktion htmlspecialchars(). Konvertieren Sie HTML-Entitäten in Zeichen.
htmlspecialchars – Konvertieren Sie einige Zeichen in der Zeichenfolge in HTML-Entitäten
implode – Konvertiert ein Array in einen String mit einem bestimmten Trennzeichen
join – Konvertiert ein Array in einen String, Alias ​​der implode()-Funktion
levenshtein – Berechnet die Differenz zwischen zwei Wörtern
localeconv – Zahl abrufen -bezogene Formatdefinitionen
ltrim – Entfernen Sie die Leerzeichen oder angegebenen Zeichen auf der linken Seite der Zeichenfolge
md5_file – Verschlüsseln Sie eine Datei mit dem MD5-Algorithmus
md5 – Verschlüsseln Sie eine Zeichenfolge mit dem MD5-Algorithmus
metaphone – Bestimmen Sie die Ausspracheregeln einer Zeichenfolge.
money_format. – Formatieren Sie die Ausgabe von Zahlen gemäß Parametern „076402276aae5dbec7f672f8f4e5cc81“
number_format – formatierte Ausgabe von Zahlen nach Parametern
ord – wandelt einen ASCII-Code in ein Zeichen um
parse_str – wandelt einen String in ein bestimmtes Format für Variablen und Werte um
print – wird zur Ausgabe eines einzelnen Werts verwendet
printf – zeigt die Daten nach Bedarf an
quoted_printable_decode – verschlüsselt eine Zeichenfolge in eine 8-Bit-Binärzeichenfolge
quotemeta – maskiert mehrere spezifische Zeichen
rtrim – Entfernen Sie die Leerzeichen oder angegebenen Zeichen auf der rechten Seite der Zeichenfolge.
setlocale – Legen Sie das lokale Format für Zahlen, Datumsangaben usw. fest.
sha1_file – Führen Sie den SHA1-Algorithmus für eine Datei aus. Verschlüsselung
sha1 – Verschlüsseln Sie eine Zeichenfolge mit SHA1-Algorithmus
similar_text – Vergleichen Sie zwei Zeichenfolgen und geben Sie die Anzahl ähnlicher Zeichen zurück, die vom System berücksichtigt werden
soundex – Bestimmen Sie die Ausspracheregeln einer Zeichenfolge.
sprintf – Geben Sie die Daten nach Bedarf zurück, geben Sie sie jedoch nicht aus.
sscanf – Sie können die Zeichenfolge formatieren.
str_ireplace – Vergleichen und ersetzen Sie sie wie die Funktion str_replace(). Zeichenfolgen , aber ohne Berücksichtigung der Groß- und Kleinschreibung
str_pad – Auffüllen auf beiden Seiten einer Zeichenfolge
str_repeat – wiederholte Kombinationen von Zeichenfolgen
str_replace – Abgleichen und Ersetzen von Zeichenfolgen
str_rot13 – Zeichenfolgenzeichenfolgen Führen Sie eine ROT13-Verschlüsselungsverarbeitung durch
str_shuffle – Sortieren Sie die Zeichen in einer Zeichenfolge zufällig.
str_split – Teilen Sie eine Zeichenfolge entsprechend dem Zeichenabstand in ein Array auf.
str_word_count – Rufen Sie die englischen Wortinformationen in der Zeichenfolge ab.
strcasecmp – Vergleicht Zeichenfolgen nach Größe, ohne Berücksichtigung der Groß- und Kleinschreibung
strchr – Gibt einen Teil einer Zeichenfolge durch Vergleich zurück. Ein Alias ​​für die Funktion strstr().
strcmp – Vergleicht Zeichenfolgen nach Größe.
strcoll – Vergleicht die Größe von Zeichenfolgen basierend auf lokalen Einstellungen.
strcspn – Gibt die zurück Wert der kontinuierlichen nicht übereinstimmenden Länge von Zeichen
strip_tags – HTML- und PHP-Code in einer Zeichenfolge entfernen
stripkslashes – Anti-Escape der Funktion addcslashes() escape Verarbeitete Zeichenfolge
stripos – Position von finden und zurückgeben Bei der ersten Übereinstimmung wird beim Vergleich die Groß-/Kleinschreibung nicht beachtet.
stripslashes – Escape der Funktion addslashes() aufheben, um die verarbeitete Zeichenfolge zu maskieren.
stristr – Pass-Vergleich gibt einen Teil einer Zeichenfolge zurück. Beim Vergleich wird die Groß-/Kleinschreibung nicht beachtet.
strlen – Ruft ab die codierte Länge einer Zeichenfolge
strnatcasecmp – Vergleicht Zeichenfolgen mit natürlicher Sortierung, ohne Berücksichtigung der Groß- und Kleinschreibung
strnatcmp – Verwendet natürliche Sortierung, um Zeichenfolgen zu vergleichen
strncasecmp – Vergleicht die ersten N Zeichen einer Zeichenfolge, ohne Berücksichtigung der Groß- und Kleinschreibung
strncmp – Vergleichen Sie die ersten N Zeichen einer Zeichenfolge.
strpbrk – Gibt einen Teil einer Zeichenfolge durch Vergleich zurück.
strpos – Findet und gibt die Position der ersten Übereinstimmung zurück.
strrchr – Gibt einen Teil einer Zeichenfolge zurück durch Rückwärtsvergleich Alle darin enthaltenen Buchstaben sind in umgekehrter Reihenfolge angeordnet
strripos – Suchen Sie von hinten nach vorne und geben Sie die Position der ersten Übereinstimmung zurück, beim Vergleich wird die Groß-/Kleinschreibung nicht beachtet
strrpos – Suchen Sie von hinten nach vorne und geben Sie die zurück Position der ersten Übereinstimmung
strspn – Vergleichen Sie den Wert der Länge aufeinanderfolgender Zeichenvorkommen und geben Sie ihn zurück.
strstr – Geben Sie einen Teil einer Zeichenfolge durch Vergleich zurück.
strtok – Teilen Sie eine Zeichenfolge mit einer angegebenen Anzahl von Zeichen
strtolower – Konvertieren Sie eine Zeichenfolge in Kleinbuchstaben.
strtoupper – Konvertieren Sie die Zeichenfolge in Großbuchstaben.
strtr – Vergleichen und ersetzen Sie die Zeichenfolge.
substr_compare – Vergleichen Sie die abgeschnittene Zeichenfolge.
substr_count – Zählen Sie das Vorkommen eines bestimmten Zeichensegment in der Zeichenfolge Times
substr_replace – Ersetzen Sie einige Zeichen in der Zeichenfolge.
substr – Schneiden Sie die Zeichenfolge ab.
trim – Entfernen Sie die Leerzeichen oder angegebenen Zeichen auf beiden Seiten der Zeichenfolge.
ucfirst – Ersetzen Sie das Gegebene string Wandeln Sie den ersten Buchstaben jedes englischen Wortes in Großbuchstaben um
ucwords – Wandeln Sie den ersten Buchstaben jedes englischen Wortes in der angegebenen Zeichenfolge in Großbuchstaben um
vfprintf – Geben Sie die Daten nach Bedarf zurück und schreiben Sie sie direkt in den Dokumentstream
vprintf – Zeigt die Daten nach Bedarf an
vsprintf – Gibt die Daten nach Bedarf zurück, aber gibt sie nicht aus
wordwrap – Teilen Sie die Zeichenfolge entsprechend einer bestimmten Zeichenlänge auf



Was sagen Sie zu Codierungsstandards?

Als wir die Schnittstelle geschrieben haben, haben wir eine einheitliche Überprüfung und Rückgabe geschrieben

Erforderlich ist, dass jede Datei ihre eigene Annotation hat, jede Klasse ihre eigene Annotation haben muss und jede Methode mit Kommentaren versehen sein muss. Für unsichere Bedürfnisse oder Probleme, die später auftreten können, muss todo hinzugefügt werden.

Die Schlüssellogik muss kommentiert werden.

Beim Aufruf externer Schnittstellen kann sie nicht im Programm fest codiert werden und muss es sein Es wird empfohlen, eine Konfigurationsdatei zu erstellen, um spätere Änderungen zu erleichtern.

Datenbankoperationen müssen im Modell geschrieben werden und Datenbankoperationen dürfen nicht in der C-Schicht geschrieben werden.

Variablennamen müssen ihre Bedeutung klar zum Ausdruck bringen können.

Das Schnittstellendokument muss vor dem Schreiben der Schnittstelle fertiggestellt sein.

Private Methoden müssen hinzugefügt werden_ [Wichtig, ich scheine auch ein erfahrener Fahrer zu sein]



Klassendateien haben alle das Suffix .class.php (hier bezieht sich auf Die von ThinkPHP intern verwendeten Klassenbibliotheksdateien stellen keine extern geladenen Klassenbibliotheksdateien dar. Verwenden Sie die Kamel-Schreibweise, und der erste Buchstabe wird groß geschrieben, z. B.

Namespace-Adresse und Pfad des class Die Adresse ist konsistent. Der Pfad, in dem sich die HomeControllerUserController-Klasse befindet, sollte beispielsweise Application/Home/Controller/UserController.class.php sein Groß-/Kleinschreibung wird beachtet. (ThinkPHP prüft die Groß-/Kleinschreibung auch auf der Windows-Plattform im Debugging-Modus strikt.)
Der Klassenname und der Dateiname sind konsistent (einschließlich der oben genannten Groß-/Kleinschreibung). Der Dateiname der UserController-Klasse lautet beispielsweise UserController .class.php, der Dateiname der InfoModel-Klasse lautet InfoModel.class.php,
und die Klassenbenennung verschiedener Klassenbibliotheken hat bestimmte Standards

Funktionen, Konfigurationsdateien und andere Klassenbibliotheksdateien als andere Klassenbibliotheksdateien werden im Allgemeinen .php als Suffix benannt (nicht erforderlich, wenn sie von einem Dritten eingeführt werden);函数的命名使用小写字母和下划线的方式,例如 get_client_ip;

方法的命名使用驼峰法,并且首字母小写或者使用下划线“_”,例如 getUserName,_parseType,通常下划线开头的方法属于私有方法;
属性的命名使用驼峰法,并且首字母小写或者使用下划线“_”,例如 tableName、_instance,通常下划线开头的属性属于私有属性;
以双下划线“__”打头的函数或方法作为魔法方法,例如 __call 和 __autoload;

常量以大写字母和下划线命名,例如 HAS_ONE和 MANY_TO_MANY;

配置参数以大写字母和下划线命名,例如HTML_CACHE_ON;

语言变量以大写字母和下划线命名,例如MY_LANG,以下划线打头的语言变量
通常用于系统语言变量,例如 _CLASS_NOT_EXIST_;

对变量的命名没有强制的规范,可以根据团队规范来进行;

ThinkPHP的模板文件默认是以.html 为后缀(可以通过配置修改);

数据表和字段采用小写加下划线方式命名,并注意字段名不要以下划线开头,例
如 think_user 表和 user_name字段是正确写法,类似 _username 这样的数据表字段可能会被过滤。


tp底层看过没有?


1、看过框架的底层没有?
    看过tp的数据库驱动相关。 关于配置数据库方面的,在配置文件配置就直接可以使用各种数据库类型,自己简单看了下,主要就是通过一个driver(驱动类)来判断当前连接类
型,然后调用对于的数据库操作类。
    ps:如果是要我们自己实现的话,可以借助接口,每个数据库的操作类都需要集成一个接口,然后根据具体的配置去调用每个操作类。 就算后期我修改了数据库的类型,也不
会导致程序需要改动。

2、看过tp的cache类,和数据库类似,修改过redis的cache类,因为tp的redis操作类不支持认证。
  主要就是在redis操作类添加了个认证

$this->handler  = new \Redis;
        $options[&#39;timeout&#39;] === false ?
            $this->handler->$func($options[&#39;host&#39;], $options[&#39;port&#39;]) :
            $this->handler->$func($options[&#39;host&#39;], $options[&#39;port&#39;], $options[&#39;timeout&#39;]);
            $this -> handler->auth( C(‘REDIS_AUTH_KEY’) );

3、看过tp的处理异常类
路径  ThinkPHP/library/Think/Think.class.php

主要使用的是php自带的错误处理相关函数

register_shutdown_function 定义PHP程序执行完成后执行的函数
set_error_handler    设置用户自定义的错误处理程序
set_exception_handler 设置自己的异常处理机制

借助 get_last_error获取最后一次报错的信息
根据报错级别可以自定义写日志
这个地方我们在做接口的时候纪录了一些错误日志,帮助我们排查一些问题。
如果要看文件加载以及调用关系可以借助 print_debug_backtrace获取文件加载的顺序

     // 注册AUTOLOAD方法
      spl_autoload_register(&#39;Think\Think::autoload&#39;);      
      // 设定错误和异常处理
      register_shutdown_function(&#39;Think\Think::fatalError&#39;);
      set_error_handler(&#39;Think\Think::appError&#39;);
      set_exception_handler(&#39;Think\Think::appException&#39;);

4、简单看了下tp的命名空间自动记载
框架下的核心类都包含进来了,其他的事借助 spl_register_autoload实现。

Das obige ist der detaillierte Inhalt vonPHP-Interviewfragen zusammengestellt und geteilt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn