ホームページ >バックエンド開発 >PHPチュートリアル >「2019 Xiaomi Spring Shanghai PHPインターン採用面接の質問」に対するいくつかの回答の分析
関連する推奨事項: "2019 PHP 面接の質問の概要 (コレクション)"
1 丶Nginx で負荷分散を実現する方法
これは比較的単純です
#1. ポーリング
これはデフォルトの戦略であり、各リクエストを順番に異なるサーバーに 1 つずつ割り当てます。 、サーバーがハングアップした場合、自動的に解消できます。upstream fengzp.com { server 192.168.99.100:42000; server 192.168.99.100:42001; }
2. 最小接続数
接続数が最も少ないサーバーにリクエストを割り当てますupstream fengzp.com { least_conn; server 192.168.99.100:42000; server 192.168.99.100:42001; }
3. 重み
重みを使用してサーバー アクセス率を指定します。デフォルトの重みは 1 です。次の構成では、server2 のアクセス率が server1 の 2 倍になります。upstream fengzp.com { server 192.168.99.100:42000 weight=1; server 192.168.99.100:42001 weight=2; }
4.ip_hash
各リクエストはアクセス IP のハッシュ値に従って割り当てられるため、同じクライアントからの連続した Web リクエストが分散されます。同じサーバーで処理することで、セッションの問題を解決できます。サーバーがハングアップした場合は、自動的に解消できます。upstream fengzp.com { ip_hash; server 192.168.99.100:42000; server 192.168.99.100:42001; }ip_hash は重みと組み合わせて使用できます。
2 丶Linux でよく使用されるコマンド
参考記事:https://www.php.cn/linux-415502.html
3 丶WeChat ミニ プログラムでよく使用されるコンポーネント
表示 テキスト ボタン ナビゲーター スクロール ビュー...etc.4丶Nginx で仮想ホストを構成する方法#参考記事:
https://www.php.cn/php-weizijiaocheng-387454.html参考記事:https://www.php.cn/phpkj/thinkphp/422769.html
6丶TP5 および Laravel フレームワークでのデータ移行
参考記事:
https://www.php.cn/js-tutorial-386843 .html
https://www.php.cn/phpkj/laravel/414216.html
RBACとは#RBAC (ロールベースのアクセス制御): 英語名はRose Base Access Controllerです。このブログでは、このモデルの許可システム設計を紹介します。ユーザーとアクセス許可の間の直接の関連付けはキャンセルされ、ユーザーに関連付けられたロールおよびロールに関連付けられたアクセス許可を通じて、ユーザーのアクセス許可が間接的に付与されました。これによりデカップリングが実現します。 RBAC は開発過程で次のバージョンに分割されます。 RBAC0、RBAC1、RBAC2、RBAC3。
8 丶注文プロセスモジュール9 丶注文支払い完了後の操作
10 丶設定メールアクティベーション接続の有効期限
アクティベーション コードをデータベースに書き込むときは、タイムスタンプの有効期限を書き込みます
11 丶Redis と Mongodb1. パフォーマンス
は比較的高いため、パフォーマンスがボトルネックになることはありません。 一般に、TPS の点では、redis と memcache は似ています。
2. 操作の利便性redis はバージョン 2.0 以降に独自の VM 機能を追加し、物理メモリの制限を突破しました; キーの有効期限を設定できますvalue (memcache に似ています)。 mongoDB は、大量のデータの保存に適しています。メモリ管理にはオペレーティング システム VM に依存し、大量のメモリを消費します。このサービスを他のサービスと組み合わせないでください。
4. 可用性 (単一点問題)単一点問題の場合: redis はクライアントに依存して分散読み取りと書き込みを実装します。スレーブからレプリケートする場合、スレーブ ノードがマスター ノードに再接続するたびに、スナップショット全体に依存する必要があります。増分レプリケーションはありません。パフォーマンスと効率の問題により、シングルポイントの問題はさらに複雑になります。自動シャーディングはサポートされていないため、プログラムによって一貫したハッシュ メカニズムを設定する必要があります。
別の方法としては、redis 独自のレプリケーション メカニズムを使用してアクティブ レプリケーション (複数のストレージ) を使用するか、増分レプリケーション (自分で実装する必要があります) に変更することです。一貫性の問題とパフォーマンスの問題はトレードオフになります。
mongoDB は、マスター/スレーブ、レプリカセット (内部で paxos 選択アルゴリズムを使用、自動障害回復)、自動シャーディング メカニズムをサポートし、フェイルオーバーとシャーディング メカニズムをクライアントから保護します。
5. 信頼性 (永続性)データ永続性とデータ回復について、redis は (スナップショット、AOF) をサポートします: 永続性、AOF 強化のためにスナップショットに依存しながら、信頼性を向上させます。 MongoDB は、バージョン 1.8 以降、永続性の信頼性をサポートするために binlog メソッドを採用しています。
6. データの一貫性 (トランザクション サポート)redis トランザクション サポートは比較的弱く、トランザクション内の各操作が継続的に実行されることを保証することしかできません。取引。
7. アプリケーション シナリオredis: より少ないデータ量でより多くのパフォーマンスの操作と計算を実行 MongoDB:主に膨大なデータのアクセス効率の問題を解決します 12 丶redisとmemcachedの違い 参考記事:https:/ /www.php.cn/mysql-tutorials-410551.html 13 丶redis のキュー 実装するには 2 つの方法があります。 redis キュー : 1. プロデューサー/コンシューマー モデル。 通常バージョン: たとえば、キュー内で、プロデューサー A がデータをプッシュし、コンシューマー B がデータをポップしますが、キューはまだ空です。だから1対1なんです。 先入れ先出しや先入れ後出しなどについては、関数 lpush (キューの左側、つまり先頭から 1 つのデータをプッシュ) に従うことができます。キューの右側、つまりキューの最後尾からデータを 1 つプッシュする) rpush(キューの右側、つまりキューの最後尾からデータを 1 つプッシュする) lpop(管理と同じ) rpop などで制御します。 ブロッキング バージョン: ただし、上記のコマンドは、データの有無に関係なく、すぐに返されます。データをフェッチするための lpop の拡張バージョン、blpop (ブロック レフト ポップ) ブロッキング バージョンがあります。 , Usage: blpop key1 key2 ... keyn 10 複数のキーの値を同時に事前に取得し、タイムアウトを 10 秒に設定します。すべてのキーに値がない場合は、10 秒間ブロックして 2 を返します。パブリッシャー/サブスクライバー モード。 コンセプト: 3 人のユーザー A、B、C が msg という名前のチャネルに同時に登録し、パブリッシャーが msg のチャネルにデータをパブリッシュします。 A 、3 人のユーザー B と C がデータを受信します。 注: 明らかに、3 人のユーザー ABC をブロックする必要があります。サブスクライブされたデータの受け取り方法は、redis に登録されているコールバック関数に依存する必要があります。 公開されたデータは redis では複製されません。つまり、公開された後、A、B、C はさまざまな理由によりデータを受信できませんでした。 14 丶redis のデータ型 Redis は、string (文字列)、hash (ハッシュ)、list (リスト)、set (セット)、および 5 つのデータ型をサポートします。 zset (ソートされたセット:順序付きセット)。 15 丶TP フレームワークのイベント 16 丶 TP フレームワークの依存性注入 は、 Laravel 17 丶MySQL の読み書き分離操作 参考記事:https://www.php.cn/mysql-tutorials-360278.html 18 丶データベース varchar と char の違い varchar は未使用のスペースを再利用します 19 丶MyIsam の違いMyISAM: 従来の ISAM タイプをベースにしたデフォルトのテーブルタイプ ISAM は、Indexed Sequential Access Method (インデックス順次アクセス方式) の略称で、標準的な方式です。記録やファイルを保存するため。トランザクション安全ではなく、外部キーもサポートされていないため、大量の選択を実行する場合は、Insert MyISAM の方が適しています。 1. テーブル ロックの違い MyISAM: myisam はテーブル レベルのロックのみをサポートします。ユーザーが myisam テーブルを操作する場合、select、update、delete、insert ステートメントはテーブルを自動的にロックします。ロックされたテーブルが挿入の同時実行性を満たしている場合、テーブルの最後に新しいデータを挿入できます。 lock table コマンドを使用してテーブルをロックすることもできます。この操作は主にトランザクションをシミュレートできますが、非常に高価であり、通常は実験的なデモンストレーションでのみ使用されます。 InnoDB: Innodb は、innodb の最大の機能であるトランザクションと行レベルのロックをサポートします。 2. データベース ファイルの違い MyISAM: myisam はヒープ テーブルに属します InnoDB: innodb はインデックス構成テーブルです 複数のテーブルスペースが使用されている場合、各テーブルには、各テーブルのデータとインデックスを保存するためのテーブルスペースファイルがあります。ファイル名はテーブル名で始まり、.ibd の拡張子が付きます。 3. インデックスの違い 1. 自動拡張について myisam エンジンの自動拡張カラムはインデックスである必要があります結合インデックスの場合。自動拡張は最初の列である必要はありません。ソートして、前の列に基づいて増加させることができます。 innodb エンジンの自動拡張はインデックスである必要があります。複合インデックスの場合は、複合インデックスの最初の列でもある必要があります。 2. 主キーについて myisam では、インデックスと主キーのないテーブルの存在を許可します。 Myisam のインデックスは、行が保存されているすべてのアドレスです。 。 innodb エンジンが主キーまたは空でない一意のインデックスを設定しない場合、6 バイトの主キー (ユーザーには見えません) が自動的に生成されます。 innodb データは次のとおりです。プライマリ インデックスの一部 (追加) インデックスはメイン インデックスの値を保持します。 3. count() 関数について myisam はテーブルの総行数を保存します. count(*) from table; が選択されている場合、その値は innodb はテーブル内の総行数を保存しません。select count(*) from table を使用すると、テーブル全体を走査することになり、大量のコストがかかります。 、 where 条件を追加した後、myisam と innodb は同じ方法でそれを処理します。 4. フルテキスト インデックス myisam は FULLTEXT タイプのフルテキスト インデックスをサポートします innodb は FULLTEXT タイプのフルテキスト インデックスをサポートしません(5.6 以降サポートされています) ですが、innodb は sphinx プラグインを使用してフルテキスト インデックス作成をサポートでき、その効果はより優れています。 (sphinx は、複数の言語で API インターフェイスを提供し、さまざまな mysql クエリを最適化できるオープンソース ソフトウェアです)。 5.delete from table このコマンドを使用すると、innodb はテーブルを再作成せず、データを 1 つずつ削除します。 innodb 上で実行します。 大量のデータを含むテーブルを保存する場合は、このコマンドを使用しないことをお勧めします。 (truncate table を使用することをお勧めしますが、ユーザーはこのテーブルを削除する権限を持っている必要があります)。 6. インデックスの保存場所 myisam のインデックスは、テーブル名が付いた .MYI ファイルに保存されます。 Innodb インデックスとデータはテーブル スペースに一緒に保存されます。 20丶MySQL にはいくつかのインデックスがあります 1. 通常のインデックス 最も基本的なインデックスは速度を上げるためのものです。クエリ速度が向上します。 2. 一意のインデックス は通常のインデックスと似ていますが、インデックスの列値は一意である必要がありますが、NULL 値が許可される点が異なります。組み合わせインデックスの場合、列値の組み合わせは一意である必要があります。 3. 主キー インデックス は、一般的に使用される主キー ID です。これは、NULL 値を許可しない特別な一意のインデックスです。通常、次の場所に作成されます。テーブル作成と同時に主キーインデックスを作成します。 機能: 1) テーブルには主キー インデックスが 1 つだけあります 2) 主キーには自動インクリメントが必要です 4。結合インデックス つまり、複数のフィールドによって確立されたインデックス ##5. フルテキスト インデックス##fulltext myisam エンジンのサポート 外部キーを確立する際の注意点: 1) テーブル エンジンは同じである必要があります 2) フィールドの型は同じである必要があります 3) 長さは同じである必要があります 4) 格納範囲は同じである必要があります 5 ) 制約フィールドは参照フィールドに出現する必要があります
以上が「2019 Xiaomi Spring Shanghai PHPインターン採用面接の質問」に対するいくつかの回答の分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。