Python転職初心者向けエンジニアリングブログ

Pythonに魅了されたあなたへ。エンジニアリングの扉を開く転職初心者向けのブログへようこそ。このブログでは、Pythonの奥深さに迫りながら、エンジニアリングへの転職に役立つ情報を提供しています。未経験者から始めるPythonエンジニアリングの世界への一歩を踏み出すためのガイダンス、ベストプラクティス、そして成功事例など、初心者の方でもわかりやすいコンテンツをお届けします。

PHPとGoの連携を実現する方法

LYPプレミアム会員 python

こんにちは、皆さん!今回は PHPGo(Golang) を連携させる方法について解説します。PHPは多くのWebアプリケーションで利用されているサーバーサイドのスクリプト言語ですが、Go言語を組み合わせることで、性能の高い非同期処理や高速なバックエンドサービスを活用することができます。

この記事では、PHPとGoの連携を実現する方法を、具体的なコード例と共に説明します。Goをバックエンドサービスとして使い、PHPと連携させて効率よくデータを処理する流れを学んでいきましょう。

目的

PHPとGoの連携は、以下のようなケースで有効です。

  • Goの高い並行処理性能を生かして、PHPの制約を補完したい場合。
  • PHPで書かれた既存のシステムにGoの新しい機能を追加したい場合。
  • PHPをフロントエンドサーバーとして使い、Goをバックエンドのマイクロサービスとして動作させたい場合。

構成の基本

PHPとGoを連携させる方法としては、以下のような手段があります。

  1. HTTP通信を介した連携: PHPからGoのサービスにHTTPリクエストを送り、Go側で処理を行い、その結果をPHPに返す。
  2. CLI(コマンドラインインターフェース)経由の連携: PHPからGoのプログラムをコマンドとして実行し、その出力をPHP側で受け取る。
  3. 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など他の連携方法にも挑戦してみると、さらに効率的な連携が実現できるでしょう。