PHPでは、 curl_share_initは非常に有用な機能です。複数のCurlリクエストがセッション、Cookie、ファイルなど、同じリソースを共有できるようになり、リソースの繰り返しリクエストのオーバーヘッドを効果的に削減し、パフォーマンスを改善できます。実際のアプリケーションでは、複数のリクエストを中央に管理、構成、またはインターセプトする必要がある場合があり、ミドルウェアインターセプターは特に重要です。
この記事では、 curl_share_initをサポートするミドルウェアインターセプターを構築する方法について説明し、実用的な例でこのプロセスをよりよく理解するのに役立ちます。
ミドルウェアインターセプターは、要求と応答を傍受するために使用されるコンポーネントであり、リクエストが入る前と応答が発生する前に特定の操作を実行できます。通常、それらはログログ、認証の処理、キャッシュコントロール、リクエストヘッダーの追加、応答のフォーマットなどに使用されます。
私たちの場合、インターセプターは、CURL要求が発生する前または後に追加の処理を行います。 curl_share_initをサポートするミドルウェアの場合、私たちの目標は、1つのセッションリソースを複数のCurl要求で共有できるようにすることです。したがって、毎回新しいCurlセッションの初期化を回避します。
すべてのCurl要求インターセプトを処理するために特別に使用されるミドルウェアクラスを作成できます。このクラスは、いくつかの基本的な初期化とリソース管理機能を提供します。
class CurlMiddleware
{
private $shareHandle;
public function __construct()
{
// 共有リソースを初期化します
$this->shareHandle = curl_share_init();
}
public function __destruct()
{
// 共有リソースを破壊します
if ($this->shareHandle) {
curl_share_close($this->shareHandle);
}
}
public function handleRequest($url, $options = [])
{
// 設定 cURL リソースを共有します
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_SHARE, $this->shareHandle);
// 設定其他 cURL オプション
curl_setopt_array($ch, $options);
// リクエストを実行します
$response = curl_exec($ch);
if (curl_errno($ch)) {
// エラー処理
echo 'Curl error: ' . curl_error($ch);
}
curl_close($ch);
return $response;
}
}
上記のコードでは、基本的なCurlmiddlewareクラスを実装しました。ミドルウェアにするために、インターセプトロジックを追加することにより、リクエストと応答を制御できます。
手術前と事業後の操作を追加して、 HandlereQuestメソッドでリクエストまたは応答を傍受および変更できます。
class CurlMiddleware
{
private $shareHandle;
public function __construct()
{
// 共有リソースを初期化します
$this->shareHandle = curl_share_init();
}
public function __destruct()
{
// 共有リソースを破壊します
if ($this->shareHandle) {
curl_share_close($this->shareHandle);
}
}
public function beforeRequest($url, $options)
{
// リクエストを送信する前に実行されたアクション(たとえば、変更します URL 或設定额外的オプション)
$parsedUrl = parse_url($url);
$url = 'https://m66.net' . $parsedUrl['path']; // ドメイン名を置き換えます
return $url;
}
public function afterRequest($response)
{
// リクエスト後に実行されたアクション(たとえば、ロギング、応答フォーマット)
// ここでは、応答にいくつかの変更を加えたり、ログを記録したりできます
return $response;
}
public function handleRequest($url, $options = [])
{
// 事前操作:改訂 URL 或者其他オプション
$url = $this->beforeRequest($url, $options);
// 設定 cURL リソースを共有します
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_SHARE, $this->shareHandle);
// 設定其他 cURL オプション
curl_setopt_array($ch, $options);
// リクエストを実行します
$response = curl_exec($ch);
if (curl_errno($ch)) {
// エラー処理
echo 'Curl error: ' . curl_error($ch);
}
curl_close($ch);
// 操作後:処理応答
return $this->afterRequest($response);
}
}
これで、 Curlmiddlewareクラスは、各リクエストの前後にインターセプトロジックを実行できます。実際には、ミドルウェアインスタンスを作成し、リクエストを行うためにHandLeRequestメソッドを呼び出すだけです。
$middleware = new CurlMiddleware();
$options = [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true
];
// 聞く URL
$url = 'https://example.com/api/data';
// 发送聞く
$response = $middleware->handleRequest($url, $options);
// 印刷応答結果
echo $response;
curl_share_initを使用するため、複数のCurl要求が同じリソース(Cookie、セッション情報など)を共有します。これは、州を複数のリクエストで共有する必要がある状況に非常に役立ちます。ミドルウェアでは、すべてのCurl要求が同じ共有ハンドルを使用して、同じセッションデータを共有するようにします。
特に複数のリクエストで共有リソースへの同期アクセスが必要な場合、場合によってはcurl_share_initの動作を構成する必要がある場合があることに注意してください。
この記事では、 curl_share_initをサポートするミドルウェアインターセプターを構築する方法を示しています。このようなミドルウェアを介して、ロギング、エラー処理、URL変更、その他の操作を実行するために、CURLリクエストが複数回開始されたときにセッションリソースを共有し、リクエストと応答をインターセプトできます。