検索
ホームページバックエンド開発PHPチュートリアルPHP の動作モデルと動作メカニズム_PHP チュートリアル

PHP の作業モデルは非常に特殊です。 PHP と、ASP、ASP.NET、JSP/サーブレットなどの一般的な Web テクノロジとの間には、ある程度、本質的な違いがあります。

Web アプリケーションの分野では、Java には Java Servlet と JSP (Java Server Page) という 2 つのテクノロジがあります。 Java サーブレットは、Web サーバーから送信されたリクエストを処理し、関連するインターフェイスを実装することによって対応する作業を完了する特別なタイプの Java プログラムです。 JSP は形式的には PHP に似たスクリプトですが、実際には最終的にはサーブレットにコンパイルされます。つまり、Java ソリューションでは、JSP とサーブレットは独立した Java アプリケーションとして実行され、初期化後にメモリ内に常駐し、特定のインターフェイスを介して Web サーバーと通信して、対応する作業を完了します。明示的に再起動しない限り終了しません。したがって、データベース接続プーリングなどのさまざまなキャッシュ手法を JSP やサーブレットで使用できます。

ASP.NETの仕組みもこれと似ています。 ASP に関しては、これもインタープリタ言語ですが、アプリケーション レベルのグローバル変数を格納するための Application オブジェクトを提供します。これは、ASP インタープリタが IIS に常駐するプロセスに依存しており、アプリケーションの存続期間全体にわたって有効です。

PHP は、サーバー側で実行でき、HTML を埋め込むことができる純粋に解釈されたスクリプト言語であり、Web アプリケーションの開発に特に適しています。 PHP スクリプトが要求されると、PHP はスクリプトを読み取り、実行されるコードのバイナリ表現である Zend オペコードにコンパイルします。このオペコードは PHP によって実行され、破棄されます。 PHP スクリプトは解釈されるたびに初期化され、解釈が完了すると終了します。この操作は互いに独立しています。各リクエストは、対応するページ ファイルを解釈するための個別のプロセスまたはスレッドを作成します。ページによって作成された変数およびその他のオブジェクトは、現在のページ内でのみ表示され、ページをまたがってアクセスすることはできません。実行が終了すると、ページ内で申請され、コードによって明示的に解放されなかった外部リソース (メモリ、データベース接続、ファイル ハンドル、ソケット接続など) が強制的に解放されます。つまり、PHP は言語レベルでページ全体の変数に直接アクセスしたり、メモリ常駐オブジェクトを作成したりすることはできません。

リーリー

この例では、StaticVarTester という名前のクラスが定義されています。このクラスには、0 に初期化されたパブリック静的メンバー $StaticVar が 1 つだけあります。次に、TestStaticVar() 関数で、StaticVarTester::$StaticVar に対して累積演算を実行し、出力します。

Java または C++ に詳しい開発者は、この例に精通しているはずです。 StaticVarTester クラスの静的メンバーである $StaticVar は、クラスがロードされたときにのみ初期化されます。StaticVarTester クラスが何度インスタンス化されても、$StaticVar のインスタンスは 1 つだけであり、複数回初期化されることはありません。したがって、TestStaticVar() 関数が初めて呼び出されるとき、$StaticVar が累積され、値は 1 になり、保存されます。 TestStaticVar() 関数が 2 回目に呼び出されるとき、$StaticVar の値は 2 です。

印刷結果は期待どおりです:

リーリー

ただし、ブラウザがページを更新してこのコードを再度実行すると、別の状況が発生します。 Java または C++ では、$StaticVar の値が保存され、次の結果が表示されます。 リーリー

しかし、PHPでは上記の仕組みにより、現在のページを解釈するたびにプログラムの初期化と終了の処理が行われます。つまり、StaticVarTester はアクセスされるたびに再ロードされ、次の行の public static $StaticVar = 0; も繰り返し実行されます。ページの実行が完了すると、すべてのメモリ領域が再利用され、$StaticVar 変数は (StaticVarTester クラス全体とともに) 存在しなくなります。したがって、ページが何回更新されても、$StaticVar 変数は開始点に戻ります。最初は 0 に初期化され、次に TestStaticVar() 関数呼び出しで累積されます。したがって、表示される結果は常に次のようになります:

リーリー

PHP のこのユニークな作業モデルの利点は、基本的に厄介なリソース リークの問題を解決できることです。 Web アプリケーションは短期間に大量の同時処理が行われるという特徴があり、さまざまなリソースの適用と解放が非常に頻繁に行われるため、リークやクラッシュが発生しやすくなります。 PHP の動作メカニズムは、従来のクラッシュの問題がないと判断されており (せいぜい接続タイムアウト スクリプトが実行を停止する程度)、PHP は比較的安定した Web アプリケーションであると言えます。ただし、このメカニズムの欠点も非常に明らかです。最も直接的な結果は、PHP が言語レベルでクロスページ バッファリング メカニズムを実装できないことです。このバッファリングメカニズムの欠如によって引き起こされる影響は、次の 2 つの側面に分けられます。

