ホームページ  >  記事  >  バックエンド開発  >  PHPの動作原理がよくわかりません。解決策を教えてください。

PHPの動作原理がよくわかりません。解決策を教えてください。

WBOY
WBOYオリジナル
2016-08-04 09:20:121074ブラウズ

Javaやnodejsと同様、サーバー上で継続的に実行されるプログラムである必要があり、このプログラムは常に実行され、CPUとメモリを占有し、ネットワークリクエストを受信すると処理します。

PHP はプログラムではなく、HTML に似ています。PHP サービスにアクセスしないときのみ実行され、少しのメモリも占有しません。 CPU それは本当ですか?


そうであれば、PHP でデータベース クラスをカプセル化するのは難しくないでしょうか?これは、各ユーザーが入ってきて自分に代わってプロセスを開く必要があり、そのプロセスが相互に接続されていないためです。ユーザー A が入ってきてその人のデータベース接続を開き、ユーザー B が入ってきてその人の代わりに別のデータベース接続を開きます。では、PHP はデータベースに接続したり切断したりを繰り返しているのではありませんか?ユーザーが増えると、オーバーヘッドが非常に高くなるはずです。


これがphpにjsのようなsetInterval 或者 setTimeout関数がない理由でもあるのでしょうか?

返信内容:

Javaやnodejsと同様、サーバー上で継続的に実行されるプログラムである必要があり、このプログラムは常に実行され、CPUとメモリを占有し、ネットワークリクエストを受信すると処理します。

PHP はプログラムではなく、HTML に似ています。PHP サービスにアクセスしないときのみ実行され、少しのメモリも占有しません。 CPU それは本当ですか?


そうであれば、PHP でデータベース クラスをカプセル化するのは難しくないでしょうか?これは、各ユーザーが入ってきて自分に代わってプロセスを開く必要があり、そのプロセスが相互に接続されていないためです。ユーザー A が入ってきてその人のデータベース接続を開き、ユーザー B が入ってきてその人の代わりに別のデータベース接続を開きます。では、PHP はデータベースに接続したり切断したりを繰り返しているのではありませんか?ユーザーが増えると、オーバーヘッドが非常に高くなるはずです。


これがphpにjsのようなsetInterval 或者 setTimeout関数がない理由でもあるのでしょうか?

PHP-FPM を例として (Apache MOD_PHP と同様)、PHP の動作メカニズムについて説明します
まず第一に、PHP-FPM は C で実装されたマルチプロセス FastCGI サービスです。
各 PHP-FPM ワーカー プロセスは、組み込みの PHP インタープリターは PHP-CGI に依存せず、構成などの常駐バックグラウンドをサポートします。 リーリー

PHP-FPM メイン プロセスは、これらの作業プロセスを管理するために使用されます。たとえば、作業プロセスが強制終了された場合、PHP-FPM はブラウザを通じて PHP-FPM サービス全体の作業を表示するための pm.status_path を提供します。ステータス。

実行タイムアウトと放棄、指定された数のリクエストを処理した後のワーカープロセスの自動再起動、スローロギング(時間のかかるファイルや関数の発見)など、すべてがサポートされています。

そして、永続的な接続を有効にした後、各 PHP-FPM 作業プロセスは、解放せずに MySQL への長い接続を維持することができ、データベースへの繰り返しの接続を回避できます。

たとえば、以下の図は、2 つの PHP-FPM プロセスと 2 つの MySQL の長い接続を示しています。 connection:



さらに、Memcached および Redis の PECL 拡張機能も永続的な接続の機能を実装します。PHPの動作原理がよくわかりません。解決策を教えてください。
PHP-FPM システムについては上で説明しましたが、ここで PHP-FPM システムにおける PHP スクリプトのライフ サイクルについて説明します。

PHP スクリプト内の数量 (グローバル変数を含む) のライフ サイクルは 1 つのリクエスト内にのみ存在します。リクエストは処理されます。完了すると、PHP-FPM はリソースを自動的に解放します。

リソースはリクエストごとに 1 回解放されます。この種のメモリ解放は、プログラムが有効になる前に終了します。ここでのリソースの解放とは、スクリプト内で制御されるリソースであり、PHP-FPM の常駐プロセスに干渉せず、PHP-FPM プロセスをシャットダウンさせず、PHP-FPM に永続的な接続を閉じさせません。 PHP-FPM は、PHP スクリプトを入力して PHP 操作を実行することのみを担当します。ZendOpcache サポートが追加されている場合、PHP スクリプトの解析によって生成されたすべてのオペコードは、次回の直接解釈と実行のためにメモリにキャッシュされます。 opcache.file_cache を使用してスクリプトのオペコードをエクスポートし、ソース コードの保護を実現します

PHP に関する常識:
データベース接続プール: PHP 永続接続は、プログラム介入を必要としない自然で透過的な接続プールであり、MySQL/Memcached/Redis などをサポートします。

メモリ常駐: PHP-FPM プロセス、ZendOpcache キャッシュされたスクリプトBrother Niao によって開発された opcode 、Yac はすべてメモリ常駐です。

