ホームページ  >  記事  >  バックエンド開発  >  php に関する重要な php の知識ポイントを共有します。

php に関する重要な php の知識ポイントを共有します。

小云云
小云云オリジナル
2018-03-16 16:08:195439ブラウズ

1. PHP でのオートロードについて簡単に説明します

PHP でクラスを使用する場合、require または include を通じて使用する前にクラスをロードする必要がありますが、ロードに影響を与える 2 つの問題があります。 1 つは、このクラス ファイルがどこに保存されているかがわからないこと、もう 1 つは、このファイルをいつ使用する必要があるかがわからないことです。特にプロジェクト ファイルが多数ある場合、各ファイルの先頭に要件の長いリストを記述することは不可能です。
オートロード読み込みメカニズムでは、new を通じてクラスをインスタンス化するときに、PHP は定義されたオートロード関数を通じて対応するファイルを読み込みます。このクラス ファイルが extends またはimplement を使用し、他のクラス ファイルを使用する必要がある場合、PHP は検索と読み込みのために autoload を再実行します。 class ファイルを使用している場合、同じクラス ファイルに対する 2 つのリクエストが発生すると、エラーが報告されます。

2. 静的変数の長所と短所は何ですか?

静的ローカル変数の特徴: 1. 関数の呼び出しと終了では変化しません。ただし、変数は存在し続けますが、使用することはできません。それを定義する関数が再度呼び出された場合、その関数は引き続き使用でき、前回の呼び出し後に残った値は保存されます。 2. 静的ローカル変数は 1 回だけ初期化されます。 3. 静的プロパティは文字値または定数にのみ初期化でき、式は使用できません。ローカル静的変数が初期値なしで定義されている場合でも、システムは自動的に初期値 0 (数値変数の場合) または null 文字 (文字変数の場合) を割り当てます。静的変数の初期値は 0 です。関数が複数回呼び出され、呼び出し間で一部の変数の値を保持する必要がある場合は、静的ローカル変数の使用を検討してください。上記の目的を達成するためにグローバル変数を使用することもできますが、グローバル変数は予期しない副作用を引き起こす場合があるため、ローカル静的変数を使用することをお勧めします。

3. strtr と str_replace の違いは何ですか?彼らは使ったの?

str_replace() 関数は、文字列内の一部の文字を他の文字に置き換えます (大文字と小文字を区別します)。

strtr() 関数は、文字列内の特定の文字を変換します。

str_replace の 5.6 バージョンは strtr よりも 10 倍以上効率的で、7.0 バージョンも基本的に同じ効率ですが、5.6 の str_replace は 7.0 よりも 3 倍効率的です

__construct():クラスのデフォルトのコンストラクター。 __construct () とクラスと同じ名前のメソッドが同時に出現した場合、同じ名前のメソッドの代わりに __construct() がデフォルトで呼び出されます。

__call(): 存在しない、またはアクセスできないメソッドを呼び出す場合、__call($name, $arguments) メソッドが呼び出されます。

__toString(): オブジェクトを印刷するときに直接呼び出されます。 echo $object;

__clone(): オブジェクトがコピーされるときに直接呼び出されます。

__isset(): isset() または empty() が存在しないプロパティまたはアクセスできないプロパティに使用される場合、 __isset() が呼び出されます。

__destruct(): オブジェクトへのすべての参照が存在しない場合、クラスのデストラクター削除されたとき、またはオブジェクトが明示的に破棄されたときに実行されます。

5. 以下に示すように、どのような結果が出力されますか?

foreach ($array as $key => $item) 
{            $array[$key + 1] = $item + 2;            
echo "$item";        }        
print_r($array);
结果示例: $array = [3,6,7,8];
3678 //echo 输出数组内元素的值Array(   
 [0] => 3  //$key 保持不变    
 [1] => 5 //每次的$eky + 1,对应的值加2,    [2] => 8    [3] => 9    [4] => 10)

laravel

他のフレームワークと比較したlaravelの長所と短所

laravel

