Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】CURL_FNMATCHFUNC_NOMATCH定数の使い方

CURL_FNMATCHFUNC_NOMATCH定数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

CURL_FNMATCHFUNC_NOMATCH定数は、PHPのcURL拡張機能において、指定された文字列がパターンに一致しない結果を示す定数です。この定数は、主にcurl_fnmatch()関数が実行された際に、引数として与えられた文字列が、定義されたパターンと全く合致しなかった場合に返される値として利用されます。

curl_fnmatch()関数は、特定の文字列がワイルドカードパターン(例えば、シェルスクリプトやFTPのglobパターンで使われる*?などの記号を含むパターン)に適合するかどうかを判定するための機能を提供します。この機能は、特にネットワーク越しでのファイル操作やデータフィルタリングの際に役立ちます。例えば、リモートサーバー上にある多数のファイルの中から、特定の命名規則に従ったファイルだけを選択的に処理したい場合などに、この関数を用いて各ファイル名をパターンと比較します。

もし、比較対象の文字列がどのパターンにも合致しないと判断された場合、curl_fnmatch()関数はこのCURL_FNMATCHFUNC_NOMATCH定数を返します。開発者はこの定数の値をチェックすることで、パターンマッチングの成否を正確に把握し、パターンに合致しなかった場合の代替処理やエラーハンドリングなどをプログラム内に適切に実装することができます。これは、ネットワーク通信を利用したアプリケーション開発において、データのフィルタリングや条件分岐を柔軟に行う上で重要な役割を果たす、基本的な判断基準の一つです。

構文(syntax)

1<?php
2echo CURL_FNMATCHFUNC_NOMATCH;

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

CURL_FNMATCHFUNC_NOMATCH は、ファイル名マッチング関数において、マッチしなかったことを示す整数値です。

サンプルコード

PHP: curlm_call_multi_perform による並行リクエスト

