Heim  >  Artikel  >  Backend-Entwicklung  >  Zusammenfassung des PHP-Interviews

Zusammenfassung des PHP-Interviews

WBOY
WBOYOriginal
2016-07-29 09:14:511014Durchsuche

Seit meiner Ankunft in Peking am 15. August ist bis heute mehr als ein Monat vergangen. In dieser Zeit habe ich mich auf schriftliche Prüfungen und Vorstellungsgespräche vorbereitet, bei mehr als 10 großen und kleinen Unternehmen Vorstellungsgespräche geführt und bin erst vor Kurzem sesshaft geworden. Ich hatte das Gefühl, während des Interviews sehr gewachsen zu sein. Als ich zum ersten Mal in dieser fremden Stadt ankam, wusste ich nicht, wie ich mit der U-Bahn fahren, mich in Busse zwängen oder ein normales Leben führen sollte. . .

Das Vorstellungsgespräch ist die erste Hürde auf dem Weg zum Arbeitsplatz. Da meine Schule zu gewöhnlich ist, bin ich im Vergleich zu denen mit höherer Bildung sehr zuversichtlich. fallen. Die Richtung meines Interviews ist die eines PHP-Entwicklungsingenieurs, der hauptsächlich am Website-Backend, der APP-Schnittstelle usw. arbeitet. Die von mir interviewten Unternehmen, Testfragen und Erfahrungen finden Sie alle auf meiner persönlichen Website. Wenn Sie interessiert sind, können Sie sie sich ansehen: http://dwz.cn/1KMpea. Das Folgende sind die allgemeinen Wissenspunkte, die ich in dieser Zeit in Interviews zusammengefasst habe. Ich hoffe, dass sie für alle hilfreich sind. Bitte zögern Sie nicht, auf etwaige Fehler hinzuweisen.

Zusammenfassung:

Ich habe den PHP-Teil anhand der in Interviews häufig gestellten Fragen zusammengefasst. Die folgenden Fragen tauchen in Interviews häufig auf. Die Fragen sind relativ einfach

--------------- - ---PHP-Teil-------

Der Unterschied zwischen mehreren Ausgabefunktionen echo, print(), print_r(), sprintf(), var_dump() in PHP

1: echo: ist a Anweisung, nicht Funktionen haben keinen Rückgabewert und können mehrere Variablenwerte ohne Klammern ausgeben. Arrays und -Objekte können nicht ausgegeben werden, es können nur einfache Typen (wie int, string) gedruckt werden.

2: print: Es ist eine Anweisung, keine Funktion. Sie hat einen Rückgabewert von 1 und kann nur eine Variable ausgeben. Es sind keine Klammern erforderlich. Arrays und -Objekte können nicht ausgegeben werden, es können nur einfache Typen (wie int, string) gedruckt werden.

3: print_r: ist eine Funktion, die zusammengesetzte Typen wie String, Int, Float, Array, Objekt usw. drucken kann,

Ausgabe Das Array wird durch eine Struktur dargestellt, und Sie können print_r($str,true) verwenden, um die Ausgabe von print_r zu verhindern und den von print_r verarbeiteten Wert zurückzugeben

4: printf : Es ist eine Funktion, die die Textausgabe nach der Formatierung konvertiert (siehe C-Sprache)

5: sprintf: ist eine Funktion, ähnlich wie printf, druckt jedoch nicht, sondern gibt den formatierten Text zurück (Diese Funktion konvertiert den formatierten Text in Die Zeichenfolge wird in eine Variable geschrieben und nicht ausgegeben), ansonsten ist sie dasselbe wie printf.

Zum Beispiel: $str = "Hallo"; $number = 123;

$txt = sprintf("%s Welttag number %u",$str,$number); //Ausgabe: Hallo Welt. Tag Nummer 123

6: var_dump(): Funktion, Ausgabe des Inhalts, Typs oder Strings von der variable Inhalt, Typ, Länge. Wird oft zum Debuggen verwendet.

Schreiben Sie eine Funktion, um das Problem zu lösen, dass mehrere Threads gleichzeitig eine Datei lesen und schreiben.

<span> 1</span> <?<span>php
</span><span> 2</span><span>$fp</span> = <span>fopen</span>("/tmp/lock.txt","w+"<span>);
</span><span> 3</span><span>if</span>(<span>flock</span>(<span>$fp</span>, LOCK_EX)){<span>//</span><span> 进行排它型锁定</span><span> 4</span><span>fwrite</span>(<span>$fp</span>,"Write something here\n"<span>);
</span><span> 5</span><span>flock</span>(<span>$fp</span>, LOCK_UN);<span>//</span><span> 释放锁定</span><span> 6</span>     }<span>else</span><span>{
</span><span> 7</span><span>echo</span> "Couldn't lock the file !"<span>;
</span><span> 8</span><span>    }
</span><span> 9</span><span>fclose</span>(<span>$fp</span><span>);
</span><span>10</span> ?>

Cookie deaktivieren Sitzung Nutzungsplan, Sitzung auf Ablaufmethode setzen , entsprechende Funktion:

Übergeben Sie den Wert über die URL und übergeben Sie die Sitzung id An die URL angehängt (Nachteil: Es kann keine rein statischen Seiten auf der gesamten Website geben, da die rein statische Seite Session id nicht an die nächste Seite weitergegeben wird)

übergeben Um das Formular auszublenden, geben Sie die Sitzung-ID in das ausgeblendete Textfeld des Formulars ein und senden Sie sie zusammen mit dem Formular (Nachteil: Dies gilt nicht für Nicht-Formular-Situationen wie < ;a> Tags, die direkt springen)

