プログラミングの世界では、異なる言語間の連携が非常に重要な役割を果たしています。
近年、Pythonの役割が特に注目されています。
Pythonは、そのデータ処理能力や機械学習機能において、他の言語を圧倒する力を持っています。
しかし、Web開発の領域では、Pythonが主役を務める場面はそれほど多くはありません。
現在、PHPは依然として多くのWeb開発プロジェクトで広く使われています。
例えば、Laravelフレームワークを使用すると、Webアプリケーションの開発が驚くほど簡単になります。
この記事では、PHPとPythonを組み合わせた開発方法について紹介します。
これらの言語を連携させる方法には、主に以下のようなアプローチがあります。
- スクリプト実行
- API呼び出し(自作)
今回は、API呼び出し(自作)について解説します。
スクリプト実行については、以下をご覧ください。
API呼び出しのメリット
コマンドによるスクリプト実行によるプログラム間の連携は、非常に簡単です。
ただ、簡単がゆえに問題も含んでいます。
ざっと挙げただけでも、以下の点で問題というか課題があります。
- セキュリティ
- スケーラビリティ
- メンテナンスと拡張性
小規模アプリケーションだとコマンド実行で全然問題ありません。
しかし、大規模アプリケーションとなると話は別です。
そのため、API呼び出しによるアプローチは重要なモノとなっています。
APIにすれば、コマンド実行における問題は解決できます。
加えて、以下のメリットがあります。
- 疎結合性
- プラットフォーム間の互換性
- リアルタイム処理
APIにしておけば、どんな言語からでも呼び出し可能です。
そして、自ずと疎結合なシステムとなります。
疎結合については、次の記事内で詳しく説明しています。
とにかく、プログラム間の連携をAPI呼び出しにすることはメリットが多いと言えます。
もちろん、コマンド実行の場合のときほど簡単とは言えません。
でも、一度でも理解さえしてしまえば何てことはありませんけどね。
PHPからPythonで開発されたAPIを呼び出す
まず、PythonでAPIを用意する必要があります。
APIと言うと、ApacheやNginxなどのWebサーバーを用意しないといけないイメージがあるかもしれません。
もちろん、Webサーバーを動かす方法もあります。
しかし、Webサーバーが不要な方法も存在しています。
それでいて、非同期処理で大量アクセスを捌くことが可能な方法があるのです。
そんなことを可能にするのが、Tornadoとなります。
導入も非常に簡単ですぐにAPIを作成できます。
インストールできたら、次のコードが動くはずです。
api.py
import tornado.ioloop import tornado.web class MainHandler(tornado.web.RequestHandler): def get(self): result = 5 + 3 # 何らかの処理 self.write({"result": result}) # JSON形式で結果を出力 def make_app(): return tornado.web.Application([ (r"/", MainHandler), ]) if __name__ == "__main__": app = make_app() app.listen(8888) tornado.ioloop.IOLoop.current().start()
このコードでは、ルートURL (/) にGETリクエストが来たときに、5と3を加算してその結果をJSON形式で返します。
以下のコマンドで実行すると、サーバーはポート8888で待機しています。
$ python api.py
この状態で、別ターミナルから下記コマンドにより対象のポートにアクセスします。
$ wget http://localhost:8888
そうすると、「index.html」が保存されます。
ファイルの内容は、以下となっているはずです。
{"result": 8}
これで、APIの準備は整いました。
あとは、PHPからこのAPIを呼び出すだけです。
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://localhost:8888/"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); echo $response;
上記のコードを含むPHPスクリプトにアクセスすると、次のように表示されます。
今回は、PHPとPythonともに同じマシン上で動く想定です。
もちろん、それぞれ別々のマシンに分けることができます。
その場合は、ネットーワークの知識などが必要となります。
この記事に需要があれば、別々のマシンに分ける方法を記事にしたいと思います。