JavaScriptを有効にしてください

PHP でグラフィックをやってみる

 ·  ☕ 3 分で読めます

PHP でグラフィックをやってみる

PHP でグラフィックをやれるか気になってやってみました!

PHP-GLFW

PHP でグラフィックをやる方法がないかと探していたら PHP-GLFW なるものを見つけました。

これはPHPからOpenGLなどのグラフィックを触るためのライブラリのようです。

インストール方法

ここに記載されている方法で設定することが可能です。

Dockerで構築してみた

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
########## Pull ##########
FROM nvidia/cuda:12.0.0-base-ubuntu22.04

########## Non-interactive ##########
ENV DEBIAN_FRONTEND=noninteractive

# 必要なパッケージ
RUN apt update \
    # 基本
    && apt install -y \
    wget \
    git \
    procps \
    vim \
    # ZIP関連
    libzip-dev \
    unzip \
    # 掃除
    && apt clean \
    && rm -rf /var/lib/apt/lists/*

#################################################
# X Windows System 設定
# DISPLAY=Xサーバー名:ディスプレイ番号.スクリーン番号
ENV DISPLAY host.docker.internal:0.0

RUN apt-get update && apt-get install -y --no-install-recommends \
    # X11
    x11-apps \
    x11-xserver-utils \
    # グラフィックライブラリ
    mesa-utils \
    && apt clean \
    && rm -rf /var/lib/apt/lists/*

#################################################
# PHPのインストール
RUN apt update && apt install -y \
    ca-certificates \
    apt-transport-https \
    software-properties-common \
    lsb-release \
    && apt clean \
    && rm -rf /var/lib/apt/lists/*
RUN add-apt-repository ppa:ondrej/php -y

# Install PHP 8.2 packages
RUN apt update && apt install -y \
    php \
    php-dev\
    && apt clean \
    && rm -rf /var/lib/apt/lists/*

# 必要なパッケージと依存関係をインストール
RUN apt update && apt install -y \
    cmake \
    git \
    # X11
    libxrandr-dev \
    libxinerama-dev \
    libxcursor-dev \
    libxi-dev \
    libxxf86vm-dev \
    # OpenGL開発ツール (OpenGL使用時)
    libgl1-mesa-dev \
    libglu1-mesa-dev \
    # GLFW
    libglfw3 \
    libglfw3-dev

#################################################
# PHP GFLW
# ソースからビルド
WORKDIR /usr/src
RUN git clone https://github.com/mario-deluna/php-glfw
WORKDIR /usr/src/php-glfw
RUN phpize && ./configure --enable-glfw && make && make install

# PHPにPHPGLFW拡張を読み込む設定
RUN echo "extension=glfw.so" > /etc/php/8.2/cli/conf.d/glfw.ini
# コンテナ起動時の作業ディレクトリの設定

#################################################
# PHP Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

WORKDIR /app

Dockerfile が用意できたらイメージのビルド。

1
docker build -t php-opengl-image .

そしてコンテナを起動。

1
docker run --rm --gpus all -it php-opengl-image

まずはグラフィックが動くかの確認をする必要があります。

1
glxgears

グラフィックが動くと下記のような歯車画面が出てきて歯車が回ります。

glxgears

サンプル

実際にPHPのコードを動かしてみましょう。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
if (!glfwInit()) {
    throw new Exception('GLFW could not be initialized!');
}

glfwWindowHint(GLFW_RESIZABLE, GL_TRUE);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);

if (!$window = glfwCreateWindow(800, 600, "PHP GLFW Demo")) {
    throw new Exception('OS Window could not be initialized!');
}

glfwMakeContextCurrent($window);
glfwSwapInterval(1);

while (!glfwWindowShouldClose($window))
{
    glfwPollEvents();
    glfwGetCursorPos($window, $mouseX, $mouseY);
    glClearColor(sin($mouseX / 300), sin($mouseY / 300), cos($mouseY / 300), 1);
    glClear(GL_COLOR_BUFFER_BIT);
    glfwSwapBuffers($window);
}

glfwDestroyWindow($window);
glfwTerminate();

実際にサンプルファイルを起動してみます。

1
php sample.php

これはマウスの位置によって背景色が変わるものです。

glxgears

その他サンプル

他にもさまざまなサンプルなどがあります。

3d-cube

まとめ

PHPでは普通では触らないグラフィックですが、実際に触ってみると色々と面白そうです。

実際にこれでゲームを作っている方もいるみたいです。

共有

こぴぺたん
著者
こぴぺたん
Copy & Paste Engineer