目次
データベース接続の永続性とは" >データベース接続の永続性とは
接続永続性は何に役立ちますか? " >接続永続性は何に役立ちますか?
効率の比較" >効率の比較
注意" >注意
总结" >总结
ホームページ バックエンド開発 PHPの問題 PHP におけるデータベース接続の永続性の詳細な紹介

PHP におけるデータベース接続の永続性の詳細な紹介

Jun 04, 2021 pm 05:28 PM
php

この記事では、PHP におけるデータベース接続の永続性について詳しく説明します。一定の参考値があるので、困っている友達が参考になれば幸いです。

PHP におけるデータベース接続の永続性の詳細な紹介

データベースの最適化は Web 開発における最優先事項であり、多くの場合、実際にデータベース用にプログラミングを行っています。もちろん、ユーザーの操作や行動はすべてデータとして保存されます。

このうち、データベース接続作成プロセスで最適化できるものはありますか?答えはもちろん「はい」です。Java などの言語には接続プールの設定がありますが、PHP には通常の開発では接続プールのようなものはありません。接続プール技術はマルチスレッドが関与する場合によく使用されるため、PHP は実行するたびに新しい接続が作成されます。この場合、データ接続を最適化するにはどうすればよいでしょうか?

データベース接続の永続性とは

まず、データベース接続の永続性の定義を見てみましょう。

永続的なデータベース接続とは、スクリプトの実行終了時に閉じられない接続を指します。永続的な接続要求を受信したとき。 PHP は、(以前に開かれた) 同一の永続接続が既に存在するかどうかを確認します。

存在する場合はこの接続が直接使用され、存在しない場合は新しい接続が確立されます。いわゆる「同じ」接続とは、同じユーザー名とパスワードを使用した同じホストへの接続を指します。

Web サーバーの動作と分散負荷を完全に理解していない読者は、永続的な接続の役割を誤解する可能性があります。特に、永続的な接続は、同じ接続上で「ユーザー セッション」を確立する機能を提供せず、トランザクションを効果的に確立する機能も提供しません。実際、厳密に言えば、永続接続は、非永続接続が提供できない特別な機能を提供しません。

これは PHP における接続の永続性ですが、永続的な接続には非永続的な接続では提供できない特別な機能がないことも指摘しています。非常にややこしいのですが、この解決策でパフォーマンスが向上すると言われているのではないでしょうか?

接続永続性は何に役立ちますか?

はい、上記の定義で指摘された特別な機能から判断すると、永続的接続は新しい機能やより高度な機能をもたらしませんが、その最大の用途は効率を向上させることであり、パフォーマンスも向上することを意味します。

Web サーバーから SQL サーバーへの接続コスト (オーバーヘッド) が高い場合 (たとえば、時間がかかり、一時メモリの消費量が多くなる場合)、永続的な接続の方が効率的になります。

つまり、接続コストが高い場合、データベース接続を作成するコストも大きくなり、当然時間も長くなります。永続的な接続を使用した後、各子プロセスは、ページを処理するたびに SQL サーバーに接続要求を行うのではなく、ライフ サイクルで 1 回だけ接続操作を実行します。これは、各子プロセスがサーバーへの独自の独立した永続的な接続を確立することを意味します。

たとえば、20 の異なる子プロセスが永続的な SQL サーバーの永続接続を確立するスクリプトを実行すると、実際には SQL サーバーに対して 20 の異なる永続接続がプロセスごとに 1 つずつ確立されます。

効率の比較

さっそく、コードを通して直接比較してみましょう。まず、現在のミリ秒時間を返す統計関数を定義します。さらに、データ接続パラメータも準備する必要があります。

function getmicrotime()
{
    list($usec, $sec) = explode(" ", microtime());
    return ((float) $usec + (float) $sec);
}

$db = [
    'server' => 'localhost:3306',
    'user' => 'root',
    'password' => '',
    'database' => 'blog_test',
];
ログイン後にコピー

次に、まず通常の mysqli をテストに使用します。

$startTime = getmicrotime();
for ($i = 0; $i < 1000; $i++) {
    $mysqli = new mysqli($db["server"], $db["user"], $db["password"], $db["database"]); //持久连接
    $mysqli->close();
}
echo bcsub(getmicrotime(), $startTime, 10), PHP_EOL;
// 6.5814000000
ログイン後にコピー

1000 サイクルにわたるデータベース接続の作成プロセスで、6 秒以上かかりました。次に、永続的な接続を使用して、これら 1,000 のデータベース接続を作成します。 mysqli の $host パラメータの前に p: を追加するだけです。