1 つはオブジェクトのバッファリングです。ご存知のとおり、多くのデザイン パターンはオブジェクトのバッファリング メカニズムに依存しています。オブジェクトの作成にはメモリ リソースやその他のリソースを取得する必要があるため、これは特に時間がかかります。大量の同時実行に頻繁に対処するため。したがって、オブジェクトのバッファリングがないと、理論的には速度が大幅に低下します。サービス プログラムの効率を向上させるには、オブジェクトの作成と破棄の回数をできる限り減らす必要があります。PHP は現在マルチスレッドをサポートしていないため、Java のようにスレッド プールのスケジューリングによってこの欠点を補うことはできません。 ; ただし、Memcachd などのサードパーティ ソフトウェアを使用して、PHP のオブジェクト バッファリング メカニズムを実装し、オブジェクトの作成と破棄の時間を短縮し、サービス プログラムの効率を向上させることができます。 Memcachd は、PHP でコンパイルされたオペコードをキャッシュし、このオペコードをメモリに保存して、次回ページが呼び出されるときに再利用するため、時間を大幅に節約できます。より一般的に使用されるキャッシュは eAccelerator です。eAccelerator のもう 1 つの一般的な代替キャッシュは Alternative PHP Cache (APC) です。

2 つ目は、データベース接続のバッファリングです。 MySQL の場合、PHP は組み込みのデータベース バッファリング メカニズムを提供します。これは、mysql_connect() の代わりに mysql_pconnect() を使用してデータベースを開きます。 PHP は、放棄されたデータベース接続を自動的にリサイクルして再利用します。実際のアプリケーションでは、この種の永続的なデータベース接続はデータベース接続の疑似リークを引き起こすことがよくあります。つまり、ある時点で同時データベース接続が多すぎて、MySQL 接続の最大数を超え、新しいプロセスが接続できなくなります。データベース。しかし、しばらくして同時実行数が減少すると、PHP はいくつかの接続を解放し、Web サイトは通常の状態に戻ります。この現象の原因は、pconnect を使用する場合、Apache の httpd プロセスの数が mysql 接続の最大数を超えると、接続が失敗するためです。したがって、Apache の httpd プロセス数が MySQL の最大接続数を超えないように、Apache と Mysql の構成を慎重に調整する必要があります。実践後、作者は PHP5 と Oracle10g 間の接続において、データベース接続が頻繁に行われるため、データベース接続が失われる場合があることに気付きました (Oracle は公式に PHP 用の拡張パッケージを用意していますが、それがこの問題を解決できるかどうかはわかりません) 、試したことはありません)。

PHP の作業モデルには、本質的に、欠点と利点の両方があります。これが PHP のユニークな点です。

FastCGI モードで php を実行する場合、php.ini の解析、すべての拡張機能のロード、およびすべてのデータ構造の再初期化は、プロセスの開始時に 1 回だけ行われます。さらに、永続的なデータベース接続が機能するという利点もあります。 Nginx+PHP (FastCGI) は良い選択です。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/752422.html技術記事 PHP の作業モデルは非常に特殊です。 PHP と、ASP、ASP.NET、JSP/サーブレットなどの一般的な Web テクノロジとの間には、ある程度、本質的な違いがあります。 Java を例に挙げると、Web アプリケーションの分野では、Java...
声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
php怎么把负数转为正整数php怎么把负数转为正整数Apr 19, 2022 pm 08:59 PM

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

php怎么实现几秒后执行一个函数php怎么实现几秒后执行一个函数Apr 24, 2022 pm 01:12 PM

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php字符串有没有下标php字符串有没有下标Apr 24, 2022 am 11:49 AM

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php怎么除以100保留两位小数php怎么除以100保留两位小数Apr 22, 2022 pm 06:23 PM

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

php怎么读取字符串后几个字符php怎么读取字符串后几个字符Apr 22, 2022 pm 08:31 PM

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

php怎么根据年月日判断是一年的第几天php怎么根据年月日判断是一年的第几天Apr 22, 2022 pm 05:02 PM

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

php怎么查找字符串是第几位php怎么查找字符串是第几位Apr 22, 2022 pm 06:48 PM

查找方法:1、用strpos(),语法“strpos("字符串值","查找子串")+1”;2、用stripos(),语法“strpos("字符串值","查找子串")+1”。因为字符串是从0开始计数的,因此两个函数获取的位置需要进行加1处理。

php怎么替换nbsp空格符php怎么替换nbsp空格符Apr 24, 2022 pm 02:55 PM

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\&nbsp\;||\xc2\xa0)/","其他字符",$str)”语句。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン