ホームページ >バックエンド開発 >PHPチュートリアル >PHP + Apache スタックと Node.js_PHP のチュートリアル
これはリンゴとオレンジの比較です。 PHP は古い言語で、Apache Web サーバーの背後でリクエスト/レスポンス方式で実行されます。 Node.js は、V8 エンジン内で JavaScript を実行するノンブロッキング イベント ループ フレームワークで、オプションの Web サーバーが組み込まれています。では、これは本当にリンゴとオレンジの比較なのでしょうか?どちらのテクノロジーも、Web ページをブラウザーに提供するために一般的に使用されます。
私のブログを何年も見ている方なら、私が PHP の大ファンであることをご存じでしょう。私は数年前に PHP5 ZCE (Zend Certified Engineer) 認定資格を取得しました。私はさまざまなコンテンツ管理システムを使用して数百のコンテンツベースの Web サイトを構築し、さまざまな PHP フレームワークを使用して十数個のアプリを構築しました。 2011 年の ZendCon はとても楽しかったし、約 9 か月間 PHP ミートアップで教えたこともあります。
最近私のブログを読んでいる方は、Node.js (ブラウザレス JavaScript) と呼ばれるこの新しいものについて私が黙っていないことにもお気づきでしょう。確かに、私はこの新参者のために長年の PHP 経験を捨てたわけではありませんよね?
正直に言うと、私は最近両方の言語を使用しています。職場では、私たちの Web サイトは PHP を使用して構築されています (ただし、Node.js を使用する理由は日々増えています)。副業プロジェクトとして、Node.js を使用してマルチプレイヤー Web ゲームとハードウェア インターフェイス ソフトウェアを作成しています。
どちらの環境にも長所と短所があり、どちらの言語もすべてのプロジェクトにとって完璧なソリューションではありません。この投稿では、2 つの環境を比較対照し、それぞれの長所と短所をカバーし、さまざまな状況にどちらが適しているかを概説します。
PHP+Apache と Node.js のみを取り上げるのはなぜですか?正直に言うと、これらは私が最もよく知っている言語であり、それぞれの実稼働コードが実行されています。 Ruby と Python は、同じ分野で同等の長所と短所を備えた優れた言語ですが、私にはそれらを学ぶ機会がありませんでした。 JavaScript (Node.js) と PHP はどちらも C の影響を受けた構文を持っています
PHPの強み
PHP は、サーバーサイドで最も広く使用されている Web プログラミング言語です。これは古いものですが、安価な共有ホスティング プロバイダーが不足することはありません。最大規模で一般的に使用されているプラットフォーム/アプリの一部は PHP を使用しています。自己ホスト型ブログ プラットフォームの中で最も人気のある WordPress は PHP です。 MediaWiki、Joomla は、PHP を使用する一般的な自己ホスト型アプリです。
Facebook、Wikipedia など、最大の Web サイトの一部では PHP を使用しています。 PHP は、従来の (読み慣れた) オブジェクト指向手法を使用します。 PHP Web フレームワークと言語ドキュメントがたくさんあります。
PHP は、コンテンツ Web サイトを提供するのに最適です。 PHP は Web サーバーの背後にあり、要求されたファイルがファイルシステムに存在するかどうかを確認できます。その場合、PHP コードを実行する必要がなく、ファイルをクライアントに提供できます。これは必ずしも言語自体の長所ではありませんが、ほとんどの状況において有益な副作用です。
PHP は Zend 社による企業支援も受けています (同社のキャッチフレーズは「The PHP Company」です)。この支援は大企業によって必要とされており、その企業はすべて「お金がかからないものは望まない」という同じ哲学を共有しています。
PHPの弱点
PHP は長時間実行することを目的としていません。ここで多くの人が私に反論するでしょうが、この言語はデフォルトで、30 秒間実行されるか、一定のメモリ使用量に達すると、自動的に終了するように設定されています。これを無効にすることで、長期間正常に実行できるようにアプリを構築することもできますが、これは PHP が輝くところではありません。
この言語はコードを並列実行できません。 Gearman などのツールを使用すると、一部の作業を他のプロセスで処理するように渡すことができ、進行状況を監視することもできますが、このプロセスはかなり扱いにくく、PHP が意図しているものではありません。 Gearman 自体は他にもいくつかの優れた機能を提供しており、Node.js を含むさまざまな環境で使用できます
URL とファイルシステムが 1 対 1 でマッピングされていた当時、Web サーバーを実行している言語から分離することは完全に理にかなっていました。しかし、現在では、Apache Web サーバーの背後で実行される魅力的な URL を持つ PHP アプリには、ファイルを提供する前にチェックする正規表現をサーバーに指示する .htaccess ファイルが必要になります。不必要なオーバーヘッドがあり、複雑で扱いにくいように思えませんか?それはそうだからです
全体として、PHP をサポートするために必要なスタックは、Node.js のような単純なものと比較すると、過度に複雑です。 Apache が必要です。Apache には、いくつかのグローバル設定とサイト固有の設定があります。また、グローバルな php.ini 設定を持つ PHP も必要です。その一部は実行時にオーバーライドできます (すべてではありません)。また、y2k サポート (最終的に 5.4 で削除されました) など、削除すべき古いものがたくさん残っています。
公式ウェブサイトは非常に醜く、時代遅れです。ドキュメントは問題ありません。ユーザーが投稿したメモは非常に便利ですが、ドキュメントを更新する方法には SVN と XML ファイルのハッキングが含まれており、ほとんどの人にとってドキュメントの作成を奨励するものではありません。
パッケージ管理は事実上存在しません。確かに PEAR はありますが、そのツールを使用するのは途方もなく面倒です。他にもいくつかのパッケージマネージャーが登場しています。 Pyrus (PEAR2) と Packagist がありますが、使用方法が非常に分散しているため、事実上の標準はありません。正直に言うと、おそらく決してないでしょう。 PHPClasses.org もありますが、このサイトは使いにくく、閲覧するにはサインインしたユーザーが必要です。
PHP プロセスは開始され、定型的な作業を実行し、ユーザーが実際に必要とするタスクを実行してから終了するため、データはメモリ内に永続化されません。 Memcache や従来のデータベースなどのサードパーティ ツールを使用してこのデータを永続的に保つことはできますが、その場合、それらの外部プロセスとの通信のオーバーヘッドが発生します。
Node.jsの強み
Node.js の最大の強みである IMO は、イベント駆動型であることです。ノード アプリは長期間にわたって良好に動作します。イベント エミッター コードは、本質的には非常にシンプルですが、必要なときにコードの実行をトリガーするための強力で一貫したインターフェイスを提供します。
Node には Web サーバーが組み込まれています。これを悪いことだと言う人もいますが、私はそのような人たちをクレイジーだと呼びます。サーバーが組み込まれているということは、面倒な .htaccess 設定が必要ないことを意味します。すべてのリクエストは、ファイルシステムを調べてどのスクリプトを実行するかを判断する必要がなく、同じプロセスを通過するものと理解されます。
Web アプリの最大のボトルネックは、CPU を消費する操作の計算にかかる時間ではなく、ネットワーク I/O です。データベース呼び出しを行って電子メールを送信した後にクライアントのリクエストに応答する必要がある場合は、2 つのアクションを実行して応答することができます
両方が完了したら。
もちろん、Node.js は JavaScript で記述されているため、フロントエンド開発用の JS をすでに知っている場合は、Node.js の分野でかなりうまくやっていると言えます。構文と言語の注意事項はすでに理解しているので、残っているのはシステムと対話するための API だけです。
パッケージ管理システム npm は素晴らしいです (ただし、Web サイトにはまだ改善の余地がたくさんあります)。厳格なガイドラインやフォーマット要件 (PHP の PEAR など) に従う必要はなく、誰でも (私も含めて) npm に何でも入れることができます。 Android マーケットと似ています。もちろん、ひどいものを入手することもできますが、常識的に考えればウイルスをダウンロードすることはありません
とても新しいので、古い時代の荷物はあまり残っていません。サーバーが組み込まれているため、スタックははるかにシンプルになり、障害点が減り、HTTP 応答で実行できることをより詳細に制御できます (PHP を使用して Web サーバーの名前を上書きしてみたことがありますか?)。
データはメモリ内に非常に簡単に永続化できるため、異なるクライアント間でデータを共有している場合 (マルチプレイヤー ゲームなど)、このデータ共有が組み込まれています。
Node.jsの弱点
Node.js は非常に新しく、API が不安定で、テストされていないプラットフォームです。存続期間が長い大規模な企業規模のアプリを構築する場合、Node.js は適切なソリューションではありません。 Node API はほぼ毎日変更されており、大規模または長期的なアプリは頻繁に書き直す必要があります。
画像などの静的ファイルを大量に提供する場合は、Node.js を使用したくありません。そうしないと、ファイル システムが存在するかどうかを確認する状況に戻ってしまいます。この問題は、すべての静的コンテンツをサブドメインまたはコンテンツ配信ネットワークに移動することで修正できます。
JavaScript は 10 日間かけて作成されたため、完璧とは程遠い言語です。従来のクラスベースの開発者にとって、関数型プログラミング言語に慣れるのは苦痛かもしれません。非同期プログラミングに慣れるのも難しい場合があります。
永続メモリの問題は少し難しい場合があります。自分が何をしているのかを理解していないと、誤ってクライアント間でデータを共有してしまう可能性があります (大惨事になる可能性があります)。また、メモリリークの危険も大きくなります。 PHP で配列にデータを追加し続ける場合、スクリプトの有効期間は実際には 0.1 秒だけですが、Node.js スクリプトは永久に実行する必要があり、一定期間が経過すると簡単に爆発してしまう可能性があります。
非同期実行によりマルチスレッドのように見えますが、ノードはシングルスレッドです。これはあまり重要ではありませんが、アプリの最大のボトルネックがネットワーク I/O で待機するのではなく CPU になったのはいつですか?したがって、マルチスレッドであることは素晴らしいことですが、通常はアプリに害を及ぼすことはありません。
どれを学べばいいでしょうか?
これは素晴らしい質問です。サーバー側ソフトウェアの開発経験がない場合は、おそらく PHP から始める必要があります。これはリクエストを実行するための優れた簡単な言語です。ステートレス インターネットを優れたものにする応答パターン。あなたと同じ問題を抱えている人々からのフォーラムへの投稿がきっと見つかります (たとえ投稿が 10 年前のものであっても)。
他の種類のソフトウェアを構築したい場合は、Node.js を使用する方が安全かもしれません。たとえば、私は、ワイヤレス ネットワークが範囲内に入った場合など、ハードウェアに加えられた変更によってトリガーされるコードを必要とするソフトウェアを作成しています。 PHP を使用してこの種のソフトウェアを作成するのはハック的で面倒ですが、Node.js を使用すると簡単です。
将来の保証に関する限り、私はどちらの言語も時の試練に耐えられるとは確信していません。 Web アプリの将来はおそらく、WebSocket を使用して少量のデータがネットワーク経由で送信され、フロントエンドが HTML の生成を担当するシングル ページ アプリケーションになるでしょう。 PHP は、Node.js のように WebSocket をうまく実行できません。ただし、Node.js が非同期のイベント駆動型言語戦争に勝つかどうかを判断するのは時期尚早です。 JavaScript には大きな欠陥があるため、より優れた言語があれば簡単にダメになってしまう可能性があります。
状況例
ここでは、さまざまなプログラミング状況と、おそらく使用すべき言語の簡単な例をいくつか示します。
何らかのデーモンを構築しているのでしょうか?ノードを使用します。
コンテンツ Web サイトを作成していますか? PHP を使用します。
訪問者間でデータを共有したいですか?ノードを使用します。
あなたは簡単なウェブサイトを作成したい初心者ですか? PHP を使用します。
大量のコードを並行して実行するつもりですか?ノードを使用します。
共有ホスト上で実行するクライアント用のソフトウェアを作成していますか? PHP を使用します。
WebSocket を使用してサーバーからクライアントにイベントをプッシュしますか?ノードを使用します。
あなたのチームはすでに PHP を知っていますか? PHP を使用します。
あなたのチームはフロントエンド JavaScript をすでに知っていますか? Node の方が学びやすいでしょう
コマンドラインスクリプトを構築していますか?どちらも機能します。
簡単な方程式
これは面白い見方です… PHP + Apache を使用して Node.js の機能をエミュレートするには、他のいくつかのサービスを実行する必要があります。 Node を PHP と同じように動作させるには、単に大量の同期コードを実行するだけです。
Node.js ≈PHP + Apache + Memcached + Gearman - 複雑さ
関連投稿
Node.js が素晴らしい理由: Web アプリケーションの短い歴史