PHPでチャット機能を作る!5ステップで完璧に理解する方法

PHPでチャット機能を作る5ステップの手順図PHP
この記事は約9分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

この記事を読めば、PHPでチャット機能を作ることができるようになります。

PHPを使ったチャット機能の作成方法や応用例、注意点と対処法、カスタマイズ方法を初心者目線で詳しく解説します。

サンプルコードも用意しているので、一緒に手を動かしながら学んでいきましょう。

●PHPとは

PHPはWeb開発で広く使われるサーバーサイドのプログラミング言語です。

データベースとの連携も得意なので、動的なWebサイトやアプリケーションの開発に最適です。

●PHPでのチャット機能の作り方

ここからは、PHPでのチャット機能の作り方について、5つのステップで解説します。

○サンプルコード1:データベースの作成

まずは、チャットのメッセージを保存するデータベースを作成します。

この例では、MySQLを使ってデータベースを作成しています。

CREATE DATABASE chat_db;
USE chat_db;
CREATE TABLE messages (
  id INT AUTO_INCREMENT PRIMARY KEY,
  user_name VARCHAR(255) NOT NULL,
  content TEXT NOT NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

○サンプルコード2:メッセージの送信

次に、メッセージを送信するためのPHPコードを作成します。

ユーザー名とメッセージ内容をデータベースに保存します。

<?php
// データベース接続
$dsn = 'mysql:host=localhost;dbname=chat_db';
$user = 'root';
$password = 'root';
$pdo = new PDO($dsn, $user, $password);

// メッセージ送信
if (isset($_POST['send'])) {
  $user_name = $_POST['user_name'];
  $content = $_POST['content'];

  $sql = "INSERT INTO messages (user_name, content) VALUES (:user_name, :content)";
  $stmt = $pdo->prepare($sql);
  $stmt->bindParam(':user_name', $user_name, PDO::PARAM_STR);
  $stmt->bindParam(':content', $content, PDO::PARAM_STR);
  $stmt->execute();
}
?>

○サンプルコード3:メッセージの受信

メッセージをデータベースから取得して表示するPHPコードを作成します。

<?php
// メッセージ取得
$sql = "SELECT * FROM messages ORDER BY created_at DESC";
$stmt = $pdo->query($sql);
$messages = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>

○サンプルコード4:メッセージの表示

次に、受信したメッセージをユーザーに表示するためのコードを紹介します。

HTMLとCSSを組み合わせて、取得したメッセージを見やすく表示します。

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>チャットルーム</title>
  <style>
    .message {
      border: 1px solid #ccc;
      padding: 10px;
      margin-bottom: 10px;
    }
  </style>
</head>
<body>
  <h1>チャットルーム</h1>
  <?php foreach ($messages as $message): ?>
  <div class="message">
    <p><strong><?php echo htmlspecialchars($message['user_name']); ?></strong></p>
    <p><?php echo htmlspecialchars($message['content']); ?></p>
    <p><?php echo htmlspecialchars($message['created_at']); ?></p>
  </div>
  <?php endforeach; ?>
</body>
</html>

○サンプルコード5:チャットルームの作成

最後に、メッセージの送信と表示を行うチャットルームの全体的なコードを紹介します。

<?php
$dsn = 'mysql:host=localhost;dbname=chat_db';
$user = 'root';
$password = 'root';
$pdo = new PDO($dsn, $user, $password);

if (isset($_POST['send'])) {
  $user_name = $_POST['user_name'];
  $content = $_POST['content'];

  $sql = "INSERT INTO messages (user_name, content) VALUES (:user_name, :content)";
  $stmt = $pdo->prepare($sql);
  $stmt->bindParam(':user_name', $user_name, PDO::PARAM_STR);
  $stmt->bindParam(':content', $content, PDO::PARAM_STR);
  $stmt->execute();
}

$sql = "SELECT * FROM messages ORDER BY created_at DESC";
$stmt = $pdo->query($sql);
$messages = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>チャットルーム</title>
  <style>
    .message {
      border: 1px solid #ccc;
      padding: 10px;
      margin-bottom: 10px;
    }
  </style>
</head>
<body>
  <h1>チャットルーム</h1>
  <?php foreach ($messages as $message): ?>
  <div class="message">
    <p><strong><?php echo htmlspecialchars($message['user_name']); ?></strong></p>
    <p><?php echo htmlspecialchars($message['content']); ?></p>
    <p><?php echo htmlspecialchars($message['created_at']); ?></p>
  </div>
  <?php endforeach; ?>
</body>
</html>

●応用例:リアルタイムチャットの実装

今までの例ではページの再読み込みが必要でしたが、リアルタイムにチャットを行うには、WebSocketなどの技術が利用されます。

WebSocketは、クライアントとサーバー間で双方向の通信を可能にするプロトコルで、リアルタイムに情報をやり取りすることができます。

○サンプルコード6:WebSocketの利用

次のコードは、RatchetというPHPのライブラリを利用してWebSocketサーバーを作成する例です。

このコードでは、Ratchetライブラリを使ってWebSocketサーバーを開設しています。

サーバーは8080ポートで待ち受け、新たなWebSocket接続があるとChatクラスのインスタンスを生成します。

<?php
require 'vendor/autoload.php';

use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use MyApp\Chat;

$server = IoServer::factory(
  new HttpServer(
    new WsServer(
      new Chat()
    )
  ),
  8080
);

$server->run();
?>

●注意点と対処法

PHPでチャット機能を実装する際の注意点は、セキュリティとパフォーマンスです。

メッセージの内容をそのまま表示すると、XSS(クロスサイトスクリプティング)というセキュリティ上の脆弱性を生じさせる可能性があります。

このため、表示前にメッセージを適切にエスケープすることが重要です。

また、リアルタイムチャットの場合、大量のユーザーからの接続を処理する必要があります。

これには、非同期処理を行うことが一般的です。

PHPでもSwooleなどの拡張を利用することで、非同期処理やコルーチンを利用することが可能です。

●カスタマイズ方法

PHPで作成したチャット機能は、自由にカスタマイズすることが可能です。

例えば、ユーザー間でのプライベートメッセージの送受信機能を追加したり、絵文字や画像の送信機能を実装したりすることができます。

また、CSSやJavaScriptを利用することで、見た目や操作感を自由に変更することができます。

まとめ

本記事では、PHPを用いてチャット機能を実装する方法を順を追って説明しました。

具体的なコードを使い、データベースの作成から、メッセージの送信、受信、表示、チャットルームの作成までを詳しく見てきました。

また、リアルタイムのチャットを実現するためのWebSocketの利用方法も触れました。

さらに、PHPでチャット機能を実装する際の注意点として、セキュリティとパフォーマンスの問題にも触れました。

表示前のメッセージの適切なエスケープ処理がセキュリティを保つために重要である一方、非同期処理やコルーチンの利用が大量のユーザー接続を処理する上で必要となることを説明しました。

そして最後に、カスタマイズの可能性について述べました。

プライベートメッセージの送受信機能の追加や、絵文字や画像の送信機能の実装など、PHPで作成したチャット機能は多岐にわたり自由にカスタマイズすることができます。

この記事が、PHPを使って自身でチャット機能を実装したいと思っている方々の参考になれば幸いです。