Konfigurieren Sie die php.ini-Datei direkt und setzen Sie die Session.use_trans_sid= 0 in der php.ini-Datei auf 1 (Es scheint unter Win nicht unterstützt zu werden)

Speichern Sie die Sitzungs--ID in Dateien, Datenbanken usw. und rufen Sie

manuell auf

<span> 1</span> 第一种  <span>setcookie</span><span>() 直接用setcookie设置<strong>Session</strong> id的生命周期。
</span><span> 2</span><span> 3</span><span>$lifetime</span>=60; <span>//</span><span>保存1分钟 </span><span> 4</span><span><strong>Session</strong>_start</span><span>(); 
</span><span> 5</span><span>setcookie</span>(<span><strong>Session</strong>_name</span>(), <span><strong>Session</strong>_id</span>(), <span>time</span>()+<span>$lifetime</span>, "/"<span>);
</span><span> 6</span> 第二种  <span><strong>Session</strong>_set_cookie_params</span><span>()    
</span><span> 7</span><span>$lifetime</span>=60;<span>//</span><span>保存1分钟</span><span> 8</span><span><strong>Session</strong>_set_cookie_params</span>(<span>$lifetime</span><span>);
</span><span> 9</span><span><strong>Session</strong>_start</span><span>();
</span><span>10</span><span><strong>Session</strong>_regenerate_id</span>(<span>true</span><span>);
</span><span>11</span>     其中<strong>Session</strong>_regenerate_id();方法用于改变当前<strong>Session</strong>_id的值,并保留<strong>Session</strong>中数组的值。参数默认为 <span>false</span>,如果设置为true则改变<strong>Session</strong>_id的值,并清空当前<strong>Session</strong>数组。

Was sind die Merkmale von JSON-Formatdaten? > JSON ist ein leichtes Datenaustauschformat. Es basiert auf einer Teilmenge von ECMAScript. JSON verwendet ein völlig sprachunabhängiges Textformat, verwendet aber auch Konventionen ähnlich der C-Sprachfamilie (einschließlich C, C, C#, Java, JavaScript, Perl, Python usw.). Diese Eigenschaften machen JSON zu einer idealen Datenaustauschsprache. Für Menschen leicht zu lesen und zu schreiben und für Maschinen leicht zu analysieren und zu generieren (Netzwerkübertragungsrate).

Die Struktur von JSON basiert auf den folgenden zwei Punkten

1. Sammlung von „Name/Wert“-Paaren

In verschiedenen Sprachen wird es als Objekt

(Objekt), Datensatz (Datensatz), Struktur (Struktur), Wörterbuch (Wörterbuch), Hash-Tabelle (Hash-Tabelle), Schlüsselliste (Schlüsselliste) usw. verstanden . 2. Eine geordnete Liste von Werten wird in den meisten Sprachen als Array verstanden

PHP-Methode zum Abrufen von Dateiinhalten, entsprechende Funktion

1: file_get_contents ruft den Inhalt der Datei ab (kann per get und post abgerufen werden) und die gesamte Datei wird in einen String eingelesen

2: Verwenden Sie fopen, um die URL zu öffnen und den Inhalt in der get-Methode abzurufen (mit Hilfe der Funktion fgets())

3: Verwenden Sie die Funktion fsockopen um die URL zu öffnen (kann in den Get- und Post-Methoden abgerufen werden), erhalten Sie im Get-Modus vollständige Daten, einschließlich Header und Body

4: Verwenden Sie zum Abrufen die Curl-Bibliothek Inhalt. Bevor Sie die Curl-Bibliothek verwenden, müssen Sie in php.ini überprüfen, ob die Curl-Erweiterung aktiviert ist.

Was sind die allgemeinen PHP-Array-Funktionen? (Die Rolle von array_merge, in_array)

1. Grundfunktionen von Array-Operationen

array_values($arr) ; //Den Wert des Arrays abrufen

array_keys($arr); Holen Sie sich den Schlüsselnamen des Arrays

array_flip($arr); //Die Werte und Schlüsselnamen im Array werden ausgetauscht (wenn es Duplikate gibt, wird es der vorherige sein). durch das spätere überschrieben)

array_search('PHP',$arr); //Den angegebenen Wert abrufen, das Hinzufügen von true ist eine strikte Typprüfung

array_reverse($arr); "apple", $arr); //Apple abrufen

im Array array_key_exists("apple", $arr); Rufen Sie ab, ob der angegebene Schlüssel im Array vorhanden ist

array_count_values($arr); 2. Array-Segmentierung und -Füllung

array_slice($arr, 0, 3); //Sie können ein Segment des Arrays herausnehmen, diese Funktion ignoriert den Schlüsselnamen (Array-Segmentierung)

array_splice($arr, 0, 3,array("black","maroon")); //Sie können einen Abschnitt des Arrays herausnehmen Funktion ist, dass die zurückgegebene Sequenz aus dem ursprünglichen Array gelöscht wird

array_chunk($arr, 3, TRUE); //Ein Array kann in Vielfache aufgeteilt werden, TRUE ist reserviert. Schlüsselname des ursprünglichen Arrays (aufgeteilt in mehrere Arrays)

4. Arrays und Stapel, Warteschlange

array_push($arr, "apple", "pear"); // Ein oder mehrere Elemente an das Ende des Array-Stacks schieben (push ) , gib die Anzahl der auf den Stapel verschobenen Elemente zurück

array_pop($arr); // Pop (pop) das letzte Element des Array-Stacks

array_shift($arr); // Das erste Element im Array wird verschoben und zurückgegeben (die Array-Länge wird um 1 reduziert, andere Elemente werden um eine Position nach vorne verschoben, der numerische Schlüsselname lautet geändert, um von Null an zu zählen, Text Der Schlüsselname bleibt unverändert)

array_unshift($arr,"a",array(1,2)); //Fügen Sie ein oder mehrere Elemente ein der Anfang des Arrays

6. Array-Sortierung

sort($arr); //Von klein nach groß, ignorieren Schlüsselnamen

rsort($ arr); //Von groß nach klein, ignoriere den Schlüsselnamen

asort($arr); Behalten Sie den Schlüsselnamen bei
arsort($ arr); // Von groß nach klein, behalten Sie die Schlüsselnamen bei

ksort($arr); > krsort($arr); // Nach Schlüsselnamen in umgekehrter Reihenfolge sortieren

7. Array-Berechnung

array_sum($arr); //Summationsoperation für alle Elemente innerhalb des Arrays ausführen (Summe der Array-Elemente)

array_merge($arr1, $arr2); //Zwei oder mehr zusammenführen (derselbe String-Schlüsselname, letzterer überschreibt den vorherigen, derselbe numerische Schlüsselname, letzterer wird am Ende angehängt )

array_diff($arr1, $arr2); //Das Differenzergebnis-Array zurückgeben

array_diff_assoc ($arr1, $arr2, $arr3); //Das Ergebnisarray der Differenzmenge zurückgeben, und die Schlüsselnamen werden ebenfalls verglichen

array_intersect ($arr1, $arr2); //Das Schnittpunkt-Ergebnis-Array zurückgeben array_intersect_assoc($arr1, $arr2); //Das Schnittpunkt-Ergebnis-Array zurückgeben, die Schlüsselnamen werden ebenfalls verglichen

8. Andere Array-Funktion

array_unique($arr); //Entferne doppelte Werte im Array, der ursprüngliche Schlüsselname bleibt im neuen Array erhalten

shuffle($arr); // die Reihenfolge des Arrays mischen


php magic Methoden und magische Konstanten

方法:__construct(),__destruct(),    方法重载:__call(),__callStatic()。

属性重载:__get(),__set(),__isset(),__unset(),这四个只对类中,私有,受保护的成员属性有效

__toString(),__autoload();

_set_state(); //自 PHP 5.1.0 起当调用 var_export() 导出类时,此静态 方法会被调用。 本方法的唯一参数是一个数组。

 

__clone();       //通常用于对副本进行重新初始化,

说明:this指副本对象引用,that指原对象引用 等方法在 PHP 中被称为”魔术方法”。PHP 将所有以 __(两个下划线)开头的类方法保留为魔术方法。所以在定义类方法时,除了上述魔术方法,建议不要以 __ 为前缀。在命名自己的类方法时不能使用这些方法名,除非是想使用其魔术功能。

 

常量:__LINK__     //文件中的当前行号

        __FILE__       //文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。

        __DIR__       //文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录,它等价于 dirname(__FILE__)。

 

        __FUNCTION__      //函数名称。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。

        __CLASS__             //类的名称。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。

        __METHOD__        //类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。

        __NAMESPACE__   //当前命名空间的名称(大小写敏感)。这个常量是在编译时定义的(PHP 5.3.0 新增)

PHP 如何获取客户端的IP地址,

用$_SERVER获取的IP地址有什么问题?

$_SERVER['REMOTE_ADDR'] ;   通过全局数组来获得 

getenv('REMOTE_ADDR') ; 通过环境变量来获得

当客户机使用代理的时候获取不到真实的IP地址

写一个函数,可以遍历文件夹下的所有文件和文件夹。

<span> 1</span><span>function</span> get_dir_info(<span>$path</span><span>){
</span><span> 2</span><span>$handle</span> = <span>opendir</span>(<span>$path</span>);<span>//</span><span>打开目录返回句柄</span><span> 3</span><span>while</span>((<span>$content</span> = <span>readdir</span>(<span>$handle</span>))!== <span>false</span><span>){
</span><span> 4</span><span>$new_dir</span> = <span>$path</span> . DIRECTORY_SEPARATOR . <span>$content</span><span>;
</span><span> 5</span><span>if</span>(<span>$content</span> == '..' || <span>$content</span> == '.'<span>){
</span><span> 6</span><span>continue</span><span>;
</span><span> 7</span><span>                }
</span><span> 8</span><span>if</span>(<span>is_dir</span>(<span>$new_dir</span><span>)){
</span><span> 9</span><span>echo</span> "<br>目录:".<span>$new_dir</span> . '<br>'<span>;
</span><span>10</span>                       get_dir_info(<span>$new_dir</span><span>);
</span><span>11</span>                 }<span>else</span><span>{
</span><span>12</span><span>echo</span> "文件:".<span>$path</span>.':'.<span>$content</span> .'<br>'<span>;
</span><span>13</span><span>                }
</span><span>14</span><span>          }
</span><span>15</span><span>      }
</span><span>16</span>       get_dir_info(<span>$dir</span>);

有mail.log的一个文档,内容为若干邮件地址,用’\n’分隔换行。挑选sina.com的地址(包括从文件读取、过滤到列印出来)。

思路1:用正则表达式(比较慢,效率地,不推荐用)

