検索キーワードを入力
カテゴリーを選択

開発に便利!PHPでリンク切れのチェック機能を実装する方法(サンプルコード付き)

投稿日:2025年02月08日(土)
開発に便利!PHPでリンク切れのチェック機能を実装する方法(サンプルコード付き)|UMENOKI|すぐに仕事で使えるIT技術情報メディア

みなさんこんにちは!エンジニアの高澤です!

今回はPHPでリンク切れのチェック機能を実装する方法について解説していきたいと思います。

当記事ではタイトルの通り、HTMLのaタグのhref属性に指定するURLがリンク切れ(404 Not Found)しているかどうかをPHPで判定する方法についての解説記事になります。

このリンク切れチェックの機能は、例えばWebのリンクを扱うツールの開発や、WordPressでの記事一覧などでリンク切れの場合はクリックできない仕様にしたりと何かと必要な場面があるかと思います。

よろしければぜひ当記事をお仕事などでご活用いただけましたら幸いです。

当記事の実装で何ができること・メリット

当記事ではリンク切れのチェック機能の実装方法を解説しますが、一体何ができるのか?何に役立つのか?またメリットは?について解説しておきたいと思います。

リンク切れのチェックが可能なことによって、例えばサイト内の大量のリンクチェックの自動化したり、WordPressの本文中の内部リンクや外部リンクのリンク切れチェックを実施したり管理画面での可視化したりと色々なことができます。

また、リンク切れチェックツールのようなものも作れるので、便利なツールとして公開したりご自身の作業を効率化するなど、さまざまなメリットが考えられます。

リンク切れチェックの実装方法

それでは早速、リンク切れの実装方法について解説いたします。

ここでは実装方法の流れとしては以下のなります。

  • リンク切れチェック機能をisLinkBroken()関数として作成
  • HTML文字列を解析して<a>タグを抽出。
  • 各リンクのURLを取得し、作成したisLinkBroken()関数でリンク切れを判定。
  • 判定結果を赤(リンク切れ)または青(正常)で表示。

上記の流れを実装したコードが以下のPHPコードになります。

以下のコードをPHPファイルにコピー&ペーストしてください。

<?php
function isLinkBroken($url) {
  // cURLセッションを初期化
  $ch = curl_init($url);

  // cURLオプションを設定
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_NOBODY, true); // ヘッダーだけ取得
  curl_setopt($ch, CURLOPT_TIMEOUT, 10); // タイムアウト(秒)
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // リダイレクトを追跡

  // リクエストを実行
  curl_exec($ch);

  // HTTPステータスコードを取得
  $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

  // cURLセッションを終了
  curl_close($ch);

  // ステータスコードが200番台以外ならリンク切れと判定
  return ($httpCode < 200 || $httpCode >= 400);
}

// テスト用HTMLから<a>タグを抽出し、リンク切れを確認
$html = '
  <a href="https://www.google.com">Google</a>
  <a href="https://ume-noki.com/tech/xhxhxhx">Broken Link</a>
';

// DOMDocumentを使ってHTMLを解析
$dom = new DOMDocument();
@$dom->loadHTML($html);

// <a>タグを取得
$links = $dom->getElementsByTagName('a');

// 各リンクを確認
foreach ($links as $link) {
  $url = $link->getAttribute('href');
  if (isLinkBroken($url)) {
      echo '<span style="color:red;">リンク切れ</span>: ' . $url . '<br>';
  } else {
      echo '<span style="color:blue;">正常なリンク</span>: ' . $url . '<br>';
  }
}

ペーストが完了したら、ブラウザの更新を実行していただけると、画面にした下図のように処理結果が表示されていることと思います。

実装自体はこれで完了です。お疲れ様でした!

あとはご自身でお好きなようにカスタマイズしてお仕事などでご活用いただけたらと思います。

実装で使われる関数やクラスについて

それでは上記コードにある関数やクラス、メソッドなどについて解説いたします。

せっかくなのでただコピペして済ますのではなく、ご自身で自由に応用していただけるようにしっかり記述の意味を理解していただければと思います。

まずリンク切れチェックの実装では以下の関数やクラス、メソッドを利用します。

  • curl_init($url)関数
  • curl_setopt($ch, $option, $value)関数
  • curl_exec($ch)関数
  • curl_getinfo($ch, CURLINFO_HTTP_CODE)関数
  • curl_close($ch)関数
  • DOMDocumentクラス
  • DOMDocumentクラスのloadHTML($html)メソッド
  • DOMDocumentクラスのgetElementsByTagName(‘a’)メソッド
  • DOMDocumentクラスのgetAttribute(‘href’)メソッド