$startTime = getmicrotime();
for ($i = 0; $i < 1000; $i++) {
    $mysqli = new mysqli(&#39;p:&#39; . $db["server"], $db["user"], $db["password"], $db["database"]); //持久连接
    $mysqli->close();
}
echo bcsub(getmicrotime(), $startTime, 10), PHP_EOL;
// 0.0965000000
ログイン後にコピー

mysqli 接続の観点から見ると、効率の向上は明らかです。もちろん、PDO データベース接続には、永続的な接続を確立する特性もあります。

$startTime = getmicrotime();
for ($i = 0; $i < 1000; $i++) {
    $pdo = new PDO("mysql:dbname={$db[&#39;database&#39;]};host={$db[&#39;server&#39;]}", $db[&#39;user&#39;], $db[&#39;password&#39;]);
}
echo bcsub(getmicrotime(), $startTime, 10), PHP_EOL;
// 6.6171000000

$startTime = getmicrotime();
for ($i = 0; $i < 1000; $i++) {
    $pdo = new PDO("mysql:dbname={$db[&#39;database&#39;]};host={$db[&#39;server&#39;]}", $db[&#39;user&#39;], $db[&#39;password&#39;], [PDO::ATTR_PERSISTENT => true]); //持久连接
}
echo bcsub(getmicrotime(), $startTime, 10), PHP_EOL;
// 0.0398000000
ログイン後にコピー

PDO モードで接続する場合は、PDO::ATTR_PERSISTENT パラメーターを指定して true に設定する必要があります。このようにして、PDO によって確立された接続も永続的な接続になります。

注意

データベースの永続的接続は非常に強力なので、この永続的接続フォームをデフォルトにしないのはどうでしょうか。これを実現するにはパラメータを手動で追加する必要がありますか? ? PHP 開発者は確かに依然として懸念を抱いています。

永続的な接続を持つ子プロセスの数がデータベース接続数に設定された制限を超えると、システムで問題が発生します。データベースの同時接続数が 16 に制限されており、ビジー セッションの場合に 17 のスレッドが接続を試行すると、1 つのスレッドが接続に失敗します。このとき、接続を閉じることを妨げるエラー (無限ループなど) がスクリプト内で発生すると、データベースへの 16 個の接続がすぐに影響を受けます。

同時に、テーブルのロックとトランザクションにも注意が必要です。

永続的な接続でデータ テーブル ロックを使用する場合、スクリプトが何らかの理由でデータ テーブル ロックを解放できない場合、同じ接続を使用する後続のスクリプトは永久にブロックされ、httpd サービスまたはデータベースの再起動が必要になります。 。 仕える###

在使用事务处理时,如果脚本在事务阻塞产生前结束,则该阻塞也会影响到使用相同连接的下一个脚本

所以,在使用表锁及事务的情况下,最好还是不要使用持久化的数据库连接。不过好在持久连接和普通连接是可以在任何时候互换的,我们定义两种连接形式,在不同的情况下使用不同的连接即可解决类似的问题。

总结

事物总有两面性,持久连接一方面带来了效率的提升,但另一方面也可能带来一些业务逻辑上的问题,而且这种问题如果在不了解持久连接的机制的情况下会非常难排查。因此,在日常开发中我们一定要在了解相关功能特性的情况下再选择适合的方式来完成所需要的功能开发。

测试代码:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202004/source/PHP%E4%B8%AD%E7%9A%84%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5%E6%8C%81%E4%B9%85%E5%8C%96.php
ログイン後にコピー

推荐学习:php视频教程

以上がPHP におけるデータベース接続の永続性の詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホット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ヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

CakePHP プロジェクトの構成 CakePHP プロジェクトの構成 Sep 10, 2024 pm 05:25 PM

この章では、CakePHP の環境変数、一般設定、データベース設定、電子メール設定について理解します。

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

CakePHP の日付と時刻 CakePHP の日付と時刻 Sep 10, 2024 pm 05:27 PM

Cakephp4 で日付と時刻を操作するには、利用可能な FrozenTime クラスを利用します。

CakePHP ファイルのアップロード CakePHP ファイルのアップロード Sep 10, 2024 pm 05:27 PM

ファイルのアップロードを行うには、フォーム ヘルパーを使用します。ここではファイルアップロードの例を示します。

CakePHP ルーティング CakePHP ルーティング Sep 10, 2024 pm 05:25 PM

この章では、ルーティングに関連する次のトピックを学習します。

CakePHP について話し合う CakePHP について話し合う Sep 10, 2024 pm 05:28 PM

CakePHP は、PHP 用のオープンソース フレームワークです。これは、アプリケーションの開発、展開、保守をより簡単にすることを目的としています。 CakePHP は、強力かつ理解しやすい MVC のようなアーキテクチャに基づいています。モデル、ビュー、コントローラー

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

CakePHP バリデータの作成 CakePHP バリデータの作成 Sep 10, 2024 pm 05:26 PM

Validator は、コントローラーに次の 2 行を追加することで作成できます。

See all articles