思路2:cat mail.log | grep sina.com

PHP缓存技术有哪些? tp是局部还是完全缓存?

1. 全页面静态化缓存,也就是将页面全部生成html静态页面,用户访问时直接访问的静态页面,而不会去走php服务器解析的流程
2. 页面部分缓存,将一个页面中不经常变的部分进行静态缓存,而经常变化的块不缓存,最后组装在一起显示
3. 数据缓存,通过一个id进行请求的数据,将数据缓存到一个php文件中,id和文件是对应的,下次通过这个id进行请求时 直接读php文件
4. 查询缓存,和数据缓存差不多,根据查询语句进行缓存;
5. 常用的缓存技术有:redis和memcache
个人认为tp应该是全局缓存 因为:tp缓存实在本地生成一个php文件来存储数据库中读取出来的数据

strlen()与mb_strlen的作用与区别

在PHP中,strlen与mb_strlen是求字符串长度的函数

PHP内置的字符串长度函数strlen无法正确处理中文字符串,它得到的只是字符串所占的字节数。对于GB2312的中文编码,strlen得到的值是汉字个数的2倍,而对于UTF-8编码的中文,就是3倍(在 UTF-8编码下,一个汉字占3个字节)。

 

采用mb_strlen函数可以较好地解决这个问题。mb_strlen的用法和strlen类似,只不过它有第二个可选参数用于指定字符编码。例如得到UTF-8的字符串$str长度,可以用 mb_strlen($str,'UTF-8')。如果省略第二个参数,则会使用PHP的内部编码。内部编码可以通过 mb_internal_encoding()函数得到。


需要注意的是,mb_strlen并不是PHP核心函数,使用前需要确保在php.ini中加载了php_mbstring.dll,即确保“extension=php_mbstring.dll”这一行存在并且没有被注释掉,否则会出现未定义函 数的问题。

写一个函数,尽可能高效的从一个标准url中取出扩展名

$arr = parse_url('http://www.sina.com.cn/abc/de/fg.php?id=1');

 

$result = pathinfo($arr['path']);var_dump($arr);

 

var_dump($result['extension']);

php.ini 中safe mod关闭 影响哪些函数和参数,至少写6个?

move_uploaded_file()        exec()

system()                              passthru()

popen()                              fopen()

mkdir()                               rmdir()

rename()                            unlink()

copy()                                 chgrp()

chown()                              chmod()

touch()                               symlink()

link()                                   parse_ini_file()

set_time_limit()                  max_execution_time mail()

一群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停 的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号。

<span> 1</span> <<span>?php
</span><span> 2</span><span>function</span> fuhuan(<span>$allnum</span>, <span>$ti</span><span>){
</span><span> 3</span><span>$arr</span> = <span>array</span><span>();
</span><span> 4</span><span>for</span>(<span>$i</span> = 0; <span>$i</span> < <span>$allnum</span>; <span>$i</span>++<span>){
</span><span> 5</span><span>$arr</span>[<span>$i</span>] = <span>$i</span><span>;
</span><span> 6</span><span>  }
</span><span> 7</span><span> 8</span><span>$nums</span> = 1<span>;
</span><span> 9</span><span>while</span>(<span>count</span>(<span>$arr</span>) > 1<span>){
</span><span>10</span><span>foreach</span> (<span>$arr</span><span>as</span><span>$key</span> => <span>$value</span><span>) {
</span><span>11</span><span>if</span>(<span>$nums</span> == <span>$ti</span><span>){
</span><span>12</span><span>unset</span>(<span>$arr</span>[<span>$key</span><span>]);
</span><span>13</span><span>$nums</span> = 1<span>;
</span><span>14</span>     }<span>else</span><span>{
</span><span>15</span><span>$nums</span>++<span>;
</span><span>16</span><span>    }
</span><span>17</span><span>   }
</span><span>18</span><span>  }
</span><span>19</span><span>$new_arr</span> = <span>array_values</span>(<span>$arr</span><span>);
</span><span>20</span><span>var_dump</span>(<span>$new_arr</span>[0] + 1<span>);
</span><span>21</span><span> }
</span><span>22</span>  fuhuan(10,10);

isset() 、empty()与is_null的区别

1、当变量未定义时,is_null()和“参数本身”是不允许作为参数判断的,会报Notice警告错误;

2、empty,isset首先都会检查变量是否存在,然后对变量值进行检测。而is_null 和 “参数本身”只是直接检查变量值,是否为null,因此如果变量未定义就会出现错误!

3、isset():仅当null和未定义,返回false;

4、empty():""、0、"0"、NULL、FALSE、array(),未定义,均返回false;

5、is_null():仅判断是否为null,未定义 报警告;

6、变量本身作为参数,与empty()一致,但接受未定义变量时,报警告;

求两个文件的相对路径

<span> 1</span> getpath('/a/b/c/d/e.php', '/a/d/12/34/c.php'<span>);
</span><span> 2</span><span> 3</span><span>function</span> getpath(<span>$a</span>, <span>$b</span><span>){
</span><span> 4</span><span>$aarr</span> = <span>explode</span>('/', <span>$a</span><span>);
</span><span> 5</span><span>$barr</span> = <span>explode</span>('/', <span>$b</span><span>);
</span><span> 6</span><span>$count</span> = <span>count</span>(<span>$barr</span>) - 2<span>;
</span><span> 7</span><span>$pathinfo</span> = ''<span>;
</span><span> 8</span><span>for</span>(<span>$i</span> = 1; <span>$i</span> <= <span>$count</span>; <span>$i</span>++<span>){
</span><span> 9</span><span>if</span>(<span>$aarr</span>[<span>$i</span>] == <span>$barr</span>[<span>$i</span><span>]){
</span><span>10</span><span>$pathinfo</span> .= '../'<span>;
</span><span>11</span>    }<span>else</span><span>{
</span><span>12</span><span>$pathinfo</span> .= <span>$barr</span>[<span>$i</span>] . '/'<span>;
</span><span>13</span><span>   }
</span><span>14</span><span>  }
</span><span>15</span><span>echo</span><span>$pathinfo</span><span>;
</span><span>16</span>  }

