ホームページ >バックエンド開発 >PHPチュートリアル >技術スタックとしての PHP と Go。
私は「Javascript for everything」というトレンドが大嫌いです。そうです。現時点では Javascript はほとんど何でもできます。しかし、それを行うのに効果がありますか?
非常に集中的な CPU バウンド タスクの例を見てみましょう。これは、CPU 負荷の高いタスクをシミュレートするコード サンプルです。そして、JavaScript がどのように動作するかを見てみましょう。
setTimeout(function() { console.log("Hello world") }, 1000) const startTime = Date.now(); while (Date.now() - startTime < 3000) {} //Simulating a long CPU intensive main thread task.. console.log("End")
それで、ここには何があるでしょうか? JAVASCRIPT のユーザーである私は、1 秒後に "hello world" が出力されることを期待します。そして、どうなるでしょうか。そうではありません。 3 秒後に「hello world」を吐き出します。
なぜこのようなことが起こるのでしょうか?これを理解するには、ブラウザとノード js のイベント ループがどのように機能するかを理解する必要があります。簡単に言えば、イベント ループはコール スタックとコールバック キューを同時にチェックします。 setTimeout() で渡すコールバック関数は、タイマーが 1000 ミリ秒で終了するとコールバック キューに入ります。
しかし、どうだろう...タイマーの処理が完了してもコールスタックは空ではない.. 我々が書いた 3 秒間の CPU 集中型タスクの実行でまだビジー状態である(ええ.. これはシミュレーションです.. ではありません)意図したことを実行するのに 3 秒かかる現実世界の愚かなプログラム)。
つまり、コールバック キューとマイクロタスク キュー内のコールバック関数が枯渇してしまいます。コールバック関数が貧弱です。コールスタックにアクセスできるのは 3 秒後だけです。1000 ミリ秒を指定したにもかかわらず、3 秒後に "hello world" が出力されるのはこれが理由です。
はい。これはウェブからダウンロードしたイベント ループのランダムな画像です。クールな画像です。
同じ excat を行う Go コードを見てみましょう。
package main import ( "fmt" "time" ) func main() { time.AfterFunc(1*time.Second, func() { fmt.Println("Hello world") }) // Simulating a long CPU-intensive main thread task startTime := time.Now() for time.Since(startTime) < 3*time.Second { } print("End") }
ここでは、「hello world」が 1 秒後に出力されます。どのようにして? AfterFunc() は、メインの GoRoutine に干渉する必要のない独自の GoRoutine で実行されているためです。
reactJS について話しましょう。 JavaScript コンポーネントをクライアントにプッシュし、あまりにも多くの機能をクライアントの喉に押し込むため、クライアントはスロットルを開始します。
ローエンド PC が静的 HTML ファイルをリクエストすると、大量の React コンポーネントが大量にロードされることを想像してください。クライアントはどう感じるでしょうか?遅くなります.. ブラウザは JavaScript を解析し、仮想 DOM を実行し、そこから HTML を生成する必要があります.. そしてその他にも..
ブラウザは、サーバーが実行する必要があるすべての作業を実行しています。
ウェブの自然な流れを覚えていますか?
最初に HTML をロードし、次に JavaScript をロードしますか?なぜ?初期ペイントをできるだけ速くするため。HTML ドキュメントのフッターに JavaScript をロードした時代を覚えていますか?
React は全体のフローを逆さまにしました。
その結果、クライアントは空白の白い画面をかなりの時間見つめなければなりません..
私が直接印象に残ったのは、Go はコンパイル言語であり、静的に型付けされているということでした。盲目的に言うと、Go は超高速で、JavaScript よりもはるかに高速です。
「GoRoutines」と呼ばれる軽量スレッドが組み込まれており、Go スレッドは軽量であるため、実際の OS スレッドよりもはるかに高速です。
Go は、RESTful エンドポイントの構築に使用することも、任意のバックエンド サービスに使用することもできます。
でも、SSR には Go を使用できません。PHP はその点で優れています。私のスタックでは、Go は CPU を大量に使用する API やバックエンド サービスに頻繁に使用されます。
PHP は私がこれまで SSR に使用した中で最高のものです。シンプルでとても簡単です。クライアントごとにプロセスを作成します。少し遅くなります。しかし、それでもこれらのプロセスは、同じプロセス メモリ空間を共有するスレッドとは異なり、互いに独立しており、競合状態やその他の多くのスレッド関連の問題に悪影響を及ぼします。
私の意見では、PHP は Web とも密接に結びついています。$_GET、$_SERVER などのすぐに使用できるスーパーグローバル変数により、一般的に Web での作業が容易になります。
PHP のセッション管理は非常に優れています。言語自体が付属しています。セッションの管理も簡単です。
PHP は純粋に SSR に使用できます。そしてセッション管理。 PHP は CPU を大量に使用するタスクを実行するのが面倒なので、信頼できません。なぜ?これはインタプリタ言語であり、マルチスレッドでもありません。
そこで、CPU を集中的に使用するすべての呼び出しを Go にオフロードします。
2 つの利点の 1 つです。SSR には PHP を使用します。これにより、クライアントに負担がかかりません。また、同時実行が非常に優れているため、CPU を集中的に使用するタスクに適しています...
以上が技術スタックとしての PHP と Go。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。