PHP開発では、特に多数のネットワークリクエストまたはデータベース接続が必要な場合、シングルスレッド同期操作はしばしばボトルネックになり、プログラムの全体的な効率に影響します。この問題を解決するために、複数の接続インスタンスを作成し、並列処理を活用することでパフォーマンスを改善できます。この記事では、PHPのConnect()関数の例を組み合わせて、複数のインスタンス接続を実装し、並列処理を使用して操作をスピードアップする方法を説明します。
従来のPHPコードは、多くの場合、次のような同期的に実行されます。
<?php
function connect($url) {
// シミュレーションリクエスト
$content = file_get_contents($url);
return $content;
}
$urls = [
'http://example.com/api/1',
'http://example.com/api/2',
'http://example.com/api/3',
];
foreach ($urls as $url) {
$result = connect($url);
echo $result . "\n";
}
?>
上記のコードでは、各リクエストが最後の完了を待つ必要があるため、非効率性が発生する必要があります。各リクエストに1秒かかる場合、3つのリクエストすべてが完了するまでに3秒かかります。
各リクエストに対して独立した接続インスタンスを作成できます。
<?php
class Connector {
private $url;
public function __construct($url) {
$this->url = $url;
}
public function connect() {
return file_get_contents($this->url);
}
}
$urls = [
'http://m66.net/api/1',
'http://m66.net/api/2',
'http://m66.net/api/3',
];
$connectors = [];
foreach ($urls as $url) {
$connectors[] = new Connector($url);
}
このようにして、各リクエストをオブジェクトにカプセル化しますが、リクエストを同期します。
PHPは、次のような並列性を実装する複数の方法をサポートしています。
curl_multi_*一連の関数を使用して、同時リクエストを作成します。
マルチスレッド( Pthreads拡張機能など)を活用してください。
ReactPhpなどの非同期ライブラリを使用します。
ここでは、 curl_multiは、複数の接続インスタンスを並行して処理する方法を示す例として使用されます。
<?php
class Connector {
private $url;
private $ch;
public function __construct($url) {
$this->url = $url;
$this->ch = curl_init();
curl_setopt($this->ch, CURLOPT_URL, $this->url);
curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, true);
}
public function getCurlHandle() {
return $this->ch;
}
public function getContent() {
return curl_multi_getcontent($this->ch);
}
}
<?php
$urls = [
'http://m66.net/api/1',
'http://m66.net/api/2',
'http://m66.net/api/3',
];
$connectors = [];
foreach ($urls as $url) {
$connectors[] = new Connector($url);
}
$multiHandle = curl_multi_init();
foreach ($connectors as $connector) {
curl_multi_add_handle($multiHandle, $connector->getCurlHandle());
}
$running = null;
do {
curl_multi_exec($multiHandle, $running);
curl_multi_select($multiHandle);
} while ($running > 0);
foreach ($connectors as $connector) {
$content = $connector->getContent();
echo $content . "\n";
curl_multi_remove_handle($multiHandle, $connector->getCurlHandle());
}
curl_multi_close($multiHandle);
curl_multiを介して、複数のHTTP要求を同時に開始でき、すべてのリクエストが完了するのを待って結果を一度に処理し、待ち時間を大幅に節約できます。
connect()関数を使用してリクエストをカプセル化し、複数の接続インスタンスを作成して簡単に管理します。
PHPのcurl_multiシリーズ関数を使用して、リクエストの並列処理を実装します。
並列処理は、ネットワーク要求または接続の効率を大幅に改善し、複数のインターフェイスに同時にアクセスできるシナリオに適しています。