MVC的优缺点

1. Vorteile von MVC
(1) Sie können mehrere Modelle gleichzeitig zur Laufzeit erstellen und verwenden Zeitansichten. Der Mechanismus zur Weitergabe von Änderungen stellt sicher, dass alle zugehörigen Ansichten Modelldatenänderungen zeitnah erhalten, sodass sich alle zugehörigen Ansichten und Controller synchron verhalten können.
(2) Die Steckbarkeit von Ansichten und Controllern, die den Austausch von Ansichts- und Controllerobjekten <🎜 ermöglicht > und kann je nach Bedarf dynamisch geöffnet oder geschlossen werden, und sogar Objekte können zur Laufzeit ersetzt werden. (3)
Modellportabilität. Da das Modell unabhängig von der Ansicht ist, kann ein Modell unabhängig portiert werden, um auf einer neuen Plattform zu arbeiten. Es sind lediglich neue Modifikationen an Ansichten und Controllern auf der neuen Plattform erforderlich. (4)
Mögliche Rahmenstruktur. Auf Basis dieses Modells können Anwendungsframeworks erstellt werden, nicht nur für die Gestaltung von Schnittstellen. 2. Nachteile von MVC
(1)
Erhöht die Komplexität der Systemstruktur und -implementierung. Bei einfachen Schnittstellen erhöht die strikte Einhaltung von MVC und die Trennung von Modell, Ansicht und Controller die Komplexität der Struktur, kann zu viele Aktualisierungsvorgänge generieren und die Betriebseffizienz verringern. (2)
Zu enge Verbindung zwischen der Ansicht und dem Controller. Die Ansicht und der Controller sind voneinander getrennte Komponenten, die jedoch eng miteinander verbunden sind. Die Ansicht verfügt nicht über die Existenz des Controllers und ihre Anwendung ist sehr begrenzt, was ihre unabhängige Wiederverwendung behindert. (3)
Der ineffiziente Zugriff von View auf Modelldaten. Abhängig von der Modellbetriebsschnittstelle muss die Ansicht möglicherweise mehrmals aufgerufen werden, um genügend Anzeigedaten zu erhalten. Auch ein unnötig häufiger Zugriff auf unveränderte Daten schadet der Betriebsleistung. (4) Derzeit unterstützen allgemein erweiterte Schnittstellentools oder Konstruktoren den MVC-Modus nicht. Die Anpassung dieser Tools an die MVC-Anforderungen und die Erstellung separater Komponenten ist teuer und erschwert die Verwendung von MVC.

Die Verbindung und der Unterschied zwischen Sitzung und Cookie (Betriebsmechanismus), Sitzung Problemlösung beim Teilen:

Unterschiede und Zusammenhänge:

Verwenden Sie

Session_start(), um Session aufzurufen, und der Server generiert SessionGleichzeitig generiert die Datei den Session-ID-Hashwert und den Session-Namen mit dem Standardwert PHPSESSID und sendet die Variable als PHPSESSID an den Client ( Sitzung Name) Der (Standard-)Wert ist ein 128-Bit-Hashwert. Der Server interagiert über dieses Cookie mit dem Client. Der Wert der Variablen Session wird intern von PHP serialisiert und in einer Textdatei auf dem Servercomputer gespeichert . Führen Sie eine entsprechende Interaktion durch, d. h. der Server sendet automatisch den http-Header: header('Set-Cookie: Session_name()=Session_id(); path=/') ; das heißt, setcookie( Session_name(),Session_id()); , PHP prüft die serverseitig gespeicherten Sitzungsdaten, die mit der angegebenen ID verknüpft sind. Wenn sie nicht gefunden werden, erstellen Sie einen neuen Datensatz. Freigabeschema:

1: Speichern mit Session

/' target='_blank'>

Datenbank Sitzung, verwenden Sie die Datenbank, um Sitzung zu speichern. Auch wenn der Server ausgefallen ist, ist alles in Ordnung, Sitzung ist immer noch da.

Problem: Der Aufwand für das Lesen und Schreiben der Datenbank ist nicht gering. Außerdem ist die Datenbank eine einzelne Punkt, der durch Hashing der Datenbank gelöst werden kann.

2: Verwenden Sie Memcached

, um

Sitzung zu speichern. Diese Methode ähnelt der Datenbank und die Speicherzugriffsleistung ist viel besser als die Datenbank. Problem: Das Programm muss angepasst werden, was die Arbeitsbelastung erhöht; die in Memcached

gespeicherten Daten müssen serialisiert werden, was ineffizient ist und sich leicht ausschalten lässt oder starten Sie den Computer neu

3: 通过加密的cookie,在A服务器上登录,在用户的浏览器上添加加密的cookie,当用户访问B服务器时,检查有无Session,如果没有,就检验 Cookie是否有效,Cookie有效的话就在B服务器上重建Session。简单,高效, 服务器的压力减小了,因为Session数据不存在服务器磁盘上。根本就不会出现Session读取不到的问题。