それぞれ解説いたします。

curl_init($url)関数

curl_init()関数は、cURLセッションを初期化するために使用されます。

cURLは、PHPでHTTPリクエストを行うためのライブラリで、この初期化が第一ステップです

curl_init()関数にURLを渡すことで、そのURLに対するリクエストを準備します。この関数が返す値は「セッションハンドル」と呼ばれ、この後に続く設定や実行で利用されます。

たとえば、あるWebページのステータス(アクセス可能かどうか)をチェックしたい場合、この関数で初期化してからリクエストの内容を指定し、結果を取得します。

以下がcurl_init()関数のPHP公式ドキュメント情報になりますので、よろしければご確認ください。

https://www.php.net/manual/ja/function.curl-init.php

curl_setopt($ch, $option, $value)関数

curl_setopt()関数は、curl_init()関数で作成したセッションハンドルに対して具体的なリクエストの設定を行います。

3つの引数があり、第一引数はハンドル、第二引数はオプション名、第三引数は設定値です。

curl_setopt()関数の第二引数に指定できるオプションと第三引数に指定できる値の例については、以下のように表にまとめました。
curl_setopt()関数を記述するときは、以下の表にある「オプション名」を第二引数へ、設定値の例にあるような値を第三引数へ設定します。

リクエスト設定

以下が「リクエスト設定」に関する内容です。

オプション名内容設定値の例
CURLOPT_URLリクエストの送信先URLを指定https://example.com
CURLOPT_RETURNTRANSFER実行結果を直接出力せず、変数に格納する設定true(変数に格納する)
CURLOPT_CUSTOMREQUESTHTTPメソッドを指定(例: GET, POST, PUT)PUT
CURLOPT_POSTPOSTリクエストを有効にするtrue(有効)
CURLOPT_POSTFIELDSPOSTリクエストで送信するデータを指定param1=value1&param2=value2
CURLOPT_HTTPGET明示的にGETリクエストを設定true

ヘッダー設定

以下が「ヘッダー設定」に関する内容です。

オプション名内容設定値の例
CURLOPT_HTTPHEADERリクエストにカスタムHTTPヘッダーを設定[‘Content-Type: application/json’]
CURLOPT_HEADERレスポンスにヘッダーを含めるかどうかを設定true(含める)
CURLOPT_NOBODYレスポンスの本文を省略し、ヘッダーのみ取得true(本文を省略)

タイムアウトと接続

以下が「タイムアウトと接続」に関する内容です。

オプション名内容設定値の例
CURLOPT_TIMEOUTリクエストのタイムアウト(秒)10
CURLOPT_CONNECTTIMEOUT接続確立のタイムアウト(秒)5
CURLOPT_FOLLOWLOCATIONリダイレクトを自動追跡するtrue
CURLOPT_MAXREDIRSリダイレクトの最大回数を設定5

認証とクッキー

以下が「認証とクッキー」に関する内容です。

オプション名内容設定値の例
CURLOPT_USERPWDHTTP認証で使用するユーザー名とパスワードを指定username:password
CURLOPT_COOKIE送信するクッキーデータを指定cookie_name=value
CURLOPT_COOKIEFILEクッキーの保存ファイルを指定/path/to/cookie.txt
CURLOPT_COOKIEJARクッキーを保存するファイルを指定/path/to/cookie.txt

上記の表にある「HTTP認証」とは、ウェブサーバーがユーザーのアクセスを制限し、IDとパスワードで認証を行う仕組みです。

クッキーとは、ウェブサイトがユーザーのブラウザに一時的に保存するデータで、ユーザー情報やセッションを管理する仕組みです。

SSLとセキュリティ

以下が「SSLとセキュリティ」に関する内容です。

オプション名内容設定値の例
CURLOPT_SSL_VERIFYPEERSSL証明書の検証を有効または無効にするtrue(検証する)
CURLOPT_SSL_VERIFYHOSTホスト名の検証レベルを設定2(検証する)
CURLOPT_CAINFOCA証明書ファイルのパスを指定/path/to/ca.pem

上記の表にある「SSL証明書」とは、ウェブサイトとユーザー間の通信を暗号化し、安全性を保証するためにウェブサーバーにインストールされるデジタル証明書です。また、ウェブサイトの運営者の信頼性を証明する役割も持っています。

