beta

PHP製APIと通常PHPサイト、どちらが軽い?メモリ消費量を調べてみた

新サイトをSPAで作るかPHPで作るかを悩んでいたので、どちらが軽量なのか、メモリ消費量を比べてみました。

公開日:2019年4月8日

前提条件

どちらもPHPスクリプトで、

  • API版(単純にデータを出力するパターン)
  • HTML版(PHP処理は同じでHTMLも一緒に出力するパターン)

で比べました。

環境はローカル環境でPHPバージョンは7.3.2です。

テストスクリプト

API版

PHP起動時

まずは、PHPを呼び出した時点

<?php
$mem = memory_get_usage();
$mem = number_format($mem);
print("Memory:{$mem}");

Memory:391,464

391KBでした。

データを読み込み

$data = '[{"id":1, .....]';

echo $data;
$mem = memory_get_usage();
$mem = number_format($mem);
print("Memory:{$mem}");

Memory:391,944

データの分だけ増えた感じですね。

HTML版

PHP起動時

<?php
$mem = memory_get_usage();
$mem = number_format($mem);
print("Memory:{$mem}");

Memory:389,992

データ出力時

//データ保存処理
.
.
?>
<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
.
.
.

<?php

$mem = memory_get_usage();
$mem = number_format($mem);
print("Memory:{$mem}");

Memory:442,088

HTMLファイルのサイズが5KBほどだったので、その分増えているような感じです。HTMLの容量はそこまで大きくならないケースが多いので、APIでもHTML出力でもメモリ消費量の差は誤差レベルな気がします。

## 何がメモリを食うのか

メモリを食うというイメージがあったのですが、プレーンなPHPだとあまり消費量は多くないみたいなので、何が消費するのかオリジナルのフレームワークで検証してみました。

ファイルの読み込み

$req_dir = [
  __DIR__ . '/../models/',
  __DIR__ . '/../modules/',
  __DIR__ . '/../controllers/',
];

+数10KBくらいで、ファイルを読み込んだ分だけ重くなったイメージでした。

ライブラリの読み込み

routerに以前ノートに書いたAltRouter、ORMマッパーにEloquentを使っているんですが、どちらもライブラリを読み込んだだけではそこまでメモリを消費されませんでした。

ライブラリの実行

AltRouterは、そもそも軽量なのでライブラリを起動させてもそこまで変化はなかったんですが、Eloquentはインスタンスを読み込んだだけで1MB近くメモリ使用量が増加しました。

PHPサイトが重い理由はフレームワーク??

PHPサイトといえば、フレームワークを使うことが多いと思いますが、フレームワークはライブラリの集合体みたいになっているので、ライブラリを多く読み込むことで1リクエストあたりのメモリ消費量が増えると想定できます。


PHP製APIと通常PHPサイトのどちらがメモリ消費量が少ないのかを調べてみました。

SPA + APIなのか、通常PHPなのかをよく悩むんですが、メモリ消費量という観点では、どちらというと「フレームワークを使うのか」で判断基準を決めるのが良さそうです。