问题:网络请求占用很多。每次请求时,客户端都要通过cookie发送Session数据给服务器,Session中数据不能太多,浏览器对cookie 的大

小存在限制。不适合高访问量的情况,因为高访问量的情况下。

正则表达式

匹配中文字符的正则表达式: [\u4e00-\u9fa5]
匹配双字节字符(包括汉字在内):[^\x00-\xff]
匹配空行的正则表达式:\n[\s| ]*\r
匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/ 
匹配首尾空格的正则表达式:(^\s*)|(\s*$) 
匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* 
匹配网址URL的正则表达式:^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$ 
匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 
匹配国内电话号码:(\d{3}-|\d{4}-)?(\d{8}|\d{7})? 
匹配腾讯QQ号:^[1-9]*[1-9][0-9]*$

--------------------linux部分---------------------

core文件是什么,有什么用?

<span> core是unix系统的内核。当你的程序出现内存越界的时候,操作系统会中止你的进程,并将当前内存状态倒出到core文件中,以便进一步分析。程序员可以通过core文件来找出问题所在。它记录了程序挂掉时详细的状态描述。</span>
<span>什么是core dump Core的意思是内存, Dump的意思是扔出来, 堆出来。开发和使用Unix程序时, 有时程序莫名其妙的down了, 却没有任何的提示(有时候会提示core dumped). 这时候可以查看一下有没有形如core.进程号的文件生成, 这个文件便是操作系统把程序down掉时的内存内容扔出来生成的,它可以做为调试程序的参考.
    core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump。如何使用core文件 gdb -c core文件路径 [应用程序的路径],进去后输入where回车, 就可以显示程序在哪一行当掉的, 在哪个函数中.</span>
<span>为什么没有core文件生成呢? core文件的生成跟你当前系统的环境设置有关系, 可以用下面的语句设置一下, 然后再运行程序便成生成core文件.</span>
<span>ulimit -c unlimited core文件生成的位置一般于运行程序的路径相同, 文件名一般为core.进程号</span>

不用core文件,程序出了问题产生信号是否知道?答:内核向进程发信号嘛。

共享内存除了文件映射还有什么方式?

共享内存对象映射。

二者有什么区别:

答:内存映射文件是由一个文件到一块内存的映射,使应用程序可以通过内存指针对磁盘上的文件进行访问,其过程就如同对加载了文件的内存的访问,因此内存文件映射非常适合于用来管理大文件。

请解释下列10个shell命令的用途
top、ps、mv、find、df、cat、chmod、chgrp、grep、wc

top:命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。 

ps:查看进程 

mv:移动或者更改文件 

find:在子目录中搜索匹配的文件 

df:linux中df命令参数功能:检查文件系统的磁盘空间占用情况。

cat:把一个或多个文件内容显示到标准输出 

chmod:改变文件属性 

chgrp:改变用户分组 

grep:在文件内进行搜索 

wc:命令的功能为统计指定文件中的字节数、字数、行数, 并将统计结果显示输出。

Linux文件属性有哪些?(共十位)

-rw-r--r--那个是权限符号,总共是- --- --- ---这几个位。

第一个短横处是文件类型识别符:-表示普通文件;c表示字符设备(character);b表示块设备(block);d表示目录 (directory);l表示链接文件(link);后面第一个三个连续的短横是用户权限位(User),第二个三个连续短横是组权限位 (Group),第三个三个连续短横是其他权限位(Other)。每个权限位有三个权限,r(读权限),w(写权限),x(执行权限)。如果每个权限位都 有权限存在,那么满权限的情况就是:-rwxrwxrwx;权限为空的情况就是- --- --- ---。

权限的设定可以用chmod命令,其格式位:chmod ugoa+/-/=rwx filename/directory。例如:

一个文件aaa具有完全空的权限- --- --- ---。

chmod u+rw aaa(给用户权限位设置读写权限,其权限表示为:- rw- --- ---)

chmod g r aaa (Legen Sie die Berechtigungen für die Gruppe so fest, dass sie lesbar ist. Ihre Berechtigungen werden wie folgt ausgedrückt: - --- r-- ---)

chmod ugo rw aaa (Legen Sie Berechtigungen für Benutzer, Gruppen, andere Benutzer oder Gruppen zum Lesen und Schreiben fest. Die Berechtigungen werden ausgedrückt als: - rw- rw- rw-)

Wenn aaa volle Berechtigungen hat – rwx rwx rwx.

chmod u-x aaa (Benutzerberechtigungen für ausführbare Dateien entfernen, Berechtigungen werden ausgedrückt als: - rw- rwx rwx)

Wenn Sie aaa - rwx r-x r-x benutzerdefinierte Berechtigungen erteilen möchten, lautet der Befehl:

chmod u=rwx, go=rx aaa

--------------------Serverteil------------ --- ------

Vergleich der Vor- und Nachteile von Apache und Nginx
1. Vorteile von Nginx gegenüber Apache:
ist leichtgewichtig und beansprucht weniger Speicher und Ressourcen als Apache. Hochmodulares Design, das Schreiben von Modulen ist relativ einfach
Anti-Parallelität, Nginx verarbeitet Anforderungen asynchron und nicht blockierend, mehrere Verbindungen (10.000 Ebenen) können einem Prozess entsprechen und Apache Es ist ein blockierendes Modell und ein synchrones Multiprozessmodell. Bei hoher Parallelität kann Nginx geringe Ressourcen, geringen Verbrauch und hohe Leistung aufrechterhalten verarbeitet statische Dateien gut, die statische Verarbeitungsleistung von Nginx ist mehr als dreimal höher als Apache