「CA証明書ファイル」とは、信頼された認証局(Certificate Authority: CA)が発行したデジタル証明書で、SSL/TLS通信においてサーバー証明書の正当性を検証するために使用されます。このファイルは、通信相手が信頼できる組織であることを確認するための中核的な役割を果たします。

デバッグ

以下が「デバッグ」に関する内容です。

オプション名内容設定値の例
CURLOPT_VERBOSE詳細なデバッグ情報を有効にするtrue(デバッグ有効)
CURLOPT_STDERRデバッグ出力先を指定fopen(‘php://stderr’, ‘w’)

ファイルダウンロードとアップロード

以下が「ファイルダウンロードとアップロード」に関する内容です。

オプション名内容設定値の例
CURLOPT_FILEレスポンスデータの保存先を指定fopen(‘output.txt’, ‘w’)
CURLOPT_UPLOADファイルをアップロードするリクエストを有効にするtrue
CURLOPT_INFILEアップロードするファイルのハンドルを指定fopen(‘input.txt’, ‘r’)
CURLOPT_INFILESIZEアップロードするファイルのサイズをバイト単位で指定12345

プロキシ設定

以下が「プロキシ設定」に関する内容です。

オプション名内容設定値の例
CURLOPT_PROXY使用するプロキシサーバーを指定http://proxy.example.com:8080
CURLOPT_PROXYUSERPWDプロキシ認証のユーザー名とパスワードを指定username:password

以下がcurl_setopt()関数のPHP公式ドキュメント情報になりますので、よろしければご確認ください。

https://www.php.net/manual/ja/function.curl-setopt.php

curl_exec($ch)関数

curl_exec()関数は、cURLセッションを実行するものです。

設定が完了した後、この関数を呼び出すと指定したURLにリクエストが送信されます。たとえば、Webページの内容を取得したり、HTTPステータスコードを確認したりします。

返り値はリクエストの結果であり、成功した場合はサーバーのレスポンス(HTMLやJSONなど)を文字列で返し、失敗した場合はfalseを返します。

この関数を呼び出すまでリクエストは実行されないため、最終的な実行ステップと考えてください。

以下がcurl_exec()関数のPHP公式ドキュメント情報になりますので、よろしければご確認ください。

https://www.php.net/manual/ja/function.curl-exec.php

curl_getinfo($ch, CURLINFO_HTTP_CODE)関数

curl_getinfo()関数は、cURLセッションで取得した情報(メタデータ)を確認するために使用されます。

たとえば、リクエストに対するHTTPステータスコード(200, 404, 500など)やリダイレクト先のURLなどを取得できます。

上記のコードでは、CURLINFO_HTTP_CODEを指定しているため、HTTPステータスコードが返されます。この値を使うことで、リンクが正常(200台)か、リンク切れ(400台や500台)かを判定しています。

以下がcurl_getinfo()関数のPHP公式ドキュメント情報になりますので、よろしければご確認ください。

https://www.php.net/manual/ja/function.curl-getinfo.php

curl_close($ch)関数

この関数は、cURLセッションを終了するために使用されます。

cURLセッションはリソースを消費するため、使用が終わったら必ずcurl_close()関数でセッションを終了してリソースを解放する必要があります。

終了しないとサーバーやPHPプロセスが不必要なリソースを保持してしまい、パフォーマンスの低下やシステムの問題につながる可能性があります。

以下がcurl_close()関数のPHP公式ドキュメント情報になりますので、よろしければご確認ください。

https://www.php.net/manual/ja/function.curl-close.php

DOMDocumentクラス

DOMDocumentクラスは、PHPでHTMLやXML文書を解析し操作するために使用されるクラスです。

このクラスを利用することで、HTMLやXMLの文書をDOM(Document Object Model)というツリー構造に変換し、文書内の要素を簡単に検索したり操作したりすることができます。

DOMDocumentクラスの主な特徴は、W3C標準に準拠しており、要素や属性の追加、削除、変更などを柔軟に扱える点です。これにより、複雑なHTMLやXML文書でも効率的に操作が可能になります。

たとえば、HTML文書内の特定のタグ(例: <a>タグや <div>タグ)を抽出したり、XMLデータを生成したりする用途に使用されます。DOMDocumentクラスを使用する際は、まず以下のようにインスタンスを作成し、そのインスタンスを通じてメソッドを呼び出して操作を行います。

<?php
$dom = new DOMDocument();

loadHTML($html)メソッド

loadHTML($html)メソッドは、DOMDocumentクラスに含まれるメソッドの一つで、文字列形式のHTML文書を解析(パース)し、内部にDOMツリーを構築するために使用されます。

このメソッドを使うことで、HTML文字列をそのまま操作できる状態に変換し、構造化されたデータとして扱えるようになります。

このメソッドの特徴は、完全なHTML文書だけでなく、不完全なHTML(例: 閉じタグが欠けている文書など)にも対応できる点です。そのため、Webスクレイピングや動的なHTML操作の場面で便利に利用できます。

使用方法としては、DOMDocumentクラスをインスタンス化し、loadHTML()メソッドにHTML文字列を渡すことで、その内容をパースしてツリー構造に変換します。これにより、HTML文書内の特定の要素や属性に簡単にアクセスできるようになります。

<?php
$html = '<a href="https://example.com">Example</a>';
$dom = new DOMDocument();
@$dom->loadHTML($html); // HTMLをパース

上記では、$htmlの中身をパースしてDOMツリーに変換しています。

ちなみに「@」は警告抑制のために使われています(不完全なHTMLに対処する場合など)。

「@」は、「エラー抑制演算子」と呼ばれるものです。これをコードの先頭につけると、その処理で発生するエラーや警告を表示しなくする効果があります。

たとえば、HTMLをチェックするプログラムを作るとします。そのHTMLが少し間違っていたとしても、「プログラムはとりあえず動いてほしい!」と思うことがありますよね。「@」を付けると、細かい警告を無視して処理を続行できるようになります。

getElementsByTagName(‘a’)メソッド

DOMDocumentクラスのこのgetElementsByTagName(‘a’)メソッドは、指定したタグ(この場合は<a>タグ)をすべて取得します。

例えば、HTMLの中に複数のリンクが含まれている場合、それらを配列のように扱えるDOMNodeListオブジェクトとして返します。

これにより、すべてのリンクを一括して処理できるため、リンク切れチェックなどが効率的に行えます。

getAttribute(‘href’)メソッド

getAttribute(‘href’)メソッドは、取得した<a>タグの属性値(上記コードの場合はhref属性)を取得するメソッドです。

リンク切れチェックを行うためには、リンク先のURLが必要です。このメソッドを使うことで、各<a>タグのリンク先URLを取得し、cURLでチェックする準備が整います。

foreach構文

PHPのforeach構文は、配列やオブジェクトの要素を1つずつ処理するためのループ構文です。

上記のコードでは、DOMNodeList(<a>タグのリスト)を順番に処理して、各リンクのURLを取得し、リンク切れかどうかを判定しています。

以上のように、上記のコード全体では、cURLを使ってリンクのHTTPステータスをチェックし、DOMDocumentでHTMLを解析してリンク情報を取得しています。

それぞれの関数が連携して、リンクの状態を判定する流れを構築しています。

まとめ

この記事では、PHPを使ってリンク切れのチェック機能を実装する方法について解説しました。

具体的には、HTMLのaタグに指定されたhref属性のURLがリンク切れ(404 Not Found)しているかどうかを判定する仕組みを紹介しました。

このリンク切れチェック機能は、Web上のリンクを扱うツールの開発や、WordPressでの記事一覧に活用する際に非常に役立ちます。たとえば、リンク切れの場合にクリックを無効化する仕様にしたり、定期的なリンク管理に活用することで、ユーザー体験の向上やSEO対策にもつながるでしょう。

よろしければぜひ、この方法を参考にして、効率的なリンク管理やツール開発に役立ててみてください。

執筆者

UMENOKI編集部 高澤 翔汰

歴5年目(2024年8月以降から5年目です)のエンジニアです!
CMSでのサイト構築とWebデザイン制作を兼任して5年目になります。
自作のiOSアプリ(iPhoneアプリ)やWordPressプラグインを開発することもあり、まだまだ現在進行形で勉強中です!

お気軽に皆さんのご要望をお聞かせください!

どんなに些細なことでも構いません!よろしければ記事や当サイトへの「こんな記事があったら仕事とかで役に立つな〜」や「こうだったらもっと役に立つのに!」といったようなご要望等をお気軽にお聞かせください!今後のサービス改善にお役立てさせていただきます!

例1)Reactの技術記事を書いてほしい!
例2)WordPressの使い方とかを初心者向けに解説してほしい!...など

送信と同時にプライバシーポリシーに同意したものとします。