1<?php
2
3/**
4 * CURLマルチハンドルを使用して複数のURLに並行してリクエストを送信します。
5 * システムエンジニアを目指す初心者向けに、複数のHTTPリクエストを非同期に処理する基本を示します。
6 *
7 * @param array $urls リクエストを送信するURLの配列。
8 * @return array 各URLのレスポンスデータを格納した配列。リクエストに失敗した場合は false が含まれます。
9 */
10function performMultiCurlRequests(array $urls): array
11{
12    // 1. CURLマルチハンドルを初期化します。
13    //    これは複数のCURLリクエストを同時に管理するためのコンテナです。
14    $mh = curl_multi_init();
15    $curlHandles = [];
16    $responses = [];
17
18    // 2. 各URLに対して個別のCURLハンドルを作成し、マルチハンドルに追加します。
19    foreach ($urls as $key => $url) {
20        $ch = curl_init($url);
21        // CURLOPT_RETURNTRANSFER を true に設定すると、curl_exec() が結果を文字列として返します。
22        // これがない場合、結果は直接出力されます。
23        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
24        // ヘッダー情報をレスポンスに含めないようにします。
25        curl_setopt($ch, CURLOPT_HEADER, false);
26        // 必要に応じて他のCURLオプションを設定できます(例: タイムアウト設定)。
27        // curl_setopt($ch, CURLOPT_TIMEOUT, 5); // タイムアウト秒数
28        // curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2); // 接続タイムアウト秒数
29
30        // 個別のCURLハンドルをマルチハンドルに追加します。
31        curl_multi_add_handle($mh, $ch);
32        $curlHandles[$key] = $ch; // 後で結果を取得するためにハンドルを保存します。
33    }
34
35    // 3. すべてのリクエストが完了するまで待機します。
36    $running = null; // 実行中のハンドルの数を追跡するための変数
37    do {
38        // curl_multi_exec を呼び出し、各CURLハンドルの処理を実行します。
39        // これはキーワード「php curlm_call_multi_perform」に関連する実際の処理で、
40        // 効率的に複数のリクエストを並行して実行します。
41        // PHP 8では、この関数は0(エラーなし)またはCURLM_XXXのエラーコードを返します。
42        $mrc = curl_multi_exec($mh, $running);
43
44        // 実行中のリクエストがある間、CPU負荷を軽減するために少し待機します。
45        // curl_multi_select は、ハンドルにアクティビティがあるまでブロックします。
46        if ($running > 0) {
47            curl_multi_select($mh, 1.0); // タイムアウトは秒単位(ここでは最大1秒)
48        }
49    } while ($running > 0 && $mrc === CURLM_OK); // 実行中のハンドルがあり、エラーがない間ループを続けます。
50
51    // 4. 各CURLハンドルの結果を取得し、ハンドルをクローズします。
52    foreach ($curlHandles as $key => $ch) {
53        $responses[$key] = curl_multi_getcontent($ch); // 各ハンドルのレスポンスを取得します。
54        curl_multi_remove_handle($mh, $ch);             // マルチハンドルからハンドルを削除します。
55        curl_close($ch);                                // 個別のCURLハンドルをクローズします。
56    }
57
58    // 5. CURLマルチハンドルをクローズします。
59    curl_multi_close($mh);
60
61    // 6. CURL_FNMATCHFUNC_NOMATCH 定数の値を表示します。
62    //    この定数は libcurl の内部的なファイル名パターンマッチングコールバック関数で、
63    //    パターンに一致しなかったことを示すために使われる整数値です。
64    //    PHPスクリプトで直接利用する機会は稀ですが、CURL拡張の一部として公開されています。
65    echo "CURL_FNMATCHFUNC_NOMATCH の値: " . CURL_FNMATCHFUNC_NOMATCH . "\n";
66
67    return $responses;
68}
69
70// サンプル使用例
71$urlsToFetch = [
72    'https://www.example.com/',
73    'https://www.php.net/',
74    'https://www.google.com/',
75    // 存在しないURLを含めることで、エラー処理の概念も確認できます
76    // 'https://invalid-domain.example.com/'
77];
78
79echo "複数のURLに対して非同期リクエストを開始します...\n";
80$results = performMultiCurlRequests($urlsToFetch);
81
82echo "\n--- リクエスト結果 ---\n";
83foreach ($results as $index => $content) {
84    if ($content === false) {
85        echo "URL " . ($index + 1) . " (URL: " . $urlsToFetch[$index] . ") の取得に失敗しました。\n";
86        // curl_error() や curl_getinfo() を使って詳細なエラー情報を取得することもできますが、
87        // 初心者向けとして簡潔にするため、ここでは基本的な失敗表示に留めます。
88    } else {
89        echo "URL " . ($index + 1) . " (URL: " . $urlsToFetch[$index] . ") のコンテンツの一部:\n";
90        echo substr($content, 0, 150) . "...\n\n"; // コンテンツの先頭150文字を表示
91    }
92}

このPHPサンプルコードは、CURL拡張機能を用いて複数のURLへのHTTPリクエストを並行して実行する基本的な方法を示します。performMultiCurlRequests関数は、引数としてURLの配列($urls)を受け取り、各URLのレスポンスデータを配列として返します。リクエストが失敗した場合は、対応する位置にfalseが含まれます。

関数内部では、curl_multi_init()でマルチハンドルを初期化し、各URLに対して個別のCURLハンドルを作成して追加します。ループ内で呼び出されるcurl_multi_exec()関数は、キーワード「php curlm_call_multi_perform」が示すように、登録された複数のリクエストを同時に効率良く処理します。これにより、一つずつリクエストを待つことなく、全体の処理時間を短縮できます。すべてのリクエストが完了すると、curl_multi_getcontent()でそれぞれのレスポンスを取得し、関連するハンドルを閉じます。

コードの最後では、CURL_FNMATCHFUNC_NOMATCH定数の値を出力しています。この定数はPHPのCURL拡張の一部として提供される整数値です。主にlibcurlライブラリの内部で、ファイル名パターンマッチングコールバック関数がパターンに一致する項目を見つけられなかった場合に返されることを示します。PHPスクリプトで直接利用する機会は稀ですが、CURLの機能の一部として公開されている情報です。