2,

Apache

Vorteile gegenüber Nginx :
Apaches Rewrite ist leistungsfähiger als Nginx's Rewrite. Es gibt im Grunde alles, was Sie sich vorstellen können. Es ist relativ stabil und weist weniger Fehler auf . Nginx hat relativ mehr Fehler

3: Grund: Dies liegt daran, dass Nginx den neuesten Epoll (Linux 2.6-Kernel) und kqueue verwendet (freebsd) Netzwerk-E/A-Modell, und Apache

verwendet das traditionelle Auswahlmodell. Derzeit verwenden Squid und

Memcached, die unter Linux einem hohen gleichzeitigen Zugriff standhalten können, alle das Epoll-Netzwerk-I/O-Modell. Um das Lesen und Schreiben einer großen Anzahl von Verbindungen zu bewältigen, ist das von Apache verwendete ausgewählte Netzwerk-E/A-Modell sehr ineffizient. Der Unterschied zwischen CGI und FastCGI

CGI wurde im Jahr 2000 oder früher im Allgemeinen häufiger verwendet Es werden nur statische Anfragen verarbeitet, um basierend auf dem Inhalt dieser Anfrage einen neuen Prozess auszuführen , Der Webserver sendet den Inhalt an den Benutzer und der gerade gegabelte Prozess wird ebenfalls beendet. Wenn der Benutzer das nächste Mal eine Änderung des dynamischen Skripts anfordert, leitet der Webserver erneut einen neuen Prozess ab und der Zyklus wird fortgesetzt.

Später erschien eine fortschrittlichere Methode: Der Webserver kann über einen integrierten Perl-Interpreter oder PHP-Interpreter verfügen. Mit anderen Worten, diese Interpreter werden in Module umgewandelt, und der Webserver startet diese Interpreter, wenn er gestartet wird. Wenn neue dynamische Anfragen eingehen, analysiert der Webserver diese Perl- oder PHP-Skripte selbst, sodass kein erneuter Fork eines Prozesses erforderlich ist und die Effizienz verbessert wird.

Fastcgi funktioniert so, dass, wenn der Webserver eine Anfrage erhält, ein Prozess nicht erneut geforkt wird (da dieser Prozess gestartet wird, wenn der Webserver startet, und nicht beendet wird). , der Webserver übergibt den Inhalt direkt an diesen Prozess (Interprozesskommunikation

, aber fastcgi verwendet andere Methoden, TCP-Kommunikation), dieser Prozess verarbeitet die Anforderung nach dem Empfang und gibt das Ergebnis an den Webserver zurück Schließlich warte ich weiterhin auf das Eintreffen der nächsten Anfrage, anstatt den Vorgang zu beenden.

Der Unterschied zwischen fastcgi und cgi ist:                                                                             Prozessaspekte der Verarbeitung cgiForken Sie einen neuen Prozess zum Verarbeiten von Leseparametern, verarbeiten Sie Daten und beenden Sie dann den Lebenszyklus
fastcgi Verwendet TCP, um eine Verbindung mit dem Prozess auf dem Remote-Computer oder dem lokalen Prozess herzustellen. Um den TCP-Port zu öffnen, treten Sie in die
Schleife ein, warten Sie auf das Eintreffen von Daten und verarbeiten Sie die Daten


Zum Beispiel: Der Server hat jetzt 100.000 Wörter. Der Client sendet jedes Mal eine Zeichenfolge und fragt, wie vielen Wörtern diese Zeichenfolge vorangestellt ist. Dann können Sie ein Programm schreiben, das einen Trie-Baum erstellt, und dann können Sie in diesem Trie jedes Mal direkt suchen, wenn der Benutzer dies anfordert. Wenn Sie jedoch CGI verwenden, ist der Trie nach dieser Anfrage verschwunden. Wenn der Prozess das nächste Mal gestartet wird, muss ein neuer Trie-Baum erstellt werden. Mit der Fastcgi-Methode wird der Trie-Baum in dieser Lektion beim Start des Prozesses erstellt, und Sie können das angegebene Präfix später direkt im Trie-Baum abfragen.

Der Unterschied zwischen select, poll und epoll

select

select erschien erstmals 1983 In 4.2BSD wird ein Array mehrerer Dateideskriptoren durch einen select()-Systemaufruf überwacht. Wenn select() zurückkehrt, werden die bereiten Dateideskriptoren im Array angezeigt vom Kernel geändert, sodass der Prozess diese Dateideskriptoren für nachfolgende Lese- und Schreibvorgänge erhalten kann.

select wird derzeit auf fast allen Plattformen unterstützt, und die gute plattformübergreifende Unterstützung ist auch einer seiner Vorteile. Tatsächlich ist dies von nun an einer der wenigen verbleibenden Vorteile . eins. Ein Nachteil von

select besteht darin, dass es eine Höchstgrenze für die Anzahl der Dateideskriptoren gibt, die ein einzelner Prozess überwachen kann, was unter Linux im Allgemeinen 1024 beträgt, aber Es kann durch Ändern der Makrodefinition geändert werden. Selbst eine Neukompilierung des Kernels erhöht diese Grenze.

