PHP プログラマーのための技術的成長計画
私が知っている多くの PHP/LNMP プログラマーの開発軌跡に従って、個人的な経験と組み合わせて、将来についての多くのプログラマーの混乱、特に技術的なことに対する盲目さとパニックを抽象化しました。この記事では、多くの PHP プログラムが比較し、学習と成長の目標を設定できるように、各段階における PHP プログラマーの技術要件を簡単に整理しました。
この記事は、現在の主流のテクノロジーに基づいて基本的な概要を作成しています。設定全体は、PHP プログラマーがあまりしっかりした基礎を持っていないことを前提としており、すべての設定は非常に具体的かつ明確であるため、申し訳ありませんが、これは単なる個人的な発言であることをご理解ください。 (将来の技術的な変更は議論の範囲外です)
重要ポイント: LNMP に習熟する (中心となるのはインストールと構成の基本操作です)
目標: 基本的な LNMP システムのインストール、簡単な構成とメンテナンスを完了できるようになり、基本的な PHP 開発ができるようになります。単純なシステムの PHP 中規模システムで動作できる 特定の PHP 機能モジュールの開発をサポートします。
時間: この段階を完了するまでの時間は人によって異なり、成長が早く半年で合格する人もいますが、成長が遅く2、3年で完了する人もいます。
1.Linux:
基本的なコマンド、操作、起動、基本的なサービス構成 (rpm インストール ファイル、さまざまなサービス構成などを含む) ) ; 簡単なシェルスクリプトやawk/sedスクリプトコマンドなどを書くことができます。
2.Nginx:
nginx+php をインストールして構成できること、基本的な nginx コア構成オプションを理解していること、server/ について理解していることfastcgi_pass/ Access_log およびその他の基本的な設定は、nginx + php_fpm をスムーズに動作させることを目的としています。
3.MySQL:
自分で mysql を構築し、基本的な mysql 設定オプションを知り、innodb と myisam の違いを理解します。 InnoDB と MyISAM のさまざまな構成オプションについて知っている。2 つのエンジンの基本的な違いと、MySQL データベースを手動で構築して、正常に安定して実行できるようにエンコーディングを構成できることを理解している。主な目的は、実行可能な MySQL データベースを構築できるようにすることです。
4.PHP:
基本的な構文配列、文字列、データベース、XML、Socket、GD/ImageMgk 画像処理など。 MySQL 操作にリンクされたさまざまな API (mysql/mysqli/PDO) を使用して、さまざまなコーディングの問題を解決する方法を知り、一般的に使用される PHP フレームワーク (ThinkPHP、Zendframework、Yii、Yaf など) を理解し、基本的な MVC 操作メカニズムとその理由を理解します。これを行うことで、さまざまな PHP フレームワークの違いについて少し知ることができ、MVC フレームワークをすぐに学ぶことができます。開発プロジェクトのファイル ディレクトリ構成を理解し、基本的な優れたコード構造とスタイルを備え、小規模システムの開発と中規模システムの特定のモジュールの開発を完了できる。
5. フロントエンド:
時間が許せば、HTML/CSS/JS およびその他の関連知識を学び、何を知ることができます。 Web 標準、div+CSS の Web/WAP ページ モード、HTML5 と HTML4 の違いを理解していること、基本的なフロントエンドおよび JS フレームワーク (jQuery など) を理解していること (この項目は必須ではありません)。 , if 時間があれば、それについて少し学ぶのは問題ありませんが、個人的に強い興味がない限り、それに集中することはお勧めできません)
6.システム設計:
簡単なデータベース設計を含む小規模システムの基本設計を完了でき、ブラウザ -> Nginx+PHP -> データベース アーキテクチャの設計と開発を完了できる。毎日数十万から数百万のトラフィック Web サイトをサポートできる LNMP スキルの開発と保守により、LNMP のより包括的で熟練したアプリケーションを身に付けることができます。
目標:いつでもどこでも LNMP 環境をセットアップでき、開発環境やオンライン環境で発生する問題のほとんどを追跡して解決できるようになります。中規模システムのアーキテクチャと開発作業を独立して行うことができます。
1.
これに基づいて、シェル スクリプトをスムーズに使用して多くの自動タスクを完了できます。awk/sed/perl も適切に動作し、多くのテキスト処理とデータ統計を完了できます。 ; 基本的に、特別ではないほとんどの Linux プログラム (MongoDB/Redis/Sphinx/Luncene/SVN などのさまざまなライブラリ、パッケージ、サードパーティの依存関係などを含む) をインストールでき、基本的な Linux サービスを理解し、その方法を知っています。 Linux パフォーマンス インジケーター データを表示し、Linux 待機時の基本的な問題追跡を理解します。
2. Nginx:最初の段階に基づいて、マルチコア構成、イベント、proxy_pass、sendfile/tcp_* 構成を含む、より複雑な Nginx 構成を理解し、タイムアウトやその他の関連する構成とパフォーマンスへの影響を理解します。 Web サーバーに加えて Web サーバーの役割、リバース静的サーバー、およびその他の構成を理解していること、基本的な nginx 設定の調整方法を知っていること、nginx の拡張機能を nginx にコンパイルする方法を知っていること、nginx の基本的な動作原理を理解していること。 、epoll)、優れた Apache パフォーマンスなどのナレッジよりも nginx のパフォーマンスが高い理由を知っています。 3.第 1 段階の基礎として、MySQL の開発をマスターします。通常の SQL 最適化 (グループ化/順序化/ランド最適化など) を含む多くのヒント。MySQL の構築に加えて、MySQL データのホットおよびコールド バックアップも可能です。また、innodb/myisam のパフォーマンスに影響する構成オプション (key_buffer/query_cache/sort_buffer /innodb_buffer_pool_size/innodb_flush_log_at_trx_commit など) も知っており、さらにこれらのオプションを構成するための適切な値も知っています。 mysql のマスター/スレーブ同期環境を構築する方法を知る、さまざまな binlog_format の違いを知る、slow_log/explain などの MySQL パフォーマンス追跡を知るなど、いくつかの特別な設定オプションを理解することもできます。基本的な MySQL アーキテクチャ (サーバー + ストレージ エンジン) を原理的に理解し、基本的な InnoDB/MyISAM インデックス ストレージ構造と相違点 (クラスター化インデックス、B ツリー) を理解する。 基本的な InnoDB トランザクション処理メカニズムを理解する。例外(または解決策がどこにあるかを知っている)。状況が許せば、NoSQL の代表である MongoDB データベースについて学び、MySQL との違いを比較し、適切なアプリケーション シナリオで MongoDB を安全かつ慎重に使用し、PHP と MongoDB の基本的な組み合わせ開発を理解することをお勧めします。 。 4. Redis/Memcached: キャッシュ処理はほとんどの中規模システムに必ず関与するため、基本的なキャッシュを理解する必要があります。 ; Memcached と Redis の類似点、相違点、およびアプリケーション シナリオを理解し、Redis/Memcached を個別にインストールできるようになり、Memcahed のいくつかの基本機能と制限 (最大値など) を理解し、PHP とその使用法を組み合わせる方法を理解します。 Redis の基本的な動作原理と使用法、従来のデータ型を理解する、どの型がどのシナリオで使用されるかを知る、Redis トランザクションを理解するなど。原理部分では、Memcached のメモリ構造 (スラブ機構) を大まかに理解できます。Redis は、一般的なデータ型 (SDS/リンク リスト/SkipList/HashTable) などの基盤となる実装ストレージ構造を理解します。 Redis のトランザクション、RDB、AOF およびその他のメカニズムについて詳しく学ぶことができます。 5. 最初の段階に加えて、インストールと構成の機能に関しては、PHP とさまざまなサードパーティの拡張機能を自由にインストールできます。構成をコンパイルしてインストールします。php-fpm の構成オプションと意味のほとんどを理解します (max_requests/max_children/request_terminate_timeout やその他の構成など)。パフォーマンスに影響を与える)、mod_php/fastcgi の違いを理解していること、PHP のさまざまな基本テクノロジに習熟していること、また、PHP のオブジェクト指向/SPL/構文の特殊機能を深く理解していることなど、あらゆる種類の詳細な PHP を理解していることフレームワークに関しては、少なくとも 1 つの従来の PHP MVC フレームワークのコードを読み、PHP 開発におけるフレームワークの内部実装メカニズムと設計思想を理解しており、従来の PHP MVC フレームワークを上手に使用できる。アプリケーション開発のデザイン パターン (抽象ファクトリ/シングル ケース/オブザーバー/コマンド チェーン/ストラテジー/アダプターおよびその他のパターン)。独自の PHP MVC フレームワークを開発することをお勧めします。開発を完全に自由化するには、MVC モデルを深く理解する必要があります。ビジネス プロジェクト開発で迅速にアップグレードできるようにする; PHP のさまざまなコード最適化方法に精通し、PHP の基本的な実行メカニズムの原理 (Zend エンジン/拡張された基本的な動作メカニズム) を理解する。 > 6. C/C++: 7. フロントエンド: 最初の段階に基づいて、基本的な HTTP プロトコル (プロトコル コード 200/300/400/500、基本的な HTTP インタラクション ヘッダー) に慣れておき、条件が許せば、もう少し洗練された HTML+CSS を作成できます。 +JavaScript を詳しく学ぶこともできます。または、条件が許せばフロントエンド フレームワーク (jQuery/YUI/ExtJS/RequireJS/BootStrap など) を使用することもでき、クロージャ メカニズムや DOM 処理などの JavaScript プログラミングを詳しく学ぶことができます。さらに詳しく知りたい場合は、jQuery のソース コードを読んで詳しく学習してください。 (フロントエンドに興味がない限り、この項目は重要な検討事項ではありません) 8. システム設計: ほとんどの中規模システム向けの Web サイトのアーキテクチャ、データベース、および基本的な PHP フレームワークの選択を設計でき、次のようなタスクを実行できます。 ブラウザ -> CDN (Squid) > Nginx+PHP -> キャッシュ -> 毎日数百万から数千万のトラフィックを伴うデータベース構造のウェブサイトの開発とメンテナンスをサポートします。 第 3 段階 : 上級段階 (上級 PHP プログラマー) 基本的な LNMP プログラムに加えて、 -特定の方向または分野における深い研究。 (深層開発) 基本的な PHP ビジネス開発を完了することに加えて、最も詳細で複雑な技術的問題も解決でき、中規模および大規模な開発を独自に設計して完成させることができます。システム設計と開発作業を担当し、特定の技術的方向性を独自に保持し、深く掘り下げることができ、この分野では比較的専門的です。 (たとえば、MySQL、Nginx、PHP、Redis など、あらゆる方向の詳細な調査) に加えて、 Linux での第 2 段階の機能 通常の操作、パフォーマンスの監視と追跡に加えて、シェル スクリプトに関して多くの高度で複雑なコマンド (watch/tcpdump/starce/ldd/ar など) を使用することもできます。比較的複雑なシェル スクリプト (500 行以上) をすでに作成できます。バックアップ、自動処理、監視などの多くのタスクの完了を支援するシェルは、awk/sed/perl などのアプリケーションに習熟しており、自由に操作できます。 、さまざまな複雑な形式のデータの制御、処理、テキスト統計の分析ができる、Linux の内部メカニズムについての知識がある、カーネル モジュールのロード、起動エラーの処理などのその他の関連事項も理解している。ディスク管理など; 第 2 段階に基づいて、Nginx を非常に上手に操作できるようになり、より多くの機能を実行できるようになりました。 -監視、パフォーマンスの最適化、複雑な問題の処理など、Nginx の詳細な運用および保守作業を参照します。個人的な興味がある場合は、主にソースを読むことから始めて、Nginx の動作原理の詳細な研究に焦点を当てることを検討できます。特定のマスター/ワーカーの動作メカニズム、Nginx の内部イベント処理、メモリ管理などのコードを同時に学ぶことができ、拡張開発のために、独自のプライベート拡張機能の一部を同時にカスタマイズできます。 、Nginx + Lua をある程度理解して、より良いモデルを組み合わせて適用できるかどうかを確認できます。この段階での要件は、Nginx の原理を深く理解することです。詳しく理解することを検討できます。 Nginx 方向のプロフェッショナル。 第 2 段階に基づいて、MySQL アプリケーションに関して、前述の基本的な SQL 最適化に加えて、いくつかの処理も実行できます。インストールや構成に加えて、大規模なデータのインポートとエクスポート、オンラインの大規模なデータのテーブル構造の変更やインデックス フィールドの追加または削除などの複雑な操作や、その他の高リスクの操作を処理できるようになりました。マスターとスレーブの同期遅延問題の解決、コンピューター ルーム間のデータ同期ソリューション、MySQL の高可用性アーキテクチャなど、MySQL の複雑な問題はすべて MySQL アプリケーション レベルに関係しています。トランザクション メカニズム (分離レベル、ロックなど) などの MySQL の主要なテクノロジを使用し、ディスクの最適化 (SSD への SAS の移行)、サーバーの最適化などの MySQL のパフォーマンスに関する一定の理解と応用を備えている。 (メモリ、サーバー構成)、および第 2 段階 (innodb_log_buffer_size/back_log/table_open_cache/thread_cache_size/innodb_lock_wait_timeout など) に加えてその他のコア パフォーマンス最適化オプション、接続プール ソフトウェア選択アプリケーション、などの操作ステートメントを深く理解していること。 show * (ステータスの表示/プロファイルの表示) を実行し、災害復旧と復元、Binlog、ホットおよびコールド バックアップ、マルチ IDC バックアップなどの MySQL バックアップ テクノロジに関する深い知識を完了できます。マスター/スレーブ同期 (レプリケーション) テクノロジなど、MySQL の動作メカニズムのソース コードを読み始めるなど、MySQL の原理をよりよく理解する。ソース コードの学習、またはソース コードの学習と特定のストレージの理解。エンジン (MyISAM/Innodb/TokuDB) など。条件が許せば、CSV エンジンを参照して独自の単純なストレージ エンジンを開発し、データを保存し、MySQL についての理解を深めることができます。このプロセスでは、興味があれば、 DBA の方向での開発も検討できます。 MongoDB レベルでは、たとえば、書き込みを減らし読み取りを増やす場合に MongoDB のオンライン適用を開始することや、オンライン データ分析と処理操作を実行することを検討できます。特定のシナリオは作業に基づいていますが、中心となるのは次のとおりです。 NoSQL とは異なるシナリオのアプリケーションについて、条件や関心が許せば、MongoDB の動作メカニズムについてさらに詳しく学び始めることができます。 第2段階を踏まえて、より深く応用して学ぶことができます。 Memcached は特に複雑ではないため、ソース コード、特にメモリ管理部分を読んで Redis 部分をより深く理解することをお勧めします。より複雑なデータ構造のアプリケーションを実行できます (ランキング操作には zset が使用されます)。フラッシュ セール シナリオ アプリケーションで確実に Atomicity が使用されるようにするための /トランザクション処理)、これには主に、aof などの同期メカニズムのアプリケーションの学習と、高可用性の Redis アプリケーション アーキテクチャとクラスターの設計が含まれます。蓄積された知識は、特にコアイベント管理、メモリ管理、内部コアデータ構造などについて読むと完全に理解できます。興味があれば、Redis の非常にプロフェッショナルなユーザーになることができます。 5. PHP: 基礎的なコアスキルとして、第 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) も学習できます。 -ツリーなど) 便宜上、システムプログラミングの観点から必要とされ、マルチプロセスおよびマルチスレッドプログラミングに精通しており、マルチプロセス間の通信方法のほとんどを理解している。通信方法 (共有メモリ/セマフォ/パイプラインなど) を柔軟に選択できるため、マルチスレッド プログラミングはロック競合の問題をうまく解決でき、同時にマルチスレッド プログラムの開発とデバッグができるため、ネットワーク プログラミングに精通しています。マルチプロセス モデル/マルチスレッド モデル/非同期ネットワーク IO モデルの違いと選択を理解しており、さまざまな非同期ネットワーク IO モデル (select/poll/epoll/iocp など) の原理と違いに精通しており、一般的な非同期フレームワーク (ACE/ICE/libev/libevent/libuv/Boost.ASIO など) とその使用法については、時間があれば、次のサイトでいくつかの国内開発ライブラリ (Muduo など) を参照することもできます。同時に、優れた同時実行性の高いプログラム アーキテクチャ (リーダー フォロー/マスター ワーカーなど) を設計できる。C/C++ バックエンド サーバー開発におけるほとんどの問題 (メモリ管理、ログ出力、高い同時実行性、フロント) を理解できる。 - エンドおよびバックエンドの通信プロトコル、サービスの監視など)、各バックエンド サービス(struct/http/thirft/protobuf など)の RPC 通信の問題を理解し、コンパイルと開発を行うために GCC と GDB をよりよく使用できるようになります。デバッグ プログラム、およびオンライン プログラム コアが削除された後は、一般的なモジュール開発の観点から問題を迅速に追跡して解決することができ、いくつかの一般的なツールやライブラリ (非同期ネットワーク フレームワーク、ログ ライブラリ、メモリ プールなど) を蓄積または開発できます。 、スレッド プールなど)、開発後に適用するかどうかに注意する必要があります。 7. フロントエンド: HTTP プロトコルについての深い理解 (各詳細なプロトコル、特別なプロトコル コードとその背後にある理由、たとえば 302 個の静的ファイルがキャッシュされている、502 は nginx の背後にある PHP がダウンしていることを意味するなど)。フロントエンドのさまざまなフレームワーク アプリケーションの統合機能について説明します。フロントエンドの学習に興味がある場合は、jQuery フレームワークに似たものを開発するか、リッチ テキスト エディターを自分で開発するという形でさらに深く学ぶことができます。その他の比較的簡単な JavaScript スキルのテスト 8. 他の分野の言語学習: 基本的な PHP/C/C++ 言語の基礎を積み上げます。個人的な興味や趣味に応じて、現段階でさまざまなプログラミング言語を学習することをお勧めします。スクリプト言語については、Python/を学ぶことができます。 Ruby やその他の関数型プログラミングについては、Lisp/Haskell/Scala/Erlang を試すことができます。データ統計分析については、R 言語について学ぶことができます。 - ビジネスを別の視点から見ると、前述の Nginx_Lua と Nginx などを組み合わせて試すことができます。さまざまな言語を学ぶことは、主に自分自身のビジョンと問題解決方法の違いを改善することです。たとえば、クロスマシン通信シナリオには、プロセス/スレッドに加えて軽量のコルーチンもあることを理解するでしょう。 , Erlang の解決策は驚くほど簡単です。たとえば、C/C++ を選択したくない場合は、主に視野を広げるために、同様の効率的な Erlang/Golang も利用できます。 9. 他の専門的な方向での学習: この段階では、基本的な LNMP スキルに加えて、他の分野の知識の学習も考慮されます。はい、それは個人的な興味と長期的な目標によって異なります。現在、クラウドコンピューティング(分散ストレージ、分散コンピューティング、仮想マシンなど)、機械学習(データマイニング、パターン認識など、統計への応用、パーソナライズされたレコメンデーション)、自然科学など、選択できる分野は数多くあります。言語処理 (中国語の単語分割など)、検索エンジン技術、グラフィックスと画像、音声認識など。これらの高度な分野に加えて、高性能システム、モバイル開発 (Android/IOS)、コンピュータ セキュリティ、組み込みシステム、ハードウェアなど、エンジニアリングについてさらに学ぶことができる分野も数多くあります。 10. システム設計: 第 2 段階に基づいて、システム設計は比較的複雑な中規模および大規模システムの設計で習得した経験とスキルを適用できます。さまざまな複雑なオンライン システムの問題のほとんどと、ブラウザ -> CDN -> アクセス レイヤー -> データベース -> など。インタラクション (ストレージ バックエンド、ロジック バックエンド、不正行為防止バックエンド、外部サービス) -> その他のバックエンド Jiangzi の複雑なビジネス。毎日数千万から数億のトラフィックがある Web サイトの通常の運用をサポートできます。開発および保守作業。 追伸:今回は割愛しますので、次回この部分の内容を説明・補足する特集記事を書きます。 追記: レベルが高いため説明しません ^_^第4段階:建築段階(アーキテクト)
第 5 段階: エキスパート段階 (その分野の専門家)
段階 6: 科学者ステージ