ガベージ コレクション: リクエストごとに 1 回リソースを解放する PHP-FPM の動作モードは、参照カウントに基づく GC の役割を弱めます。
最後に、CLI で動作する Swoole/WorkerMan などの PHP デーモン サービスは Java/Node に似ています。

私はすでに仕事を終えていますが、あなたの言及を見ましたPHP是类似html我忍不了。PHP功能是html无法比拟的好不好,就拿你说的连接数据库的例子来说,html能连接数据吗?能读取数据库内容吗?不能吧!还有你说多个用户来访问每个用户都要开一个数据库连接,你这样太小看PHP了。封装一个数据库连接类很简单很简单,这些我就不贴code了。PHP手册每种数据库扩展都有介绍也有事例,你可以自己做参考。你既然提到java那肯定也知道单例模式吧!PHP封装好一个数据库连接类设置单例模式就可以实现数据连接静态化。不管多少用户来访问直接调用一下就可以不是你说的多个用户来访问就开多个进程。还有你提到的setIntervalsetTimeout不就是定时执行吗!PHP也可以的啊!首先定义好PHP要实现的功能,然后通过在服务器上设置crontab就可以了,参数自己设置就行,或者还有php-fpm。機能などは記載しませんし、回答もまだ整形していないので、まずは見ていただければと思います。仕事を終えて出発しなければなりません。質問がある場合は、明日も引き続き話し合いましょう。

要するに、

は非常に強力な機能を備えた非常に優れた言語です...そして今も開発と成長が続いています...学習と理解が簡単です!兄弟PHP

PHP はメモリに常駐できません。各 HTTP リクエストが開かれた後、リクエストが終了するとデータベース接続とさまざまな変数が解放されます。

全体的な理解は正しいですが、すべての言語が Java や Python、go、C のようにメモリ常駐するわけではありません。 PHP には接続プールの概念がありません。プロセスは実行後に解放され、他のプロセスが使用できるように残されることはありません。

これは、「PHP コアの詳細な理解」の第 2 章の最初のセクションへのリンクです:

http://www.php-internals.com/...

あなたの疑問は、あなたが表面しか見ていないからです。

swooleを使ったことがある方ならこんな質問はしないと思います。

ああ、php-fpm が到着しないと思ったでしょう。 。 。

そして、PHP はプログラムではないようで、HTML に似ています

PHP は HTML にのみ埋め込むことができますが、PHP にはさまざまな機能を提供する拡張機能があり、HTML とはまったく異なります。

PHP サービスにアクセスしないときのみ実行されます。PHP は少しのメモリや CPU も占有しません。

PHP には主に 2 つの実行モードがあります (CLI を除く):
1. Apache によって表される Mod_php、この時点で作業は Apache に引き渡されます。

2.php-fpm (fastcgi プロセス マネージャー) Nginx/Lighttpd によって使用され、これは常駐デーモン プロセスです。
それでは、どうすればCPUとメモリを占有しないで済むのでしょうか?

そうなると、PHP でデータベースクラスをカプセル化するのは難しくないでしょうか?これは、各ユーザーが入ってきて自分に代わってプロセスを開く必要があり、それらのプロセスが相互に接続されていないためです。ユーザー A が入ってきてその人のデータベース接続を開き、ユーザー B が入ってきてその人の代わりに別のデータベース接続を開きます。では、PHP はデータベースに接続したり切断したりを繰り返しているのではありませんか?ユーザーが増えると、オーバーヘッドが非常に高くなるはずです。

MySQL を例に挙げます。接続時に pconnect (永続的な接続) を選択すると、次回からは既存の接続が直接使用され、接続は閉じられません。
PDO には長時間接続オプションもあります。


これがphpにjsのような
関数がない理由でもあるのでしょうか?

setInterval或者setTimeout

PHPには遅延関数(
など)があり、その精度はJSよりもはるかに高い(マイクロ秒レベル)。

sleep()

とても賑やかですね。 @ivanilla の回答とコメントには多くの情報が含まれています。ありがとうございます。

実際、元の投稿者の質問に答えると、PHP の動作メカニズムはスクリプトを解釈して実行することだと思います。 PHP は、小規模および中規模の Web サイトにサーバー側のサポートを提供するスクリプト言語です。これが、開発速度と運用効率のバランスが取れていることが成功の理由です。

つまり、投稿者の他の意見にはほとんど価値がなく、もし PHP があなたが想像しているようなものを持っているなら、誰もこの言語を使用しないでしょうし、誰もが Java を使用するのと同じかもしれません。

著者は PHP の基本的な知識がありません。PHP を初めて使用する必要があります。簡単に言うと、PHP は 2 つのモードで実行できます。1 つはシェルで php xxx.php を実行するようなスクリプト モードで、もう 1 つはネットワーク リクエストがあった場合にのみ実行を開始するモードです (あまり適切ではありません)。一部は Apache 拡張モードにコンパイルされますが、高速 CGI モードもあります。 Apache の mod_php メソッドは、リクエストによって実行するプロセスを開始します。これは非常に効率的であり、それに応じてさまざまなパラメーターが最適化されます。 Fast-cgi は、特定の投稿者が対応するマニュアルを読んで実践することができるため、より効率的です。

上の階の人たちはとても忍耐強いです

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。