長所: ユーザー数は世界ナンバーワン、完全なドキュメント、明確に整理されたフレームワーク構造、多数のサードパーティ拡張機能参照用のパッケージで、大規模な Web サイトの共同開発に適しています。ただし、Artisan 開発ツールは開発効率が高くなります。 Composer 拡張機能はミドルウェアを自動的にロードします

欠点: やや複雑で、一般的なフレームワークよりも開始に時間がかかります。多くのサードパーティ パッケージが参照されますが、一部のシナリオではクラス内の一部のメソッドのみが使用され、コードが少し複雑に見えます。冗長

ThinkPHP

利点: MVC およびオブジェクト指向に基づいた高速でシンプルな軽量の PHP 開発フレームワークであり、Apache2 オープン ソース ライセンスの下でリリースされており、優れたパフォーマンスと最小限の設計原則を維持しています。コードをベースに、開発経験と使いやすさにこだわり、独自機能を多数搭載し、WEBアプリケーション開発を強力にサポートします。シンプル、明確、便利ですぐに始められます

欠点: オブジェクト指向設計が欠如しており、バージョン 5 は基本的にオブジェクト指向であり、フレームワーク コミュニティに関連する補助ツールがほとんどありません

Mysql

1。 int(10) と int(11) の違い

BIT[M] ビット フィールド タイプ、M は値ごとのビット数を表し、範囲は 1 ~ 64、M が無視される場合、デフォルトは 1

TINYINT [( M)] [符号なし] [ゼロフィル] M デフォルトは 4 です。非常に小さい整数。符号付きの範囲は -128 ~ 127 です。符号なしの範囲は 0 ~ 255 です。

SMALLINT[(M)] [UNSIGNED] [ZEROFILL] M のデフォルトは 6 です。小さな整数。符号付きの範囲は -32768 ~ 32767 です。符号なしの範囲は 0 ~ 65535 です。

MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL] M のデフォルトは 9 です。中程度のサイズの整数。符号付きの範囲は -8388608 ~ 8388607 です。符号なしの範囲は 0 ~ 16777215 です。

INT[(M)] [UNSIGNED] [ZEROFILL] M のデフォルトは 11 です。通常サイズの整数。符号付きの範囲は -2147483648 ~ 2147483647 です。符号なしの範囲は 0 ~ 4294967295 です。

BIGINT[(M)] [UNSIGNED] [ZEROFILL] M のデフォルトは 20 です。大きな整数。符号付きの範囲は -9223372036854775808 ~ 9223372036854775807 です。符号なしの範囲は 0 ~ 18446744073709551615 です。

注意: ここでの M は、データベースに格納される特定の長さを表すものではありません。以前は、int(3) は長さ 3 の数値のみを格納できるのに対し、int(11) は長さ 11 の数値を格納できると常に誤解されていました。 、これは完全に間違いです。実際、int 型を使用することを選択すると、int(3) であっても int(11) であっても、データベースに 4 バイトの長さが格納されます。int(3) を使用する場合、「is 10」と入力すると、次のようになります。デフォルトでは、ストレージ ビット 010 が与えられます。これは、3 桁がデフォルトの長さを表すことを意味します。3 桁を超えると、影響はありません。
**int(M) Mは最大表示幅を示します。最大有効表示幅は 255 です。オプションの表示幅指定は、表示幅が指定された列幅より小さい場合に、左から幅を埋めるために使用されます。表示幅は、列内に保持できる値の範囲を制限しません。また、列の指定された幅を超える値の表示を制限しません。

2. インデックス左の原則:

のように、文字列を一致させる場合、ワイルドカードで始まらないように、左側を固定する必要があり、フィールドインデックスが機能します

複合インデックス、左側のフィールドが固定されている場合、インデックスが と一致する場合、右側のインデックスのみが有効です。複合インデックスのキーワードの並べ替えは左側のフィールドに基づいているため、左側のフィールドが同じ場合は、右側のフィールドに従って並べ替えられます。

3. インデックス作成の長所と短所:

利点:

インデックスを作成すると、システムのパフォーマンスが大幅に向上します

一意のインデックスにより、データベース テーブル内のデータの各行の一意性が保証されます

取得を大幅に高速化します

テーブル間の接続を高速化します

データの取得にグループ化句と並べ替え句を使用する場合、クエリでのグループ化と並べ替えの時間を短縮します

インデックスを使用することで、クエリ プロセス中に最適化ハイダーを使用してシステムを改善できますパフォーマンス

欠点:

インデックスの作成と維持には時間がかかり、データ量が増えると時間がかかります。

テーブル内のデータを追加、削除、または変更する場合、インデックスを動的に維持する必要があります。データのメンテナンスが軽減されます

4. mysql マスターサーバーとスレーブサーバーの間でデータがどのように同期されるかを説明してください。マスターとスレーブが正しく同期できない原因は何ですか?

ネットワーク遅延

mysql のマスター/スレーブ レプリケーションは binlog に基づく非同期レプリケーションであるため、当然ながら、特にデータ同期が発生する場合、マスター/スレーブ同期の原因の大部分はネットワーク遅延です。この可能性は非常に高いため、読み取りと書き込みを分離し、ビジネス層からの初期の設計に注意を払ってください。

マスターマシンとスレーブマシンの負荷が不一致です

mysqlマスタースレーブレプリケーションはマスターデータベース上で1つのioスレッドを開始し、上から1つのsqlスレッドと1つのioスレッドを開始するため、いずれかのマシンの負荷は非常に高い 、ビジーすぎるため、いずれかのスレッドのリソースが不足し、マスターとスレーブの不一致が発生します。

max_allowed_pa​​cketの設定が矛盾しています

マスターデータベースのmax_allowed_pa​​cket設定がスレーブデータベースの設定より大きい場合、マスターデータベースで大きなSQL文を実行できる場合、スレーブデータベースの設定が小さすぎるため実行できません。 、マスターとスレーブの不一致が発生します。

オートインクリメントキーから始まるキー値とオートインクリメントステップ設定の不一致により発生するマスタースレーブ不一致。

mysql の異常なダウンタイムの場合、sync_binlog=1 または innodb_flush_log_at_trx_commit=1 が設定されていない場合、binlog またはリレーログ ファイルが破損し、マスターとスレーブの不一致が発生する可能性が非常に高くなります。

マスターとスレーブの同期は、mysql 自体のバグによって引き起こされます。

バージョンが不一致で、特に上位バージョンがマスターで下位バージョンがスレーブの場合、マスターデータベースでサポートされている機能がスレーブデータベースではサポートされていません

5 次のような順序テーブルがあります。最も多く購入したユーザーを見つける 2 人のユーザー

order_id

user_id

goods

100000 100 apple

100001 100 apple

100002 101 orange

100003 102 Apple

100004 102 バナナ

sql:

SELECT order_id,user_id,COUNT( order_id) AS count FROM order GROUP BY user_id ORDER BY count DESC 制限 2


Linux

Web サービスが遅いことを確認する方法

top: システムのパフォーマンスを確認する

Nginx: 追加$request_time を最後のフィールドまで

php ページのリクエストを一覧表示 3 秒以上かかるページを表示し、その回数を数えて最初の 100 件を表示

cat access.log|awk '($NF > 1 && $7~/.php/){print $7}'|sort uniq -c|sort -nr|head -100


コードでの実装、書き込み開始時間、書き込み終了時間

包括的

1. AES と RSA の間:

RSA は非対称暗号化、公開鍵暗号化、秘密鍵復号化であり、その逆も同様です。短所: 実行速度が遅く、ハードウェアへの実装が困難です。一般的な秘密キーの長さは 512 ビット、1024 ビット、2048 ビット、および 4096 ビットです。長さが長いほど安全性は高くなりますが、キーの生成が遅くなり、暗号化と復号化に時間がかかります。

AES 対称暗号化、最長キーはわずか 256 ビット、高速実行でハードウェアへの実装が簡単です。対称暗号化であるため、送信前に通信する双方の当事者がキーを知っている必要があります。

AES加密数据块分组长度必须为128比特,密钥长度可以是128比特、192比特、256比特中的任意一个(如果数据块及密钥 长度不足时,会补齐)

总结:采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,这样我们就集成了两类加密算法的优点,既实现了加密速度快的优点,又实现了安全方便管理密钥的优点。

RBAC:基于角色的访问控制

一个用户属于多个角色

角色拥有多个动作的权限

用户是否具有某些动作的权限

表:用户表、角色表、动作表,用户角色关联表、角色动作关联表

MongoDB

MongoDB数据类型:

String(字符串): mongodb中的字符串是UTF-8有效的。

Integer(整数): 存储数值。整数可以是32位或64位,具体取决于您的服务器。

* Boolean(布尔): 存储布尔(true/false)值。

Double(双精度): 存储浮点值。

Min/ Max keys(最小/最大键): 将值与最低和最高BSON元素进行比较。

Arrays(数组): 将数组或列表或多个值存储到一个键中。

Timestamp(时间戳): 存储时间戳。

Object(对象): 嵌入式文档。

Null (空值): 存储Null值。

Symbol(符号): 与字符串相同,用于具有特定符号类型的语言。

Date(日期): 以UNIX时间格式存储当前日期或时间。

Object ID(对象ID) : 存储文档ID。

Binary data(二进制数据): 存储二进制数据。

Code(代码): 将JavaScript代码存储到文档中。

Regular expression(正则表达式): 存储正则表达式

算法

1. 排序算法

* 快速排序

快速排序是十分常用的高效率的算法,其思想是:我先选一个标尺,用它把整个队列过一遍筛选,以保证其左边的元素都不大于它,其右边的元素都不小与它function quickSort($arr){  // 获取数组长度

 $length = count($arr);  // 判断长度是否需要继续二分比较
  if($length <= 1){    return $arr;
  }  // 定义基准元素
  $base = $arr[0];  // 定义两个空数组,用于存放和基准元素的比较后的结果
  $left = [];
  $right = [];  // 遍历数组
  for ($i=1; $i < $length; $i++) { 
    // 和基准元素作比较
    if ($arr[$i] > $base) {
      $right[] = $arr[$i];
    }else {
      $left[] = $arr[$i];
    }
  }  // 然后递归分别处理left和right
  $left = quickSort($left);
  $right = quickSort($right);  // 合并
  return array_merge($left,[$base],$right);
  
}

冒泡排序

思路:法如其名,就像冒泡一样,每次从数组中冒出一个最大的数
比如:2,4,1
第一次冒出4:2,1,4
第二次冒出2:1,2,4

function bubbleSort($arr){  // 获取数组长度
  $length = count($arr);  // 第一层循环控制冒泡轮次
  for ($i=0; $i < $length-1; $i++) { 
    
    // 内层循环控制从第0个键值和后一个键值比较,每次冒出一个最大的数
    for ($k=0; $k < $length-$i; $k++) { 
      if($arr[$k] > $arr[$k+1]){
        $tmp = $arr[$k+1];
        $arr[$k+1] = $arr[$k];
        $arr[$k] = $tmp;
      }
    }
  }  return $arr;
}

选择排序

思路:每次选择一个相应的元素,然后将其放到指定的位置

function selectSort($arr){   
 // 实现思路  // 双重循环完成,外层控制轮数,当前的最小值,内层控制比较次数  // 获取长度  $length = count($arr);  
 for ($i=0; $i < $length - 1; $i++) { 
   // 假设最小值的位置    $p = $i;  
   // 使用假设的最小值和其他值比较,找到当前的最小值    for ($j=$i+1; $j < $length; $j++) { 
     // $arr[$p] 是已知的当前最小值  
     // 判断当前循环值和已知最小值的比较,当发下更小的值时记录下键,并进行下一次比较      if ($arr[$p] > $arr[$j]) {        $p = $j; // 比假设的值更小
     }
   }  
   // 通过内部for循环找到了当前最小值的key,并保存在$p中    // 判断 日光当前$p 中的键和假设的最小值的键不一致增将其互换    if ($p != $i) {      $tmp = $arr[$p];      $arr[$p] = $arr[$i];      $arr[$i] = $tmp;
   }
 }  // 返回最终结果
 return $arr;
}

相关推荐:

PHP中的运算符及PHP知识基础

关于PHP知识点的详细介绍

对PHP知识的有关介绍介绍

以上がphp に関する重要な php の知識ポイントを共有します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。