folk-runtime-embed 0.1.12

Embedded PHP runtime for Folk — PHP interpreter runs in-process via FFI
Documentation
# Dockerfile for extension compatibility testing.
#
# Builds PHP with --enable-embed and installs ALL available extensions.
# Then runs the compatibility test suite.
#
# Usage:
#   docker build -f crates/folk-runtime-embed/compat/Dockerfile \
#     -t folk-embed-compat .
#   docker run --rm folk-embed-compat

# ── Stage 1: Build PHP with embed SAPI + all extensions ──────────
FROM debian:bookworm-slim AS php-builder

RUN apt-get update && apt-get install -y \
    build-essential autoconf bison re2c pkg-config \
    libxml2-dev libsqlite3-dev libonig-dev libcurl4-openssl-dev \
    libssl-dev zlib1g-dev libreadline-dev libzip-dev libpng-dev \
    libjpeg-dev libfreetype-dev libwebp-dev libavif-dev \
    libgmp-dev libldap2-dev libldb-dev libsasl2-dev \
    libpq-dev default-libmysqlclient-dev libsodium-dev \
    libtidy-dev libxslt1-dev libffi-dev libbz2-dev \
    libsnmp-dev libgd-dev libenchant-2-dev libargon2-dev \
    unixodbc-dev firebird-dev libpspell-dev \
    curl git \
    && rm -rf /var/lib/apt/lists/*

ARG PHP_VERSION=8.3.15
RUN curl -fSL "https://www.php.net/distributions/php-${PHP_VERSION}.tar.xz" -o /tmp/php.tar.xz \
    && mkdir -p /usr/src/php \
    && tar xf /tmp/php.tar.xz -C /usr/src/php --strip-components=1 \
    && rm /tmp/php.tar.xz

WORKDIR /usr/src/php

# Build with maximum extensions enabled
RUN ./configure \
    --enable-embed=shared \
    --enable-opcache \
    --enable-mbstring \
    --enable-pcntl \
    --enable-sockets \
    --enable-bcmath \
    --enable-calendar \
    --enable-ctype \
    --enable-dom \
    --enable-exif \
    --enable-ftp \
    --enable-gd --with-jpeg --with-freetype --with-webp \
    --enable-intl \
    --enable-mysqlnd \
    --enable-soap \
    --enable-shmop \
    --enable-sysvsem \
    --enable-sysvshm \
    --enable-sysvmsg \
    --with-bz2 \
    --with-curl \
    --with-ffi \
    --with-gettext \
    --with-gmp \
    --with-ldap \
    --with-openssl \
    --with-pdo-mysql \
    --with-pdo-pgsql \
    --with-pgsql \
    --with-readline \
    --with-sodium \
    --with-tidy \
    --with-xsl \
    --with-zip \
    --with-zlib \
    --with-pdo-sqlite \
    --with-config-file-path=/etc/php \
    --with-config-file-scan-dir=/etc/php/conf.d \
    --disable-cgi \
    --disable-phpdbg \
    --prefix=/usr/local \
    && make -j"$(nproc)" \
    && make install \
    && mkdir -p /etc/php/conf.d

# Install PECL extensions
RUN pecl install redis msgpack igbinary apcu mongodb yaml uuid xhprof \
    && for ext in redis msgpack igbinary apcu mongodb yaml uuid xhprof; do \
        echo "extension=$ext.so" > /etc/php/conf.d/50-$ext.ini; \
    done

# Verify embed SAPI
RUN test -f /usr/local/lib/libphp.so
RUN php-config --php-sapis | grep -q embed

# ── Stage 2: Test runner ─────────────────────────────────────────
FROM debian:bookworm-slim

RUN apt-get update && apt-get install -y \
    build-essential pkg-config curl \
    libxml2 libsqlite3-0 libonig5 libcurl4 libssl3 zlib1g \
    libreadline8 libzip4 libpng16-16 libjpeg62-turbo libfreetype6 \
    libwebp7 libgmp10 libldap-2.5-0 libpq5 default-mysql-client \
    libsodium23 libtidy5deb1 libxslt1.1 libffi8 libbz2-1.0 \
    libsnmp40 libgd3 libargon2-1 libenchant-2-2 \
    unixodbc firebird3.0-utils libpspell-dev \
    && rm -rf /var/lib/apt/lists/*

COPY --from=php-builder /usr/local /usr/local
COPY --from=php-builder /etc/php /etc/php
RUN ldconfig

# Install Rust
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain 1.85.0
ENV PATH="/root/.cargo/bin:${PATH}"

# Copy workspace
WORKDIR /src
COPY . .

# Copy test script
COPY crates/folk-runtime-embed/compat/test_extensions.php /src/test_extensions.php

# Build embed crate
RUN cargo build -p folk-runtime-embed 2>&1

# Run compatibility tests
CMD ["cargo", "test", "-p", "folk-runtime-embed", "--test", "extension_compat", "--", "--test-threads=1", "--nocapture"]