この記事では、PHP プログラマーを中級プログラマーと上級プログラマーの 2 つのカテゴリーに分け、これら 2 つのカテゴリーのプログラマーが持つべきスキルを検討します。
中級 PHP プログラマー
1.Linux:
シェル スクリプトをスムーズに使用して、多くの自動化された作業を完了することができ、操作も得意であり、大量のテキストを完成させることができます。処理やデータ統計など。基本的に、特別ではないほとんどの Linux プログラム (MongoDB/Redis/Sphinx/Luncene/SVN などのさまざまなライブラリ、パッケージ、サードパーティの依存関係などを含む) をインストールできます。基本的な Linux サービスを理解し、その表示方法を知る Linux パフォーマンス インデックス データ、Linux での基本的な問題追跡などを理解する
2. Nginx:
最初の段階に基づいて、マルチコア設定、イベント、proxy_pass、sendfile/tcp_* 設定、関連する設定とタイムアウトなどのパフォーマンスへの影響を知る、nginx が Web サーバーに加えてプロキシ サーバー、リバース静的サーバー、その他の設定も実行できることを知る。権限を設定し、nginx 拡張機能 nginx をコンパイルする方法を知る、nginx の基本的な動作原理 (マスター/ワーカー メカニズム、epoll) を知る、nginx のパフォーマンスが Apache のパフォーマンスより優れている理由を知る
3.
第 1 段階の MySQL に基づいて、MySQL を構築できることに加えて、通常の SQL 最適化 (group by/order by/rand 最適化など) を含む多くのヒントを習得します。また、MySQL データのホットおよびコールド バックアップも行います。また、innodb/myisam のパフォーマンスに影響を与える設定オプション (key_buffer /query_cache /sort_buffer/innodb_buffer_pool_size/innodb_flush_log_at_trx_commit など) も知っており、適切な値も知っています。これらのオプションの設定に加えて、mysql マスター/スレーブ同期環境の構築方法、slow_log/explain などの MySQL パフォーマンス トレースの違いなど、いくつかの特別な設定オプションについても知っています。また、基本的なインデックスの作成と処理を理解し、基本的な MySQL アーキテクチャ (サーバー + ストレージ エンジン) を原理的に理解し、基本的な InnoDB/MyISAM インデックス ストレージ構造と相違点 (クラスター化インデックス、B ツリー) を知ることができます。基本的な InnoDB トランザクション処理メカニズム、ほとんどの MySQL 例外の解決策を理解している (または解決策を見つける場所を知っている)。状況が許せば、NoSQL の代表である MongoDB データベースについて学び、MySQL との違いを比較し、適切なアプリケーション シナリオで MongoDB を安全かつ慎重に使用し、PHP と MongoDB の基本的な組み合わせ開発を理解することをお勧めします。4. Redis/Memcached:
ほとんどの中規模システムでは、キャッシュ処理が必ず関係するため、Memcached と Redis の基本的なキャッシュの類似点、相違点、およびアプリケーション シナリオを理解し、次のことを行うことができるようにする必要があります。 Redis/Memcached を個別にインストールするため、Memcahed の基本的な機能と制限 (最大値など) を理解し、PHP とその使用法を組み合わせる方法を理解し、通常のデータ型を理解し、どの型が使用されるかを理解します。どのようなシナリオで使用されるか、Redis トランザクションを理解するなど。原理部分では、Memcached のメモリ構造 (スラブ機構) を一般的に理解できます。Redis は、一般的なデータ型 (SDS/リンクリスト/SkipList/HashTable) などの基盤となる実装ストレージ構造を理解します。 Redis のトランザクション、RDB、AOF、その他のメカニズムについて詳しく学ぶことができます。 良い5. PHP:
第 1 段階の機能に加えて、コンパイルおよびインストールされた構成を自由にインストールできます。 PHP とさまざまなサードパーティ拡張機能のほとんどの構成オプションと php-fpm の意味 (パフォーマンスに影響する max_requests /max_children/request_terminate_timeout やその他の構成など) を理解し、さまざまな機能に精通しています。 PHP の基本テクノロジー (フレームワークに関する PHP オブジェクト指向/SPL /特殊機能などの構文レベルでの深い理解など) を含む、少なくともコードを読んでいること。従来の PHP MVC フレームワークの 1 つを理解し、基本的な PHP フレームワークの内部実装メカニズムと設計アイデアを理解していること。PHP 開発で従来のフレームワークを上手に使用できること。開発に適用するための設計パターン (抽象ファクトリ/シングル ケース/オブザーバー/コマンド チェーン/戦略/アダプターおよびその他のパターン)、開発を完全に自由化し、MVC パターンを深く理解し、ビジネス プロジェクト開発のさまざまなコード最適化方法に精通し、独自の PHP MVC フレームワークを開発することをお勧めします。 PHP、ほとんどの PHP セキュリティ問題の解決に精通しており、基本的な PHP 実行メカニズムの原理 (Zend エンジン/拡張基本動作メカニズム) に精通しているWeb サイトのアーキテクチャ、データベース、および基本的な PHP を設計できる。ほとんどの中規模システム向けのフレームワークの選択。次のようなタスクを実行できます。CDN (Squid) -> 基本設計、開発。データベース構造の Web サイトのメンテナンス。毎日数百万から数千万のトラフィックがある基本的な Web サイトの開発とメンテナンスをサポートできます。
シニア PHP プログラマー特定の方向または分野について深い研究をしている。 (深次元開発) 目標: 基本的な PHP ビジネス開発を完了できることに加えて、ほとんどの詳細かつ複雑な技術的問題も解決でき、独立して実行できる中規模および大規模なシステム設計および開発作業を完了できるようになります。そして、特定の技術的方向に深く入り込み、この分野ではより専門的になります。 (例: MySQL、Nginx、PHP、Redis など、あらゆる方向の詳細な調査) 1. Linux: 第 2 段階の機能に加え、通常の運用とパフォーマンスの監視に加えてシェル スクリプトに関しては、多くの高度で複雑なコマンド (watch/tcpdump/starce/ldd/ar など) を使用して作業を完了できます。私は、比較的複雑なシェル スクリプト (500 以上) を作成できました。バックアップ、自動処理、モニタリングなどの多くのタスクの完了を支援します。awk/sed/perl などのアプリケーションにすでに習熟しており、さまざまな複雑なデータを自由に操作、制御、処理、分析できます。フォーマット、Linux の内部メカニズム、カーネル モジュールの読み込み、起動時のエラー処理などをある程度理解しています。同時に、NFS、ディスク管理などのその他の関連事項も理解しています。 第 2 段階に基づいて、私は Nginx を非常にうまく操作することができ、モニタリング、パフォーマンスの最適化など、Nginx 上でより詳細な運用と保守作業を実行できるようになりました。複雑な問題の処理など、個人的な興味に応じて、主にソースコードを読んで、特定のマスター/ワーカーの動作メカニズム、Nginx の内部イベント処理など、Nginx の動作原理の詳細な学習に焦点を当てることを検討できます。 、メモリ管理など、同時に Nginx 拡張機能の開発を学び、同時にいくつかの独自のプライベート拡張機能をカスタマイズすることができます。より良いモデルを組み合わせて適用することができます。この段階での要件は Nginx の原理を深く理解することであり、Nginx の分野で深い専門家になることを検討できます。 MySQL アプリケーションに関しては、第 2 段階に基づいて、以前の基本的な SQL 最適化に加えて、インポートとエクスポートなどのいくつかの複雑な操作も完了できます。大量のデータ バッチ、オンライン 大量のデータ バッチのテーブル構造の変更やインデックス フィールドの追加または削除などのリスクの高い操作。インストールや構成に加えて、さまざまなトレースなど、より複雑な MySQL の問題も処理できます。プログラム、MySQL 高可用性アーキテクチャなどが関係しており、MySQL アプリケーション レベルで理解されているため、次のような MySQL の主要なテクノロジに精通しています。トランザクション メカニズム (分離レベル、ロックなど)、およびトリガー、パーティション、およびその他のテクノロジについての一定の理解と適用がある。MySQL のパフォーマンスに関しては、ディスクの最適化 (SAS から SSD への移行)、サーバーの最適化 (メモリ、サーバー構成) があります。 、第 2 段階に加えてその他のコアパフォーマンス最適化オプション (innodb_log_buffer_size/back_log/table_open_cache /thread_cache_size/innodb_lock_wait_timeout など)、接続プール ソフトウェア選択アプリケーション、show * (show status/show profile) などの操作ステートメントの深い理解)、ほとんどのパフォーマンス問題の追跡を完了できる。災害復旧とリカバリを含む MySQL バックアップ テクノロジーに精通しており、Binlog、コールド ホット バックアップ、マルチ IDC バックアップなどを深く理解している。マスタ・スレーブ同期(レプリケーション)技術のソースコードを学ぶ、または特定のストレージエンジン(MyISAM/Innodb/TokuDB)について学ぶなど、MySQLの動作メカニズムのソースコードの一部を読み始めるなどの原則、条件が許せば、CSV エンジンを参照して独自のシンプルなストレージ エンジンを開発し、このプロセス中にデータを保存し、MySQL についての理解を深めることができます。興味がある場合は、DBA の指導による開発を検討することもできます。 。 MongoDB レベルでは、たとえば、書き込みを減らし読み取りを増やす場合に MongoDB のオンライン適用を開始することや、オンライン データ分析と処理操作を実行することを検討できます。特定のシナリオは作業に基づいていますが、中心となるのは次のとおりです。 NoSQL とは異なるシナリオのアプリケーションについて、条件や関心が許せば、MongoDB の動作メカニズムについてさらに詳しく学び始めることができます。 第 2 段階に基づいて、より深く応用して学習できます。 Memcached は特に複雑ではないため、ソース コード、特にメモリ管理部分を読んで Redis 部分をより深く理解することをお勧めします。より複雑なデータ構造のアプリケーションを実行できます (ランキング操作には zset が使用されます)。フラッシュ セール シナリオ アプリケーションで確実に Atomicity が使用されるようにするための /トランザクション処理)、これには主に、aof などの同期メカニズムのアプリケーションの学習と、高可用性の Redis アプリケーション アーキテクチャとクラスターの設計が含まれます。蓄積された知識は、特にコアイベント管理、メモリ管理、内部コアデータ構造などについて読むと完全に理解できます。興味があれば、Redis の非常にプロフェッショナルなユーザーになることができます。 基本的なコアスキルとして、第2段階を踏まえたより深い学習と応用が必要です。基本的なコードの適用に関しては、PHP 開発で遭遇する問題の 95% を解決でき、ほとんどの PHP テクニックを理解できます。また、ほとんどの PHP フレームワークを 1 日以内にすぐに使い始めることができ、各主流の PHP フレームワークの利点を理解できます。プロジェクト開発中に、構成に関して迅速かつ便利にテクノロジを選択できます。第 2 段階で学んだ知識に加えて、複雑な高度な構成など、より不明瞭な構成オプション (php auto_prepend_file/auto_append_file) についても知ることができます。拡張機能と原則 (memcached 拡張機能設定の memcache.hash_strategy、apc 拡張設定の apc.mmap_file_mask/apc.slam_defense/apc.file_update_protection など)、php-fpm の動作を含む、php の動作メカニズムをよく理解している。メカニズム (php-fpm などにより、さまざまな構成マシンでプロセス番号の計算と原理が可能になります)、zend エンジン (vm/gc/stream 処理) に基本的な知識があること、基本的な PHP カーネル ソース コードを読んでいること (または関連記事を読んでいること)、 PHP の内部メカニズムを理解している。 ほとんどのコア データ構造 (基本型/配列/オブジェクト) の実装を理解し、コア インフラストラクチャ (zval/hashtable/gc) を深く理解している。基本的な PHP 拡張機能の開発を実行でき、拡張機能開発 (minit/rinit など) の中級および高度な知識を理解し、php と apache/nginx (mod_php/fastcgi) の間のさまざまな通信および対話方法の詳細に精通している); PHP 拡張機能の開発に加えて、PHP をより低いレベルから理解するために Zend 拡張機能の開発を学習することを検討できます。 6. C/C++: 第 2 段階に基づいて、C/C++ 言語をより深く理解し、基本に加えて小規模および中規模の C/C++ システムの開発を完了できます。第 2 段階 基本的な C/C++ 構文とデータ構造。また、特別な作業でのニーズを容易にするために、いくつかの特別なデータ構造 (b-tree/rb-tree/skiplist/lsm-tree/trie-tree など) を学ぶこともできます。システムプログラミングに関しては、マルチプロセス、マルチスレッドプログラミングに精通している。マルチプロセス状況下で、マルチプロセス間の通信方法のほとんどを理解し、通信方法(共有メモリ/セマフォ/パイプラインなど); マルチスレッド プログラミングはロック競合の問題をうまく解決でき、同時にマルチスレッド プログラムの開発とデバッグができ、ネットワーク プログラミングに精通し、マルチスレッドの違いと選択を理解します。 - プロセス モデル/マルチスレッド モデル/非同期ネットワーク IO モデル、さまざまな非同期ネットワーク IO モデル (select/poll /epoll/iocp など) の原理と違いに精通しており、一般的な非同期フレームワーク (ACE) に精通している/ICE /libev/libevent/libuv/Boost.ASIO など) とその使用法についても時間があれば、同時にいくつかの国内開発ライブラリ (Muduo など) を参照することもできます。同時実行プログラムのアーキテクチャ (リーダーフォロー/マスターワーカーなど)、C/C++ バックエンドサーバー開発の問題のほとんどを理解している (メモリ管理、ログ出力、高い同時実行性、フロントエンドとバックエンドの通信プロトコル、サービス監視)、さまざまなバックエンド サービス (struct/http/thirft/protobuf など) の RPC 通信の問題を理解し、コンパイルおよびデバッグ プログラムを開発するために GCC と GDB をよりよく使用できるようになり、迅速にトレースできるようになります。オンライン プログラムがコア化された後に問題を解決します。 開発に関しては、いくつかの一般的なツールやライブラリ (非同期ネットワーク フレームワーク、ログ ライブラリ、メモリ プール、スレッド プールなど) を蓄積または開発できますが、バグを追わないようにするため、開発後に適用するかどうかに注意してください。 HTTP プロトコルについての深い理解 (各詳細なプロトコル、特殊なプロトコル コード、およびその背後にある理由を含む) 302 の静的ファイルはキャッシュされ、502 は nginx の背後にある php がハングすることを意味します); 以前のさまざまなフロントエンド フレームワークのアプリケーション統合機能に加えて、フロントエンドの学習に興味がある場合は、次の形式でさらに深く学ぶことができます。 jQuery などのフロントエンド フレームワークの開発、または JavaScript スキルの比較的簡単なテストであるリッチ テキスト エディターの開発 他の分野での言語学習: 基本的な PHP/C/C++ の基礎を習得する。言語については、個人の興味や趣味に応じて、現時点ではさまざまなプログラミング言語を学習することをお勧めします。スクリプト言語については、Python/Ruby などを学ぶことができます。関数型プログラミング言語には /Scala/Erlang、静的言語には Java/Golang、データ統計分析には R 言語など、別の観点からバックエンド ビジネスを実行したい場合は、前述の Node.js も試してみてください。 Nginxと組み合わせたNginx_Luaなど。さまざまな言語を学ぶことは、主に自分自身のビジョンと問題解決方法の違いを改善することです。たとえば、クロスマシン通信シナリオには、プロセス/スレッドに加えて軽量のコルーチンもあることを理解するでしょう。 , Erlang の解決策は驚くほど簡単です。たとえば、C/C++ を選択したくない場合は、主に視野を広げるために、同様の効率的な Erlang/Golang も利用できます。 9. 他の専門的な方向で勉強する: この段階では、基本的な LNMP スキルに加えて、他の分野の知識を学ぶことも検討します。これらはすべて、個人の興味と長期的な目標に応じて可能です。現在、クラウドコンピューティング(分散ストレージ、分散コンピューティング、仮想マシンなど)、機械学習(データマイニング、パターン認識など、統計への適用、パーソナライズされたレコメンデーション)、自然科学など、選択できる分野は数多くあります。言語処理(中国語の単語分割など)、検索エンジン技術、グラフィックスと画像、音声認識など。これらの高度なものに加えて、高性能システム、モバイル開発 (Android/IOS)、コンピュータ セキュリティ、組み込みシステム、ハードウェアなど、エンジニアリングについてさらに詳しく学べる場所も数多くあります。 10. システム設計: 第 2 段階に基づいて、システム設計は、比較的複雑な中規模および大規模システムを設計するために習得した経験とスキルを適用でき、さまざまな複雑なオンライン システムの問題のほとんどを解決できます。完全な同様のブラウザ -> 負荷分散 -> Nginx+PHP -> さまざまな複雑なバックエンド RPC インタラクション (ストレージ バックエンド) 、不正行為防止バックエンド、外部サービス) -> バックエンド Jiangzi のより複雑なビジネス。毎日数千万から数億のトラフィック Web サイトの通常の開発とメンテナンスをサポートできます。