このサンプルコードは複数のHTTPリクエストを並行して処理するCURLマルチハンドルの基本的な使い方を示しています。curl_multi_execcurl_multi_selectによるループ処理は、リクエストの効率的な実行とCPU負荷軽減のために重要ですので、適切な条件で終了するように注意が必要です。各CURLハンドルとマルチハンドルは、処理完了後に必ずcurl_closeおよびcurl_multi_closeで適切にリソースを解放してください。CURL_FNMATCHFUNC_NOMATCH定数はlibcurl内部の定数であり、PHPスクリプトで直接利用する機会は稀です。また、リクエスト失敗時の詳細なエラー情報はcurl_error()curl_getinfo()で確認できます。CURLOPT_RETURNTRANSFERtrueに設定しないと、レスポンスが直接出力されるためご注意ください。

PHP curl_multi_selectと定数参照

1<?php
2
3/**
4 * curl_multi_select の利用と CURL_FNMATCHFUNC_NOMATCH 定数の参照例
5 *
6 * この関数は、複数のHTTPリクエストを並行して実行し、そのI/Oアクティビティを
7 * curl_multi_select で効率的に待機する方法を示します。
8 * CURL_FNMATCHFUNC_NOMATCH 定数は、通常FTPワイルドカード転送のファイル名マッチング
9 * コールバックで使用され、「マッチしない」ことを示す整数値 (1) です。
10 * この例では、その定数値をコード内で参照するに留め、具体的な使用シナリオは含みません。
11 *
12 * システムエンジニアを目指す初心者の方へ:
13 * - cURL は様々なプロトコルでデータ転送を行うための強力なライブラリです。
14 * - curl_multi_* 関数群を使うと、複数のネットワークリクエストを同時に処理できます。
15 *   これにより、リクエストごとに待機する時間を減らし、プログラムの実行効率を高めることができます。
16 * - CURL_FNMATCHFUNC_NOMATCH は、ファイルのパターンマッチングに関連する定数の一つで、
17 *   特定のファイルがパターンにマッチしなかったことを示すのに使用されます。
18 */
19function fetchMultipleUrlsWithMultiCurl(): void
20{
21    // 取得したいURLのリスト
22    $urls = [
23        'https://httpbin.org/delay/1', // 1秒遅延するダミーAPI
24        'https://httpbin.org/delay/2', // 2秒遅延するダミーAPI
25        'https://httpbin.org/get',     // 即時応答するダミーAPI
26    ];
27
28    // cURLマルチハンドルの初期化
29    $mh = curl_multi_init();
30    $chHandles = []; // 個々のcURLイージーハンドルを格納する配列
31
32    // 各URLに対してcURLイージーハンドルを作成し、マルチハンドルに追加
33    foreach ($urls as $index => $url) {
34        $ch = curl_init();
35        curl_setopt($ch, CURLOPT_URL, $url);
36        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 結果を文字列として返す
37        curl_setopt($ch, CURLOPT_TIMEOUT, 5); // タイムアウトを5秒に設定
38        curl_multi_add_handle($mh, $ch); // マルチハンドルにイージーハンドルを追加
39        $chHandles[$index] = $ch;
40    }
41
42    // マルチハンドルからアクティブな転送がなくなるまでループ
43    $active = null; // アクティブなハンドル数を格納
44    do {
45        // cURL転送を開始/続行。$active に現在アクティブな転送数が設定される。
46        $mrc = curl_multi_exec($mh, $active);
47
48        // まだアクティブな転送があり、かつエラーがない場合
49        if ($active && $mrc === CURLM_OK) {
50            // curl_multi_select は、cURLマルチハンドルのファイル記述子のアクティビティを待機します。
51            // これにより、CPUを消費し続けることなく、ネットワークI/Oの準備ができるまで待つことができます。
52            $selectResult = curl_multi_select($mh, 1.0); // 最大1秒待機
53
54            if ($selectResult === -1) {
55                // select() システムコールがエラーを返した場合、短い時間待機して再試行
56                usleep(100000); // 100ミリ秒 (0.1秒) 待機
57            }
58        }
59    } while ($active && $mrc === CURLM_OK);
60
61    // 全ての転送が完了したら、結果を処理
62    foreach ($chHandles as $index => $ch) {
63        $url = $urls[$index];
64        $error = curl_error($ch);
65        $content = curl_multi_getcontent($ch); // 転送された内容を取得
66        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); // HTTPステータスコードを取得
67
68        echo "--- URL: {$url} ---\n";
69        if (!empty($error)) {
70            echo "Error: {$error}\n";
71        } else {
72            echo "HTTP Code: {$httpCode}\n";
73            // echo "Content: " . substr((string) $content, 0, 100) . "...\n"; // 内容の一部を表示
74            echo "Content received.\n";
75        }
76
77        // CURL_FNMATCHFUNC_NOMATCH 定数の値を参照
78        // これは、定数がどのような整数値であるかを示すためのもので、
79        // このマルチcURLの処理自体では直接利用されていません。
80        if ($index === 0) { // 例として、一度だけ定数の値を表示
81            echo "CURL_FNMATCHFUNC_NOMATCH constant value: " . CURL_FNMATCHFUNC_NOMATCH . "\n";
82        }
83        
84        curl_multi_remove_handle($mh, $ch); // マルチハンドルからイージーハンドルを削除
85        curl_close($ch); // イージーハンドルを閉じる
86    }
87
88    // マルチハンドルを閉じる
89    curl_multi_close($mh);
90}
91
92// 関数を実行
93fetchMultipleUrlsWithMultiCurl();

