こんにちは、皆さん!今回は PHP と Go(Golang) を連携させる方法について解説します。PHPは多くのWebアプリケーションで利用されているサーバーサイドのスクリプト言語ですが、Go言語を組み合わせることで、性能の高い非同期処理や高速なバックエンドサービスを活用することができます。
この記事では、PHPとGoの連携を実現する方法を、具体的なコード例と共に説明します。Goをバックエンドサービスとして使い、PHPと連携させて効率よくデータを処理する流れを学んでいきましょう。
目的
PHPとGoの連携は、以下のようなケースで有効です。
- Goの高い並行処理性能を生かして、PHPの制約を補完したい場合。
- PHPで書かれた既存のシステムにGoの新しい機能を追加したい場合。
- PHPをフロントエンドサーバーとして使い、Goをバックエンドのマイクロサービスとして動作させたい場合。
構成の基本
PHPとGoを連携させる方法としては、以下のような手段があります。
- HTTP通信を介した連携: PHPからGoのサービスにHTTPリクエストを送り、Go側で処理を行い、その結果をPHPに返す。
- CLI(コマンドラインインターフェース)経由の連携: PHPからGoのプログラムをコマンドとして実行し、その出力をPHP側で受け取る。
- gRPCによる連携: 高速な通信を実現するために、gRPCプロトコルを使ってPHPとGo間でデータをやり取りする(今回はHTTPを使った連携を中心に説明します)。
では、具体的なコードを見ていきましょう。
手順1:Goで簡単なHTTPサーバーを作成
まず、GoでHTTPサーバーを作成し、PHPからのリクエストを受け取り、それに応じた処理を行います。以下のGoコードは、単純なリクエストを受け取り、そのデータを処理して返すサーバーです。
// server.go package main import ( "encoding/json" "fmt" "log" "net/http" ) // リクエストデータ用の構造体 type RequestData struct { Name string `json:"name"` } func handler(w http.ResponseWriter, r *http.Request) { if r.Method == "POST" { var requestData RequestData // JSONリクエストを解析 err := json.NewDecoder(r.Body).Decode(&requestData) if err != nil { http.Error(w, "Invalid request", http.StatusBadRequest) return } // 処理(例えば名前を大文字にする) response := fmt.Sprintf("Hello, %s!", requestData.Name) // レスポンスを返す w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string]string{ "message": response, }) } else { http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) } } func main() { http.HandleFunc("/greet", handler) fmt.Println("Server running on http://localhost:8080") log.Fatal(http.ListenAndServe(":8080", nil)) }
このGoプログラムは、/greet
エンドポイントに対してPOSTリクエストを受け取り、リクエストデータに基づいてレスポンスを返すシンプルなAPIサーバーです。リクエストはJSON形式で送信され、Go側で名前を加工して返します。
手順2:PHPからGoのAPIにリクエストを送信
次に、PHPからこのGoのAPIサーバーにリクエストを送信し、Goで処理された結果を受け取る処理を実装します。
<?php // go_api_call.php // Goサーバーに送信するデータ $data = [ "name" => "World" ]; // JSONデータをエンコード $jsonData = json_encode($data); // GoのAPIエンドポイント $url = 'http://localhost:8080/greet'; // cURLを使ってリクエストを送信 $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData); // レスポンスを取得 $response = curl_exec($ch); curl_close($ch); // レスポンスを表示 echo "Goからの応答: " . $response; ?>
上記のPHPコードでは、cURLを使用してGoのサーバーにPOSTリクエストを送信しています。リクエストデータはJSON形式で送信され、Go側で処理された結果をPHPで受け取って表示します。
手順3:Goサーバーの起動
次に、Goサーバーを起動します。以下のコマンドを実行して、Goサーバーが正しく起動するか確認します。
go run server.go
起動に成功すると、http://localhost:8080
でサーバーが待ち受け状態になり、リクエストを受け付けるようになります。
手順4:PHPスクリプトの実行
Goサーバーが正しく動いていることを確認したら、PHPスクリプトを実行します。
php go_api_call.php
このスクリプトを実行すると、以下のような出力が得られます。
Goからの応答: {"message":"Hello, World!"}
GoサーバーがPHPからのリクエストを受け取り、"Hello, World!" というメッセージをJSON形式で返しているのが確認できます。
実行結果
- PHPから名前「World」をGoに送信。
- Goはその名前を受け取り、"Hello, World!" というメッセージを生成してPHPに返す。
- PHPはその結果を受け取り、画面に表示。
このように、GoとPHPをHTTPを介して簡単に連携させることができます。
まとめ
PHPとGoの連携は、HTTP通信を使用することで比較的簡単に実現できます。PHPは依然としてWebアプリケーションで広く利用されていますが、Goの高いパフォーマンスを活用することで、重い処理や非同期処理を効率化できます。
今回は、Goで簡単なHTTPサーバーを作成し、PHPからそのサーバーにリクエストを送る方法を解説しました。これをベースにして、より高度なマイクロサービスやリアルタイムアプリケーションを構築することが可能です。
今後は、gRPCなど他の連携方法にも挑戦してみると、さらに効率的な連携が実現できるでしょう。