Darüber hinaus speichert die von select() verwaltete Datenstruktur eine große Anzahl von Dateideskriptoren, da die Anzahl der Dateideskriptoren zunimmt , , sein Kopieraufwand steigt ebenfalls linear an. Gleichzeitig ist aufgrund der Verzögerung der Netzwerkantwortzeit eine große Anzahl von TCP-Verbindungen inaktiv, aber der Aufruf von select() führt einen linearen Scan aller Sockets durch, sodass auch dadurch ein gewisser Overhead verschwendet wird.

poll

poll wurde 1986 in System V Release 3 geboren. Es unterscheidet sich im Wesentlichen nicht wesentlich von select, aber poll nicht haben die größte Beschränkung für die Anzahl der Dateideskriptoren.

Poll und Select haben auch den Nachteil, dass das Array mit einer großen Anzahl von Dateideskriptoren als Ganzes zwischen dem Benutzermodus und dem Kernel kopiert wird Unabhängig davon, ob diese Dateideskriptoren bereit sind oder nicht, steigt der Overhead linear mit der Anzahl der Dateideskriptoren.

Darüber hinaus teilen Sie dem Prozess nach select() und poll() mit, dass der Dateideskriptor bereit ist, wenn der Prozess keine E/A-Vorgänge ausführt es, dann werden diese Dateideskriptoren beim nächsten Aufruf von select() und poll() erneut gemeldet, sodass sie im Allgemeinen die Bereitschaftsnachricht nicht verlieren. Diese Methode wird als Level Triggered bezeichnet.

epoll

Erst mit Linux 2.6 erschien eine Implementierungsmethode, die direkt vom Kernel unterstützt wurde, nämlich epoll, was fast der Fall ist Mit allen oben genannten Vorteilen gilt es als die leistungsstärkste Mehrkanal-I/O-fähige Benachrichtigungsmethode unter Linux 2.6.

epoll kann sowohl horizontales Triggern als auch Edge-Triggering unterstützen (Edge Triggered, das dem Prozess nur mitteilt, welche Dateideskriptoren gerade fertig geworden sind, es sagt es nur einmal, Wenn wir keine Maßnahmen ergreifen, erfolgt keine erneute Benachrichtigung. Diese Methode wird als Kantentriggerung bezeichnet. Theoretisch ist die Leistung der Kantentriggerung höher, die Codeimplementierung ist jedoch recht kompliziert.

epoll benachrichtigt auch nur die fertigen Dateideskriptoren , und wenn wir epoll_wait() aufrufen, um einen fertigen Dateideskriptor zu erhalten, erfolgt keine Rückgabe Ein tatsächlicher Deskriptor, aber ein Wert, der die Anzahl der fertigen Deskriptoren darstellt. Sie müssen nur die entsprechende Anzahl von Dateideskriptoren aus einem von Epoll angegebenen Array abrufen. Auch hier wird die Mapping-Technologie vollständig verwendet eliminiert den Aufwand für das Kopieren dieser Dateideskriptoren während Systemaufrufen.

Eine weitere wesentliche Verbesserung besteht darin, dass Epoll eine ereignisbasierte Bereitschaftsbenachrichtigungsmethode übernimmt. Bei Select/Poll scannt der Kernel alle überwachten Dateideskriptoren erst, nachdem der Prozess eine bestimmte Methode aufgerufen hat, und epoll registriert einen Dateideskriptor über epoll_ctl() im Voraus, wenn ein Dateideskriptor Wenn der Kernel bereit ist, verwendet er einen Callback-ähnlichen Callback-Mechanismus, um diesen Dateideskriptor schnell zu aktivieren, und wird benachrichtigt, wenn der Prozess epoll_wait() aufruft.

Der Unterschied zwischen Memcache und Redis

  1. In Redis werden nicht alle Daten immer im Speicher gespeichert. Dies ist der größte Unterschied im Vergleich zu Memcached.
  2. Redis hat in vielerlei Hinsicht die Eigenschaften einer Datenbank oder ist ein Datenbanksystem, während Memcached nur ein einfacher K/V-Cache ist.
  3. Ihre Erweiterung erfordert Clustering; Implementierungsmethoden: Master-Slave, Hash.
  4. Bei Daten von mehr als 100.000 schneidet Memcached besser ab als Redis.
  5. Wenn Sie über die Effizienz der Speichernutzung sprechen und einfachen Schlüsselwertspeicher verwenden möchten, hat Memcached eine höhere Speicherauslastung, und wenn Redis dazu eine Hash-Struktur verwendet Der Schlüsselwertspeicher hat aufgrund seiner kombinierten Komprimierung eine höhere Speicherauslastung als Memcached. Dies hängt natürlich von Ihrem Anwendungsszenario und den Dateneigenschaften ab.
  6. Wenn Sie Anforderungen an Datenpersistenz und Datensynchronisierung haben, wird empfohlen, Redis zu wählen, da Memcached nicht über diese beiden Funktionen verfügt. Auch wenn Sie nur hoffen, dass zwischengespeicherte Daten nach einem Upgrade oder Neustart des Systems nicht verloren gehen, ist es ratsam, sich für Redis zu entscheiden.
  7. Es gibt keinen großen Unterschied zwischen Redis und Memcache hinsichtlich der Schreibleistung, aber Memcache ist hinsichtlich der Leseleistung, insbesondere der Batch-Leseleistung, stärker.

Das Obige stellt die Zusammenfassung des PHP-Interviews vor, einschließlich einiger Aspekte des Inhalts. Ich hoffe, dass es für Freunde hilfreich ist, die sich für PHP-Tutorials interessieren.

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