このPHPサンプルコードは、複数のHTTPリクエストを並行して実行し、そのI/Oアクティビティを効率的に処理する方法を示しています。cURLは、ウェブサーバーとの通信をはじめ、様々なプロトコルでデータ転送を行うための強力なライブラリです。複数のリクエストを同時に処理することで、プログラムの実行効率を大幅に向上させることができます。

まず、curl_multi_initで複数のリクエストを管理するマルチハンドルを初期化し、各URLに対してcurl_initで個別のイージーハンドルを作成後、curl_multi_add_handleでマルチハンドルに追加します。リクエストの実行はcurl_multi_execで行われ、アクティブな転送がなくなるまでループします。このループの中でcurl_multi_selectは、ネットワークからのデータが利用可能になるまで待機する役割を担います。これにより、CPUリソースを無駄に消費することなく効率的に処理を進めることができます。curl_multi_selectは最大待機秒数を引数にとり、戻り値は選択された記述子の数を返します。

CURL_FNMATCHFUNC_NOMATCHは、cURL拡張機能で定義された定数の一つです。この定数は引数を取らず、整数型(int)の値を返します。主にFTPのワイルドカード転送におけるファイル名マッチングのコールバック関数内で、「ファイルが指定されたパターンにマッチしなかった」という結果を示すために利用されます。サンプルコードでは、この定数の値を表示することで、その存在と参照方法を示すに留めており、具体的なマッチング処理には使用していません。

CURL_FNMATCHFUNC_NOMATCH定数は、本サンプルの並行HTTPリクエスト処理とは直接関係ありません。これは、主にFTPワイルドカード転送のファイル名マッチングで「マッチしない」状態を示す整数値です。コード内の参照は定数の値を確認する目的であり、この部分が機能に影響を与えることはありません。curl_multi_selectは、複数のネットワークリクエストを効率的に待機し、CPU負荷を軽減する重要な関数ですが、無限ループやデッドロックを防ぐため、タイムアウト設定とエラー処理を適切に行ってください。curl_multi_initやcurl_initで初期化したリソースは、処理完了後に必ずcurl_multi_closeやcurl_closeで解放しましょう。リソース解放を怠ると、メモリリークやパフォーマンス低下を招きます。curl_errorやcurl_getinfoでエラーや結果を常に確認し、堅牢な処理を心がけてください。

関連コンテンツ

関連IT用語

関連プログラミング言語