この記事では、PHP に関する関連知識を提供します。主に PHP の面接の質問を紹介し、一般的な 39 の質問をまとめています。PHP の面接の質問にはさまざまな種類があります。 , しかし、それらはすべて基本的かつ一般的な PHP 面接の質問と切り離せないものです。
推奨学習: 「
PHP チュートリアル 」
302: 一時転送が成功しました。要求されたコンテンツは新しい場所に移動されました。 403: アクセスが禁止されています。 500: サーバー内部エラー 401 は、不正を表します。
4. 圧縮パッケージを作成し、Linux でパッケージを解凍するコマンドPackaging: tar czf file.tar .gz file.txt
抽出: tar xzf file.tar.gz
Bz2:
パッケージ: bzip2 [-k] ファイル
抽出: bunzip2 [ -k] ファイル
Gzip (ファイルのみ、オリジナル ファイルではありません)
パッケージ: gzip file1.txt
解凍: Gunzip file1.txt.gz
Zip: -r ディレクトリを圧縮します
: zip file1.zip file1.txt
解凍: unzip file1.zip
Int Integer char 固定長文字 Varchar 可変長文字 Datetime 日時型 Text テキスト型 Varchar と char char の違いは、固定長の文字型です。たくさんのスペース。 Varchar は可変長の文字型で、コンテンツと同じだけのスペースを占有するため、スペースを効果的に節約できます。 varchar型は可変であるため、データ長が変わるとサーバー側で追加の操作が必要となり、char型に比べて効率が悪くなります。
MyISAM タイプはトランザクションとテーブル ロックをサポートしておらず、断片化が起こりやすいです。頻繁に最適化する必要があり、読み取りと書き込みの速度が速いのに対し、InnoDB タイプはトランザクション、行ロック、クラッシュ回復機能も備えています。読み取りおよび書き込み速度は MyISAM よりも遅くなります。
インデックスの作成: アラート テーブル テーブル名 インデックス (`フィールド名`) を追加
理解: session_start() がオンの場合、定数 SID が生成されます。COOKIE がオンの場合、この定数は空です。COOKIE がオフの場合、PHPSESSID の値がこの定数に格納されます。 URL の後に SID パラメータを追加して SESSIONID の値を渡すことで、クライアント ページは SESSIONID の値を使用できます。クライアントが COOKIE を開き、サーバーが SESSION を開くとき。ブラウザが最初のリクエストを行うとき、サーバーは SESSIONID を保存するためにブラウザに COOKIE を送信します。ブラウザが 2 番目のリクエストを行うとき、既存の
Isset は、変数が存在するかどうかを決定します。複数の変数を渡すことができます。変数の 1 つが存在しない場合は、false を返します。empty は、変数が空か false かを決定します。変数は 1 つだけですIf 空または false の場合は true を返します。
回答: 主に 2 つの方法があります:
1) スナップショットの永続性
は Redis 構成ファイルで自動的に有効になっています。形式は次のとおりです: save N M
は、N 秒以内に、redis が少なくとも M 回変更された場合、redis はディスクにスナップショットを取得することを意味します。
もちろん、save または bgsave (非同期) コマンドを手動で実行してスナップショットを作成することもできます。
2) ファイルのみの追加 AOF 永続化
モードは合計 3 つあります。例:
appendfsync Everysec のデフォルトでは、1 秒に 1 回ディスクへの書き込みを強制します
appendfsync always 書き込み操作が実行されるたびにディスクへの書き込みを強制します
appendfsync no は OS とパフォーマンスに完全に依存します。最良ですが、永続性は保証できません。
3 番目のモードが最良です。 Redis もデフォルトで 3 番目のモードを採用します。
10.mysql ストレージ エンジン1) myisam はトランザクション処理をサポートしませんが、innoDB はトランザクション処理をサポートします
2) myisam は外部キーをサポートしませんが、innoDB は外部キーをサポートします
3) myisam はフルテキストをサポートしますMySQL バージョン 5.6
4) データの保存形式が異なります。mysiam テーブルは、構造、インデックス、データの 3 つのファイルに保存されます。InnoDB ストレージには、ファイルとインデックスとしての構造、そしてデータはファイルとして保存されます
5) myisam はデータのクエリと追加では innoDB よりも優れたパフォーマンスを発揮し、一括削除では innoDB のパフォーマンスが優れています。
6) myisam はテーブル ロックをサポートしますが、innoDB は行ロックをサポートします
11. SQL インジェクションとは何ですか? SQL インジェクションを防ぐ方法は何ですか?1) プレースホルダー方式では、SQL ステートメントを前処理してから SQL ステートメントを実行します
2) アッドスラッシュを使用します。または mysql_real_escape_string を使用して、ユーザーが入力した値をエスケープし、一部の特殊文字をエスケープします。
12. 前処理は使用されていますか?回答: MySQL の最適化は主に次の側面から実現されます:
1) 設計の観点: ストレージ エンジンの選択、フィールド タイプの選択、パラダイム
2)機能的な観点: インデックス作成、クエリ キャッシュ、デフラグ、パーティショニング、サブテーブルなどの MySQL 独自の機能を利用できます。
3) SQL ステートメントの最適化: クエリ ステートメントを簡素化し、クエリ フィールドをできるだけ少なくする クエリ フィールドを減らし、ページング ステートメント、グループ化ステートメントなどを最適化します。
4) 高負荷アーキテクチャシステムの導入:データベースサーバを分離し、高負荷時はマスタスレーブレプリケーションや読み書き分離機構を利用した設計が可能です
5)データベース サーバーをハードウェアからアップグレードします。
値渡し: 関数スコープ内の値への変更は関数の外では無視されます。
参照渡し: 関数スコープ内の値への変更も無視されます。関数外では無視される これらの変更を反映
長所と短所: 値で渡す場合、PHP は値をコピーする必要があります。特に大きな文字列やオブジェクトの場合、これはコストのかかる操作になる可能性があります。参照渡しでは値をコピーする必要がないため、パフォーマンスの向上に役立ちます。
PHP のエラー報告レベルを設定し、現在のレベルを返します。
原則: クイック ソートでは、分割統治戦略を使用して分割します。ソートされるデータ シーケンス 2 つのサブシーケンス。具体的な手順は次のとおりです。
(1) シーケンスから要素を選択し、この要素を「ベースライン」と呼びます。
(2) 配列を 1 回スキャンし、「ベース」より小さいすべての要素をベースの前に配置し、「ベース」より大きいすべての要素をベースの後ろに配置します。
(3) 基準値より小さい要素の部分配列と基準値より大きい要素の部分配列がソートされるまで、再帰によって各サブシーケンスをより小さなシーケンスに分割します。
//快速排序(数组排序) 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; }
class regx { public static function check($str) { if(preg_match("/^([1-9,])+$/",$str)) { return true; } return false; } } $str="12345,6"; if(regx::check($str)) { echo "suc"; } else { echo "fail"; }
class Db { private static $instance; public $handle; Private function __construct($host,$username,$password,$dbname) { $this->handle=NULL; $this->getcon($host,$username,$password,$dbname); } public static function getBb() { self::$instance=new Db(); return self::$instance; } private function getcon($host,$username,$password,$dbname) { if($this->handle!=NULL){ return true; } $this->handle=mysqli_connect($host,$username,$password,$dbname); } }
A) SQLite データベース
B) MySQL データベース
C) 共有メモリ
D)ファイル システム
#E) セッション サーバー
答え: 理由: 中国語はマルチバイトで構成されており、英語は 1 つだけです。英語システムの文字は 1 バイトしかないため、システムは中国語の各バイトを変換します。すべて strto lower() によって処理されており、変更された中国語の文字は結合されると文字化けします (新しく生成されたエンコーディング マップに対応する文字)中国語ではない可能性があります)
手動の解決策: str_split(string string , intstring, intsplit_length = 1) を使用します。中国語を 3 バイトに分割できるように、バイトごとに分割します。認識されたバイトが英文字の場合は変換されます。
<?php function mystrtoupper($a){ $b = str_split($a, 1); $r = ''; foreach($b as $v){ $v = ord($v); if($v >= 97 && $v<= 122){ $v -= 32; } $r .= chr($v); } return $r; } $a = 'a中你继续F@#$%^&*(BMDJFDoalsdkfjasl'; echo 'origin string:'.$a."\n"; echo 'result string:'; $r = mystrtoupper($a); var_dump($r);
回答: バグは 2 つの側面で存在します:
1) 終了時、ファイルに読み取り専用属性しかない場合、is_writeable() 関数は false を返します。true が返された場合、ファイルは無効です。必ず書き込み可能です。
ディレクトリの場合は、ディレクトリに新しいファイルを作成し、ファイルを開いて確認します。
ファイルの場合は、ファイルを開く (fopen) ことで、ファイルが書き込み可能かどうかをテストできます。
2) Unix では、php 設定ファイルでセーフモードがオンになっている場合 (safe_mode=on)、is_writeable() も使用できません。
構成ファイルを読んで、safe_mode がオンになっているかどうかを確認します。
/** * 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视频教程》
以上がPHP 面接の質問 39 項目を要約して整理する (要約の共有)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。