この記事は、PHP 面接でよくある質問 (回答付き) をまとめたもので、困っている人には参考になると思います。
# 初めて PHP のポジションに面接したときのことを覚えています。私は学校を卒業したばかりで、市場がどのようなものなのか知りませんでした。 、そしてそれは経験ゼロでした(ここに文章を挿入してください、経験ゼロ、あなたが完全または半完成のプロジェクトの開発に一度も携わったことがない場合、会社はあなたを望んで採用しているので、通常、会社はあなたを必要としません。会社の事業と業績の向上を達成するために。その時、試用期間は800元だと言ったばかりです、もちろん、それは何年も前のことです。価格もかなり安いので、会社からのお願いでした! ! !理由はとても簡単で、誰もが知っています!
[関連する推奨事項: php 面接の質問 (要約)]
企業内でプロジェクトを行う場合、成長はプロセスであり、自分自身の学習スキルを向上させることが鍵となります既存の。入社前に1~2回の面接と筆記試験がありますが、これはどの業界でも同様で、口頭表現力(話せること)に加えて、強みや能力も求められます。面接の質問が具体化するものでもあります。面接の質問にはさまざまな種類がありますが、それらはすべて PHP の基本から切り離すことができません。社会に出たばかりの人の中には、試験問題が理解できない人もいるかもしれません。その時に私が実際に使った方法を紹介します!すべての問題タイプを暗記するだけです。この方法は非常に時代遅れで非現実的です。でも、よくある質問の種類はすべて出てきたので、とても役に立ちました~~私は幸運かもしれません!
誰もが独自の方法で学ぶことができます。前にもそうやってここに来たことがある!これからも、私たちは学び続けてスキルを向上させ、学び続けなければなりません。一度罠にはまると抜け出すのは難しい!
以下では、面接でよくある質問をいくつか紹介します。お役に立てば幸いです。 !
1. バブルソート、面接前に必ず覚えておいてください。
function maopao($arr) { $len = count($arr); $n = count($arr) - 1; for ($i = 0; $i < $len; $i++) { for ($j = 0; $j < $n; $j++) { if ($arr[$j] > $arr[$j + 1]) { $tmp = $arr[$j]; $arr[$j] = $arr[$j + 1]; $arr[$j + 1] = $tmp; } } } return $arr; }
2. 簡単に説明します。面接前に必ず覚えておいてください。
function quick_sort($array) { if (count($array) <= 1) return $array; $key = $array[0]; $left_arr = array(); $right_arr = array(); for ($i=1; $i<count($array); $i++){ if ($array[$i] <= $key) $left_arr[] = $array[$i]; else $right_arr[] = $array[$i]; } $left_arr = quick_sort($left_arr); $right_arr = quick_sort($right_arr); return array_merge($left_arr, array($key), $right_arr); }
3. PHP で値渡しと参照渡しの違いを説明してください。値渡しと参照渡しの場合は次のとおりです。
値渡し: 関数 スコープ内の値への変更は関数の外では無視されます
参照渡し: 関数スコープ内の値への変更は関数の外にも反映されます
長所と短所: 参照による 値が渡されると、php はその値をコピーする必要があります。特に大きな文字列やオブジェクトの場合、これはコストのかかる操作になる可能性があります。参照渡しでは値をコピーする必要がないため、パフォーマンスの向上に役立ちます。 (利点と欠点をテストします)
4. MySQL データベースのフィールド タイプ varchar と char の主な違いは何ですか? ##Varchar は変数 Long であり、記憶域を節約します。char は固定長です。 varchar は非固定長のため、まず長さを検索してからデータを抽出する必要があり、char 型よりも検索効率が高くなります。効率は低くなります。
5. MySQL データベースの一般的なストレージ エンジンとその違いは?
MyISAM: トランザクションとテーブル ロックをサポートせず、断片化が起こりやすく、頻繁に最適化する必要があり、読み取りおよび書き込み速度が速く、全文インデックス作成をサポートしています。 InnoDB: トランザクション、行ロック、クラッシュ回復機能をサポートします。読み書き速度は MyISAM より遅く、全文インデックス作成は 5.6 以降でサポートされます。
ストレージ エンジンはデータベースではなくテーブルに基づいています (この質問は可能であればさらに詳しく教えてください)6. トラフィックが多い Web サイトでは、トラフィックの問題を解決するためにどのような方法が使用されますか?
まず、サーバー ハードウェアが現在のトラフィックをサポートするのに十分であるかどうかを確認します。
次に、データベース アクセスを最適化します。
3 番目に、外部ホットリンクを禁止します。
4 番目に、大きなファイルのダウンロードを制御します。
5 番目、メインのトラフィックを迂回するために別のホストを使用します
6 番目、トラフィック分析および統計ソフトウェアを使用します
7 番目、静的ページとキャッシュを使用してみます
7. オブジェクト指向とは何ですか?主な特徴は何ですか?
オブジェクト指向はプログラムの設計手法であり、プログラムの再利用性を高め、プログラムの構造を明確にします。主な機能: カプセル化、継承、ポリモーフィズム。
8. セッションとクッキーの違いは何ですか?これが重要なポイントです。
SESSION はサーバー側に保存され、COOKIE はクライアント側に保存されます。セッションは比較的安全です。Cookie は特定の方法で変更される可能性があり、安全ではありません。セッションは配信のために Cookie に依存します。 Cookie を無効にした後も、セッションを保存するファイルではセッション ID が生成され、そのセッション ID が get パラメータを通じてセッションを共有するページに渡されます。 read を使用してセッションからデータを取得します。
セッションと cookie に関する詳細なチュートリアルを探すことをお勧めします
9 キャッシュ テクノロジについて理解していますか? redis はテスト ポイントです。
1 キャッシュ テクノロジは、動的コンテンツをファイルにキャッシュし、一定期間内に動的ページにアクセスして、キャッシュされたファイルを再度呼び出す必要がありません。データベース。
2. キャッシュには memcache を使用します。
10. フォーム
#get での get 送信メソッドと post 送信メソッドの違いは明確であり、データは URL から確認できます。データ量が少なく、セキュリティが低い。
post は暗黙的で、送信されるデータ量が多く、セキュリティが高い。
11。データベースを最適化する方法
最も適切なフィールド属性を選択し、定義されたフィールドの幅をできる限り減らし、フィールドを NOTNULL
に設定してみてください。サブクエリの代わりに接続 (JOIN) を使用します
ユニオン (UNION) を適用して手動で作成した一時テーブルを置き換えます
#トランザクション処理#テーブルをロックし、トランザクション処理を最適化します
# #外部キーを使用し、ロック テーブルを最適化するインデックスを使用するクエリ ステートメントを最適化する12. include ステートメントと require ステートメントの違いは何ですか? include ステートメントと require ステートメントの違いは何ですか?
require は無条件の包含です。つまり、require がプロセスに追加された場合、ファイルが存在しない場合、またはファイルが存在できない場合、条件が true であるかどうかに関係なく、require が最初に実行されます。開くとエラーが表示され、プログラムの実行が終了します。
include には戻り値がありますが、require はありません (おそらく、インクルードされたファイルが存在しない場合)。エラーが表示されますが、プログラムは続行されます13。redis、memcacahe、mongoDB の違いは何ですか?これらはすべて非常に高いパフォーマンスを備えた非リレーショナル データベースですが、mongoDB、memcache、redis は 2 つの異なるタイプです。後者の 2 つは主にデータのキャッシュに使用され、前者は主にデータベースに近いドキュメント型の非リレーショナル データベースです。
データの保存場所の観点から見ると、memcache データはメモリに保存されますが、redis はメモリまたはディスクに保存して、memcache の電源がオフになると、データはすべて保存されます。失われた場合、redis はスナップショットと AOF を使用してデータをディスクに保存し、物理メモリが使い果たされたときに、データをディスクからメモリに読み取ることができます。 保存されるデータの種類に関しては、memcache と redis は両方のキーと値のペアを保存しますが、redis 値には文字列 (string)、ハッシュ (hash)、リスト (List)、 set (セット) zset (順序セット)、memcache は主に文字列を格納します。 14. PHP の基本的な変数の型4 つのスカラー型: boolean (ブール型)、integer (整数型)、float (Floating)ポイント型 (double とも呼ばれます)、文字列 (文字列)
2 つの複合型: 配列 (配列)、オブジェクト (オブジェクト)最後に、リソース (リソース)、NULL という 2 つの特別な型があります。 (NULL) 15. 静的化はどのように行われますか?擬似静的を実装するにはどうすればよいですか?1. 静的化とは、ページの静的化を指します。つまり、実際の静的ファイルを生成します。つまり、データはデータベースにクエリせずにファイルから直接取得できます。 主な実装方法は 2 つあります。
1 つは、データベースに情報を追加するときに生成される静的ファイルで、テンプレート置換テクノロジとも呼ばれます。
2、伪静态不是真正意义上的静态化,之所以使用伪静态,主要是为了SEO推广,搜索引擎对动态的文件获取难度大,不利于网站的推广。实习原理是基于Apache或Nginx的rewrite机智
主要有两种方式:
一种是直接在配置虚拟机的位置配置伪静态,这个每次修改完成后需要重启web服务器。
另一种采用分布式的,可以在网站的根目录上创建.htaccess的文件,在里面配置相应的重写规则来实现伪静态,这种每次重写时不需要重启web服务器,且结构上比较清晰。
16、Mysql的读写分离?(进阶的会遇到)
读写分离的实现原理就是在执行SQL语句的时候,判断到底是读操作还是写操作,把读的操作转向到读服务器上(从服务器,一般是多台),写的操作转到写的服务器上(主服务器,一般是一台,视数据量来看)。当然为了保证多台数据库数据的一致性,需要主从复制。
17、如何处理负载,高并发?
1、HTML静态化
效率最高、消耗最小的就是纯静态化的html页面,所以我们尽可能使我们的 网站上的页面采用静态页面来实现,这个最简单的方法其实也是最有效的方法。
2、图片服务器分离
把图片单独存储,尽量减少图片等大流量的开销,可以放在一些相关的平台上,如七牛等
3、数据库集群和库表散列及缓存
数据库的并发连接为100,一台数据库远远不够,可以从读写分离、主从复制,数据库集群方面来着手。另外尽量减少数据库的访问,可以使用缓存数据库如memcache、redis。
4、镜像:
尽量减少下载,可以把不同的请求分发到多个镜像端。
5、负载均衡:
Apache的最大并发连接为1500,只能增加服务器,可以从硬件上着手,如F5服务器。当然硬件的成本比较高,我们往往从软件方面着手。
18、说一下单引号双引号?(基础考点)
单引号内部的变量不会执行, 双引号会执行
单引号解析速度比双引号快。
单引号只能解析部分特殊字符,双引号可以解析所有特殊字符。
19、PHP7的新特性?重点
标量类型声明:PHP 7 中的函数的形参类型声明可以是标量了。在 PHP 5 中只能是类名、接口、array 或者 callable (PHP 5.4,即可以是函数,包括匿名函数),现在也可以使用 string、int、float和 bool 了。
返回值类型声明:增加了对返回类型声明的支持。 类似于参数类型声明,返回类型声明指明了函数返回值的类型。可用的类型与参数声明中可用的类型相同。
NULL 合并运算符:由于日常使用中存在大量同时使用三元表达式和 isset()的情况,NULL 合并运算符使得变量存在且值不为NULL, 它就会返回自身的值,否则返回它的第二个操作数。
use 加强:从同一 namespace 导入的类、函数和常量现在可以通过单个 use 语句 一次性导入了
匿名类:现在支持通过new class 来实例化一个匿名类
20、PHP 数组排序
sort() - 以升序对数组排序
rsort() - 以降序对数组排序
asort() - 根据值,以升序对关联数组进行排序
ksort() - 根据键,以升序对关联数组进行排序
arsort() - 根据值,以降序对关联数组进行排序
krsort() - 根据键,以降序对关联数组进行排序
21、建立索引
(普通索引)-> 创建:CREATE INDEX <索引名> ON tablename (索引字段) 修改:ALTER TABLE tablename ADD INDEX [索引名] (索引字段) 创表指定索引:CREATE TABLE tablename([...],INDEX[索引名](索引字段)) (唯一索引)-> 创建:CREATE UNIQUE <索引名> ON tablename (索引字段) 修改:ALTER TABLE tablename ADD UNIQUE [索引名] (索引字段) 创表指定索引:CREATE TABLE tablename([...],UNIQUE[索引名](索引字段)) (主键)-> 它是唯一索引,一般在创建表是建立,格式为: CREATA TABLE tablename ([...],PRIMARY KEY[索引字段])
22、PHP支持多继承吗?
不支持。PHP中只允许单继承,父类可以被一个子类用关键字“extends”继承。
23、使用过Memcache缓存吗,如果使用过,能够简单的描述一下它的工作原理吗?
Memcahce是把所有的数据保存在内存当中,采用hash表的方式,每条数据又key和value组成,每个key是独一无二的,当要访问某个值的时候先按照找到值,然后返回结果。
Memcahce采用LRU算法来逐渐把过期数据清除掉。
24、优化MYSQL数据库的方法
(1)选择最有效率的表名顺序 (2)WHERE子句中的连接顺序 (3)SELECT子句中避免使用‘*’ (4)用Where子句替换HAVING子句 (5)通过内部函数提高SQL效率 (6)避免在索引列上使用计算。 (7)提高GROUP BY 语句的效率, 可以通过将不需要的记录在GROUP BY 之前过滤掉。 (1).选取最适用的字段属性,应该尽量把字段设置为NOT NULL (2).使用连接(JOIN)来代替子查询(Sub-Queries) (3).使用联合(UNION)来代替手动创建的临时表 (4).尽量少使用 LIKE 关键字和通配符 (5).使用事务和外键
25、MySQL主从备份的原理?
mysql支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。
26、error_reporting() 的作用?
设置 PHP 的报错级别并返回当前级别。
27、如何修改session的生存时间
在php.ini 中设置 session.gc_maxlifetime = 1440 //默认时间
代码实现
$lifeTime = 24 * 3600; // 保存一天 session_set_cookie_params($lifeTime); session_start();
28、常见的 PHP 安全性攻击
SQL注入:用户利用在表单字段输入SQL语句的方式来影响正常的SQL执行。
防止:
使用mysql_real_escape_string()过滤数据
手动检查每一数据是否为正确的数据类型
使用预处理语句并绑定变量
参数化SQL:是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值,用@或?来表示参数。
XSS攻击 :跨站点脚本攻击,由用户输入一些数据到你的网站,其中包括客户端脚本(通常JavaScript)。如果你没有过滤就输出数据到另一个web页面,这个脚本将被执行。
防止:为了防止XSS攻击,使用PHP的htmlentities()函数过滤再输出到浏览器。
CSRF: クロスサイト リクエスト フォージェリとは、Web サイトの信頼できるユーザーのように見えるページによって作成されたリクエストを指しますが、偽のリクエストです。
Prevention: 一般言い換えれば、ユーザーがあなたのフォームから来たものであり、送信するすべてのフォームと一致することを確認してください。覚えておく必要がある 2 つの点があります。
ユーザー セッションごとに ID を更新したり、ユーザーに SSL を使用したりするなど、ユーザー セッションに適切なセキュリティ対策を講じます。
別のワンタイム トークンを生成してフォームに埋め込み、セッション (セッション変数) に保存して、送信時に確認します。たとえば、laravelの_token
コードインジェクション: コードインジェクションは、無効なデータを処理することによってコンピュータの脆弱性を悪用することによって引き起こされます。問題は、通常はファイルのインクルードを介して、誤って任意のコードを実行したときに発生します。コードの書き方が不十分だと、リモート ファイルが組み込まれて実行される可能性があります。多くの PHP 関数と同様に、require には URL またはファイル名を含めることができます。
コードインジェクションの防止
ユーザー入力のフィルタリング
php.iniでallow_url_fopenとallow_url_includeを無効に設定します。これにより、require/include/fopen
# のリモート ファイルが無効になります。さまざまな種類の質問がありますが、学習の過程でゆっくりと学習スキルを向上させていただければ幸いです。勉強。 ! !