get_file_contentsで同サーバー内のphpの実行結果を取得する(PHP)

PHPの便利メソッド get_file_contents で少しハマったので解決策を共有します。

何をしたいか?

同じサーバー内にあるphpにアクセスして、その実行結果を取得したい。

/api/v1/getuser.php?id=123

上記のようなパスにアクセスすると情報が取得できるPHPが用意されているとします。この実行結果(返り値)を同じサーバーのPHPから得たいと思います。

PHPからHTTP通信をする方法はいくつもありますが、一番分かりやすく使いやすいのが、get_file_contents()です。

ドキュメントはこちら
https://www.php.net/manual/ja/function.file-get-contents.php

上手くいかない例

PHP
$res = get_file_contents('/api/v1/getuser.php?id=123');

//file_get_contents(/api/v1/getuser.php?id=123): failed to open stream: No such file or directory

failed to open stream: No such file or directory

そんなファイル存在しないよ、と言われてしまいます。
パスの書き方の問題ではありません。
単純に、GETパラメータ付きのパスを認識してくれません。

PHP
$res = get_file_contents('/api/v1/getuser.php');

試しにGETパラメータを外して、上記のように書くと、phpのソースコードが文字列でそのまま返ってきてしまいますし、そもそもパラメータも渡せないので意味がありません。

動作する書き方

PHP
$res = get_file_contents('https://'.$_SERVER['SERVER_NAME'].'/api/v1/getuser.php?id=123');

要するに、プロトコル(htps://)から始まるURLを書けばOKです。

あとは、$resに入ってきた文字列をjson_decode()でパースするなどすれば意図通りのことができます。

おわりに

結果としては非常に単純なことなのですが、パスの書き方を __DIR__ から始めてみたり、パラメータ部分を http_build_query() で生成してみたりといろいろ試行しても意味変わらず、Webの記事だと、ob_get_contents()で実行結果をバッファにいれて取得するという力業が紹介されていたりしましたが、上記の方法でシンプルに解決しました。