Skip to content
View in the app

A better way to browse. Learn more.

AlphaGNU

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Long-awaited CWP PHP 8.4 & 8.5 — Finally on Test!

Featured Replies

After a long wait, PHP 8.4 and PHP 8.5 are finally available for testing on CWP (Control Web Panel)! 🎉

I've started testing both versions to check their installation, compatibility, stability, PHP extensions, and overall performance in a real CWP environment.

This is still a testing phase, so I'm checking for any issues before considering them ready for production use.

I'll be sharing my findings, installation steps, compatibility results, and any issues I encounter along the way.

PHP 8.4 & 8.5 on CWP — the testing begins! 🔧🐘

Stay tuned for the results.

image.png

@Sandeep B. Hello, here is the latest working EL9 script for PHP 8.5 FPM for AlmaLinux 9.x

#!/bin/bash

# Usage: bash /root/build-php-fpm85-el9.sh 2>&1 | tee /root/php85-build.log
# External modules:
# /usr/local/cwpsrv/htdocs/resources/conf/el9/php-fpm_selector/external_modules/8.5
set -euo pipefail
set -x

# --- Basic variables ---
PHPMAJOR="85"                  # php-fpm85
PHPVER="8.5.9"                # PHP version
FPMDIR="/opt/alt/php-fpm${PHPMAJOR}"
CONFBASE="/usr/local/cwp/.conf/php-fpm_conf"

arch=$(uname -m)
if [[ "$arch" == "x86_64" ]]; then
    platform="x86-64"
    libdir="/usr/lib64"
else
    platform="x86"
    libdir="/usr/lib"
fi

# --- Packages for Build (EL9) ---
dnf -y install \
  krb5-devel glibc-common gnutls-devel \
  libargon2 libargon2-devel libbsd-devel \
  perl libzip libzip-devel pcre2 pcre2-devel \
  libavif libavif-devel \
  uw-imap-devel \
  openssl-devel

# If there is any old CWP OpenSSL hack left, don't use it.:
if [ -d /usr/local/opensslso ]; then
  echo "WARN: /usr/local/opensslso exists, but we DO NOT USE for compiling PHP (OpenSSL 1.1 hack)."
fi

# --- Force OpenSSL 3.x ---
export PKG_CONFIG_PATH=/usr/lib64/pkgconfig
export OPENSSL_CFLAGS="-I/usr/include"
export OPENSSL_LIBS="-L/usr/lib64"
export LDFLAGS="-lssl -lcrypto"

# --- CWP pre-conf, if exists (e.g.: pcre2, & other libs) ---
if [ -e "${CONFBASE}/php${PHPMAJOR}_pre.conf" ]; then
    bash "${CONFBASE}/php${PHPMAJOR}_pre.conf"
fi

# --- PHP SOURCE DOWNLOAD CHECK: CWP CDN → OFFICIAL php.net → GitHub fallback ---
CWP_URL="http://static.cdn-cwp.com/files/php/php-${PHPVER}.tar.gz"
PHPNET_URL="https://www.php.net/distributions/php-${PHPVER}.tar.gz"
GITHUB_URL="https://codeload.github.com/php/php-src/tar.gz/refs/tags/php-${PHPVER}"

# Function: check HTTP 200 + verify tar.gz content
check_and_verify() {
    local url="$1"
    local testfile="/tmp/php-test-${PHPVER}.tar.gz"

    echo "Checking: $url"

    # First check HTTP status code
    if ! curl -I -L -s "$url" | grep -q "200"; then
        echo "  → HTTP check failed"
        return 1
    fi

    # Download temporary test file
    if ! wget -q "$url" -O "$testfile"; then
        echo "  → Download failed"
        return 1
    fi

    # Validate MIME type of tar.gz
    if file "$testfile" | grep -qiE "gzip compressed data|tar archive"; then
        rm -f "$testfile"
        echo "  → Valid TAR.GZ"
        return 0
    fi

    echo "  → Invalid TAR.GZ (HTML or wrong file)"
    rm -f "$testfile"
    return 1
}

# Check sources in order (CWP → php.net → GitHub)
if check_and_verify "$CWP_URL"; then
    PHPSOURCE="$CWP_URL"
elif check_and_verify "$PHPNET_URL"; then
    PHPSOURCE="$PHPNET_URL"
elif check_and_verify "$GITHUB_URL"; then
    PHPSOURCE="$GITHUB_URL"
else
    echo "ERROR: Could not download a valid PHP source for version ${PHPVER}"
    exit 1
fi

echo "Using source: $PHPSOURCE"

# --- Build directory ---
rm -rf /usr/local/src/php-build
mkdir -p /usr/local/src/php-build
cd /usr/local/src/php-build

wget -q "${PHPSOURCE}" -O "php-${PHPVER}.tar.gz"

tar -xzf "php-${PHPVER}.tar.gz"
cd "php-${PHPVER}"

# --- Configure: CWP's own php85.conf, but already wired to OpenSSL 3.x from env ---
if [ ! -x "${CONFBASE}/php${PHPMAJOR}.conf" ]; then
    chmod +x "${CONFBASE}/php${PHPMAJOR}.conf" 2>/dev/null || true
fi

# PHP 8.5 no longer accepts several legacy configure flags that CWP may keep
# in an already generated php85.conf.
sed -i -E \
    -e '/^[[:space:]]*--with-pspell(=[^[:space:]]*)?[[:space:]]*\\?[[:space:]]*$/d' \
    -e '/^[[:space:]]*--with-zlib-dir=[^[:space:]]*[[:space:]]*\\?[[:space:]]*$/d' \
    -e '/^[[:space:]]*--with-kerberos(=[^[:space:]]*)?[[:space:]]*\\?[[:space:]]*$/d' \
    -e '/^[[:space:]]*--with-imap-ssl(=[^[:space:]]*)?[[:space:]]*\\?[[:space:]]*$/d' \
    -e '/^[[:space:]]*--with-imap(=[^[:space:]]*)?[[:space:]]*\\?[[:space:]]*$/d' \
    -e '/^[[:space:]]*--enable-opcache[[:space:]]*\\?[[:space:]]*$/d' \
    -e 's/[[:space:]]--with-pspell(=[^[:space:]]*)?//g' \
    -e 's/[[:space:]]--with-zlib-dir=[^[:space:]]*//g' \
    -e 's/[[:space:]]--with-kerberos(=[^[:space:]]*)?//g' \
    -e 's/[[:space:]]--with-imap-ssl(=[^[:space:]]*)?//g' \
    -e 's/[[:space:]]--with-imap(=[^[:space:]]*)?//g' \
    -e 's/[[:space:]]--enable-opcache//g' \
    "${CONFBASE}/php${PHPMAJOR}.conf"

# IMPORTANT: LDFLAGS + PKG_CONFIG_PATH already exported
bash "${CONFBASE}/php${PHPMAJOR}.conf"

# --- Compiling ---
if command -v nproc >/dev/null 2>&1; then
    make -j"$(nproc)"
else
    make
fi

make install

# --- PHP.ini + FPM scaffolding ---
mkdir -p "${FPMDIR}/usr/php/php.d"
mkdir -p "${FPMDIR}/usr/var/sockets"
mkdir -p "${FPMDIR}/usr/etc/php-fpm.d"
mkdir -p "${FPMDIR}/usr/etc/php-fpm.d/users"

rsync php.ini-production "${FPMDIR}/usr/php/php.ini"

sed -i 's/^short_open_tag.*/short_open_tag = On/' "${FPMDIR}/usr/php/php.ini"
sed -i 's/^;cgi.fix_pathinfo=.*/cgi.fix_pathinfo=1/' "${FPMDIR}/usr/php/php.ini"
sed -i 's/.*mail.add_x_header.*/mail.add_x_header = On/' "${FPMDIR}/usr/php/php.ini"
sed -i 's@.*mail.log.*@mail.log = /usr/local/apache/logs/phpmail.log@' "${FPMDIR}/usr/php/php.ini"

echo "include=${FPMDIR}/usr/etc/php-fpm.d/users/*.conf" > "${FPMDIR}/usr/etc/php-fpm.d/users.conf"
echo "include=${FPMDIR}/usr/etc/php-fpm.d/*.conf" > "${FPMDIR}/usr/etc/php-fpm.conf"

cat > "${FPMDIR}/usr/etc/php-fpm.d/cwpsvc.conf" <<EOF
[cwpsvc]
listen = ${FPMDIR}/usr/var/sockets/cwpsvc.sock
listen.owner = cwpsvc
listen.group = cwpsvc
listen.mode = 0640
user = cwpsvc
group = cwpsvc
pm = ondemand
pm.max_children = 25
pm.process_idle_timeout = 15s
request_terminate_timeout = 0
EOF

# --- Systemd service ---
cp sapi/fpm/php-fpm.service "/usr/lib/systemd/system/php-fpm${PHPMAJOR}.service"
sed -i "s|\${exec_prefix}|${FPMDIR}/usr|g" "/usr/lib/systemd/system/php-fpm${PHPMAJOR}.service"
sed -i "s|\${prefix}|${FPMDIR}/usr|g" "/usr/lib/systemd/system/php-fpm${PHPMAJOR}.service"

systemctl daemon-reload
systemctl enable "php-fpm${PHPMAJOR}"

# --- Loading Apache FPM module if not already present ---
if [ ! -e "/usr/local/apache/conf.d/php-fpm.conf" ]; then
cat > /usr/local/apache/conf.d/php-fpm.conf <<EOF
<IfModule !proxy_fcgi_module>
    LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
</IfModule>
EOF
fi

# --- External modules (imagick, redis, imap, etc.) ---
if [ -e "${CONFBASE}/php${PHPMAJOR}_external.conf" ]; then
    bash "${CONFBASE}/php${PHPMAJOR}_external.conf" || true
fi

# These extensions are unbundled from PHP 8.5 and may be absent from stale
# CWP-generated external configs.
for late_module in imap7.sh pspell.sh; do
    late_script="/usr/local/cwpsrv/htdocs/resources/conf/el9/php-fpm_selector/external_modules/8.5/${late_module}"
    if [ -x "${late_script}" ]; then
        bash "${late_script}" || true
    fi
done

# --- Monit integration for custom PHP-FPM ---
MONIT_CONF_DIR="/etc/monit.d"
MONIT_CONF_FILE="${MONIT_CONF_DIR}/php-fpm${PHPMAJOR}"
PHPFPM_SERVICE="php-fpm${PHPMAJOR}.service"
PHPFPM_BASE="/opt/alt/php-fpm${PHPMAJOR}"
PHPFPM_CONF="${PHPFPM_BASE}/usr/etc/php-fpm.conf"
PHPFPM_SOCKET="${PHPFPM_BASE}/usr/var/sockets/cwpsvc.sock"
PHPVER_LABEL="${PHPMAJOR:0:1}.${PHPMAJOR:1:1}"

echo ""
echo "===== Monit integration for PHP-FPM ${PHPVER_LABEL} ====="

if ! command -v monit >/dev/null 2>&1; then
    echo "Monit is not installed. Installing..."
    dnf -y install monit
fi

mkdir -p "${MONIT_CONF_DIR}"

cat > "${MONIT_CONF_FILE}" <<EOF
# PHP-FPM ${PHPVER_LABEL} - CWP alt-php custom build
check process php-fpm${PHPMAJOR} matching ".*/opt/alt/php-fpm${PHPMAJOR}/usr/etc/php-fpm.conf.*"
        start program "/usr/bin/systemctl start ${PHPFPM_SERVICE}"
        stop program "/usr/bin/systemctl stop ${PHPFPM_SERVICE}"
        if failed unixsocket ${PHPFPM_SOCKET} then restart
        if cpu > 95% for 12 cycles then restart
        if 4 restarts within 8 cycles then timeout
EOF

chmod 0644 "${MONIT_CONF_FILE}"

if [ ! -f "${PHPFPM_CONF}" ]; then
    echo "WARNING: PHP-FPM config not found yet: ${PHPFPM_CONF}"
fi

systemctl enable "${PHPFPM_SERVICE}" >/dev/null 2>&1 || true
systemctl enable monit >/dev/null 2>&1 || true

if systemctl is-active --quiet "${PHPFPM_SERVICE}"; then
    echo "PHP-FPM service is active: ${PHPFPM_SERVICE}"
else
    echo "PHP-FPM service is not active yet; trying to start it..."
    systemctl start "${PHPFPM_SERVICE}" || true
fi

systemctl restart monit || true

if command -v monit >/dev/null 2>&1; then
    monit reload || true
    monit validate || true
fi

echo "Monit config installed: ${MONIT_CONF_FILE}"
echo "===== Monit integration completed ====="

systemctl restart "php-fpm${PHPMAJOR}"

# --- CSF pignore ---
if [ -e "/etc/csf/csf.pignore" ]; then

    # PHP-FPM + PHP binary
    if ! grep -q "${FPMDIR}/usr/sbin/php-fpm" /etc/csf/csf.pignore; then
        echo "exe:${FPMDIR}/usr/sbin/php-fpm" >> /etc/csf/csf.pignore
    fi

    if ! grep -q "${FPMDIR}/usr/bin/php" /etc/csf/csf.pignore; then
        echo "exe:${FPMDIR}/usr/bin/php" >> /etc/csf/csf.pignore
    fi

    # memcached daemon
    if command -v memcached >/dev/null 2>&1; then
        if ! grep -q "exe:/usr/bin/memcached" /etc/csf/csf.pignore; then
            echo "exe:/usr/bin/memcached" >> /etc/csf/csf.pignore
        fi
    fi

    # redis-server daemon
    if command -v redis-server >/dev/null 2>&1; then
        if ! grep -q "exe:/usr/bin/redis-server" /etc/csf/csf.pignore; then
            echo "exe:/usr/bin/redis-server" >> /etc/csf/csf.pignore
        fi
    fi

    # Restart CSF/LFD to apply changes
    csf -r
fi

rm -rf /usr/local/src/php-build
rm -rf /usr/local/src/build-dir

echo "PHP ${PHPVER} (php-fpm${PHPMAJOR}) build finished successfully."

You can use it.

Critical part:

/usr/local/cwpsrv/htdocs/resources/conf/el9/php-fpm_selector/pre_run/8.5/imap7.sh

The working script is:

#!/bin/bash
set -euo pipefail

echo ""
echo "===== PHP-FPM 8.5 IMAP setup ====="

PHPFPM="/opt/alt/php-fpm85"
PHPBIN="${PHPFPM}/usr/bin/php"
PHPCONFIG="${PHPFPM}/usr/bin/php-config"
PHPIZE="${PHPFPM}/usr/bin/phpize"
PHPINIDIR="${PHPFPM}/usr/php/php.d"
IMAP_VERSION="1.0.3"

echo "Installing IMAP build dependencies..."
dnf -y install uw-imap-devel krb5-devel openssl-devel pkgconf make gcc autoconf

if [ ! -x "${PHPCONFIG}" ] || [ ! -x "${PHPIZE}" ]; then
    echo "PHP-FPM 8.5 is not built yet. Dependencies are installed; run this script again after PHP 8.5 is installed to build PECL imap."
    exit 0
fi

if "${PHPBIN}" -m 2>/dev/null | grep -qi '^imap$'; then
    echo "IMAP extension is already loaded for PHP-FPM 8.5."
    exit 0
fi

mkdir -p "${PHPINIDIR}"

cd /usr/local/src
rm -rf "imap-${IMAP_VERSION}" imap.tgz

echo "Downloading PECL imap-${IMAP_VERSION}..."
curl -fL "https://pecl.php.net/get/imap-${IMAP_VERSION}.tgz" -o imap.tgz

tar -xzf imap.tgz
cd "imap-${IMAP_VERSION}"

echo "Running phpize..."
"${PHPIZE}"

echo "Configuring IMAP extension..."
./configure \
    --with-php-config="${PHPCONFIG}" \
    --with-libdir=lib64 \
    --with-imap=/usr \
    --with-imap-ssl \
    --with-kerberos

echo "Building IMAP extension..."
make -j"$(nproc)"
make install

PHPEXTDIR="$("${PHPCONFIG}" --extension-dir)"

if [ ! -f "${PHPEXTDIR}/imap.so" ]; then
    echo "ERROR: imap.so was not installed to ${PHPEXTDIR}"
    exit 1
fi

echo "extension=imap.so" > "${PHPINIDIR}/imap.ini"

if "${PHPBIN}" -m 2>/dev/null | grep -qi '^imap$'; then
    echo "IMAP extension installed and enabled for PHP-FPM 8.5."
else
    echo "ERROR: imap.ini was created, but PHP does not load the IMAP extension."
    "${PHPBIN}" -d display_errors=1 -m
    exit 1
fi

if command -v systemctl >/dev/null 2>&1; then
    systemctl restart php-fpm85 || true
fi

echo "===== PHP-FPM 8.5 IMAP setup completed ====="

These are designed to supplement the CWP UI until the system PHP 8.4, 8.5 scripts arrive.

@Sandeep B. Hello, This is a PHP 5.6 FPM script for El9 AlmaLinux 9 environment:

#!/bin/bash

# Usage: bash /root/build-php-fpm56-el9.sh 2>&1 | tee /root/php56-build.log
# External modules:
# /usr/local/cwpsrv/htdocs/resources/conf/el9/php-fpm_selector/external_modules/5.6
set -euo pipefail
set -x

# --- Basic variables ---
PHPMAJOR="56"                  # php-fpm56
PHPVER="5.6.40"                # PHP version
FPMDIR="/opt/alt/php-fpm${PHPMAJOR}"
CONFBASE="/usr/local/cwp/.conf/php-fpm_conf"
SELECTOR_BASE="/usr/local/cwpsrv/htdocs/resources/conf/el9/php-fpm_selector"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LOCAL_CONFBASE="${SCRIPT_DIR}/conf"
PRE_RUN_BASE="${SELECTOR_BASE}/pre_run/5.6"
EXT_BASE="${SELECTOR_BASE}/external_modules/5.6"
OPENSSL_HACK_DIR="/usr/local/ssls"
CURL_HACK_DIR="/usr/local/curls"
IMAP_HACK_DIR="/usr/local/imap-2007f"

arch=$(uname -m)
if [[ "$arch" == "x86_64" ]]; then
    platform="x86-64"
    libdir="/usr/lib64"
else
    platform="x86"
    libdir="/usr/lib"
fi

run_if_exists() {
    local script="$1"

    if [ -f "$script" ]; then
        bash "$script" || true
    fi
}

resolve_conf_file() {
    local name="$1"
    local primary="${CONFBASE}/${name}"
    local fallback="${LOCAL_CONFBASE}/${name}"

    if [ -f "$primary" ]; then
        echo "$primary"
        return 0
    fi

    if [ -f "$fallback" ]; then
        echo "$fallback"
        return 0
    fi

    return 1
}

ensure_executable_config() {
    local config_file="$1"

    if [ -e "$config_file" ] && [ ! -x "$config_file" ]; then
        chmod +x "$config_file" 2>/dev/null || true
    fi
}

prepare_config_file() {
    local config_file="$1"
    local normalized_file="$2"

    cp "$config_file" "$normalized_file"

    # The generated 5.6 selector config can contain a malformed IMAP option
    # string. Normalize it before invoking configure so bash passes both flags
    # as separate arguments.
    sed -i \
        -e "s|--with-imap=/usr/local/imap-2007f' '--with-imap-ssl=/usr/local/ssls|--with-imap=/usr/local/imap-2007f --with-imap-ssl=/usr/local/ssls|g" \
        -e 's/ --enable-intl//g' \
        -e 's/ --with-icu-dir=\/usr//g' \
        "$normalized_file"

    chmod +x "$normalized_file" 2>/dev/null || true
}

ensure_imap_hack_layout() {
    mkdir -p "${IMAP_HACK_DIR}/include" "${IMAP_HACK_DIR}/lib" "${IMAP_HACK_DIR}/lib64" "${IMAP_HACK_DIR}/c-client"

    if [ -d "/usr/include/imap" ] && [ ! -e "${IMAP_HACK_DIR}/include/imap" ]; then
        ln -sfn /usr/include/imap "${IMAP_HACK_DIR}/include/imap"
    fi

    if [ -e "/usr/lib64/libc-client.so" ]; then
        ln -sfn /usr/lib64/libc-client.so "${IMAP_HACK_DIR}/lib64/libc-client.so"
    fi

    if [ -e "/usr/lib64/libc-client.a" ]; then
        ln -sfn /usr/lib64/libc-client.a "${IMAP_HACK_DIR}/lib64/libc-client.a"
    fi

    if [ -e "/usr/lib/libc-client.so" ]; then
        ln -sfn /usr/lib/libc-client.so "${IMAP_HACK_DIR}/lib/libc-client.so"
    fi

    if [ -e "/usr/lib/libc-client.a" ]; then
        ln -sfn /usr/lib/libc-client.a "${IMAP_HACK_DIR}/lib/libc-client.a"
    fi
}

CONFIG_FILE_TEMPLATE=""
ENABLE_IMAP=0

# --- Packages for Build (EL9) ---
dnf -y install \
  autoconf automake bison gcc gcc-c++ make pkgconf-pkg-config re2c \
  krb5-devel glibc-common gnutls-devel \
  libxml2-devel libxslt-devel libicu-devel \
  libjpeg-turbo-devel freetype-devel libpng-devel libXpm-devel \
  libzip libzip-devel \
  libbsd-devel \
  libtidy-devel aspell aspell-devel \
  perl \
  uw-imap-devel \
  openldap-devel \
  bzip2-devel gettext-devel gmp-devel \
  openssl-devel

# PHP 5.6 on EL9 must use the old CWP OpenSSL 1.x hack.
if [ -d /usr/local/opensslso ]; then
    echo "WARN: /usr/local/opensslso exists, but PHP 5.6.40 must be built against /usr/local/ssls."
fi

# --- Prepare old CWP 1.x dependencies ---
run_if_exists "${PRE_RUN_BASE}/dep.sh"
run_if_exists "${PRE_RUN_BASE}/ldap.sh"
run_if_exists "${PRE_RUN_BASE}/firebird.sh"

if ! CONFIG_FILE_TEMPLATE="$(resolve_conf_file "php${PHPMAJOR}.conf")"; then
    echo "ERROR: php${PHPMAJOR}.conf not found in ${CONFBASE} or ${LOCAL_CONFBASE}"
    exit 1
fi

if grep -q -- '--with-imap' "${CONFIG_FILE_TEMPLATE}"; then
    ENABLE_IMAP=1
    run_if_exists "${PRE_RUN_BASE}/imap.sh"
fi

if [ ! -d "${OPENSSL_HACK_DIR}" ]; then
    echo "ERROR: ${OPENSSL_HACK_DIR} is missing. Run the selector pre-run dependency step first."
    exit 1
fi

if [ ! -d "${CURL_HACK_DIR}" ]; then
    echo "ERROR: ${CURL_HACK_DIR} is missing. Run the selector pre-run dependency step first."
    exit 1
fi

export PKG_CONFIG_PATH="${OPENSSL_HACK_DIR}/lib/pkgconfig:${OPENSSL_HACK_DIR}/lib64/pkgconfig:${CURL_HACK_DIR}/lib/pkgconfig:${CURL_HACK_DIR}/lib64/pkgconfig:/usr/lib64/pkgconfig"
export CPPFLAGS="-I${OPENSSL_HACK_DIR}/include -I${CURL_HACK_DIR}/include"
export CFLAGS="${CFLAGS:-} -fcommon"
export LDFLAGS="-L${OPENSSL_HACK_DIR}/lib -L${OPENSSL_HACK_DIR}/lib64 -L${CURL_HACK_DIR}/lib -L${CURL_HACK_DIR}/lib64"
export LIBRARY_PATH="${OPENSSL_HACK_DIR}/lib:${OPENSSL_HACK_DIR}/lib64:${CURL_HACK_DIR}/lib:${CURL_HACK_DIR}/lib64"
export LD_LIBRARY_PATH="${OPENSSL_HACK_DIR}/lib:${OPENSSL_HACK_DIR}/lib64:${CURL_HACK_DIR}/lib:${CURL_HACK_DIR}/lib64:${LD_LIBRARY_PATH:-}"
export OPENSSL_CFLAGS="-I${OPENSSL_HACK_DIR}/include"
export OPENSSL_LIBS="-L${OPENSSL_HACK_DIR}/lib -L${OPENSSL_HACK_DIR}/lib64 -lssl -lcrypto"

if [ "${ENABLE_IMAP}" -eq 1 ]; then
    ensure_imap_hack_layout
    export CPPFLAGS="${CPPFLAGS} -I${IMAP_HACK_DIR}/include -I${IMAP_HACK_DIR}/include/imap -I${IMAP_HACK_DIR}/c-client"
    export LDFLAGS="${LDFLAGS} -L${IMAP_HACK_DIR}/lib -L${IMAP_HACK_DIR}/lib64 -L${IMAP_HACK_DIR}/c-client"
    export LIBRARY_PATH="${LIBRARY_PATH}:${IMAP_HACK_DIR}/lib:${IMAP_HACK_DIR}/lib64:${IMAP_HACK_DIR}/c-client"
    export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${IMAP_HACK_DIR}/lib:${IMAP_HACK_DIR}/lib64:${IMAP_HACK_DIR}/c-client"
fi

echo "INFO: PHP 5.6 intl is disabled on EL9 because ICU 67+ is not compatible with ext/intl from PHP 5.6."

# --- PHP source download: direct official php.net tarball ---
PHPSOURCE="https://www.php.net/distributions/php-${PHPVER}.tar.gz"
echo "Using source: $PHPSOURCE"

# --- Build directory ---
rm -rf /usr/local/src/php-build
mkdir -p /usr/local/src/php-build
cd /usr/local/src/php-build

wget -q "${PHPSOURCE}" -O "php-${PHPVER}.tar.gz"

if ! file "php-${PHPVER}.tar.gz" | grep -qiE "gzip compressed data|tar archive"; then
    echo "ERROR: Downloaded PHP source is not a valid tarball: ${PHPSOURCE}"
    exit 1
fi

tar -xzf "php-${PHPVER}.tar.gz"
cd "php-${PHPVER}"

# --- Configure PHP 5.6.40 for EL9 + old CWP OpenSSL 1.x hack ---
CONFIG_FILE="${CONFIG_FILE_TEMPLATE}"
ensure_executable_config "$CONFIG_FILE"
NORMALIZED_CONFIG_FILE="$(mktemp "/tmp/php${PHPMAJOR}.conf.XXXXXX")"
prepare_config_file "$CONFIG_FILE" "$NORMALIZED_CONFIG_FILE"
bash "$NORMALIZED_CONFIG_FILE"
rm -f "$NORMALIZED_CONFIG_FILE"

# --- Compiling ---
if command -v nproc >/dev/null 2>&1; then
    make -j"$(nproc)"
else
    make
fi

make install

# --- PHP.ini + FPM scaffolding ---
mkdir -p "${FPMDIR}/usr/php/php.d"
mkdir -p "${FPMDIR}/usr/var/sockets"
mkdir -p "${FPMDIR}/usr/etc/php-fpm.d"
mkdir -p "${FPMDIR}/usr/etc/php-fpm.d/users"

rsync php.ini-production "${FPMDIR}/usr/php/php.ini"

sed -i 's/^short_open_tag.*/short_open_tag = On/' "${FPMDIR}/usr/php/php.ini"
sed -i 's/^;cgi.fix_pathinfo=.*/cgi.fix_pathinfo=1/' "${FPMDIR}/usr/php/php.ini"
sed -i 's/.*mail.add_x_header.*/mail.add_x_header = On/' "${FPMDIR}/usr/php/php.ini"
sed -i 's@.*mail.log.*@mail.log = /usr/local/apache/logs/phpmail.log@' "${FPMDIR}/usr/php/php.ini"

echo "include=${FPMDIR}/usr/etc/php-fpm.d/users/*.conf" > "${FPMDIR}/usr/etc/php-fpm.d/users.conf"
echo "include=${FPMDIR}/usr/etc/php-fpm.d/*.conf" > "${FPMDIR}/usr/etc/php-fpm.conf"

cat > "${FPMDIR}/usr/etc/php-fpm.d/cwpsvc.conf" <<EOF
[cwpsvc]
listen = ${FPMDIR}/usr/var/sockets/cwpsvc.sock
listen.owner = cwpsvc
listen.group = cwpsvc
listen.mode = 0640
user = cwpsvc
group = cwpsvc
pm = ondemand
pm.max_children = 25
pm.process_idle_timeout = 15s
request_terminate_timeout = 0
EOF

# --- Systemd service ---
cp sapi/fpm/php-fpm.service "/usr/lib/systemd/system/php-fpm${PHPMAJOR}.service"
sed -i "s|\${exec_prefix}|${FPMDIR}/usr|g" "/usr/lib/systemd/system/php-fpm${PHPMAJOR}.service"
sed -i "s|\${prefix}|${FPMDIR}/usr|g" "/usr/lib/systemd/system/php-fpm${PHPMAJOR}.service"

systemctl daemon-reload
systemctl enable "php-fpm${PHPMAJOR}"

# --- Loading Apache FPM module if not already present ---
if [ ! -e "/usr/local/apache/conf.d/php-fpm.conf" ]; then
cat > /usr/local/apache/conf.d/php-fpm.conf <<EOF
<IfModule !proxy_fcgi_module>
    LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
</IfModule>
EOF
fi

# --- External modules (imagick, redis, imap, etc.) ---
if EXTERNAL_FILE="$(resolve_conf_file "php${PHPMAJOR}_external.conf")"; then
    ensure_executable_config "$EXTERNAL_FILE"
    bash "$EXTERNAL_FILE" || true
else
    for module in \
        imagick.sh \
        ioncube.sh \
        mailparse.sh \
        memcache.sh \
        mongodb.sh \
        opcache.sh \
        redis.sh \
        sourceguardian.sh \
        ssh2.sh \
        xcache.sh \
        yaz.sh \
        zendgl.sh
    do
        run_if_exists "${EXT_BASE}/${module}"
    done
fi

# --- CSF pignore ---
if [ -e "/etc/csf/csf.pignore" ]; then

    if ! grep -q "${FPMDIR}/usr/sbin/php-fpm" /etc/csf/csf.pignore; then
        echo "exe:${FPMDIR}/usr/sbin/php-fpm" >> /etc/csf/csf.pignore
    fi

    if ! grep -q "${FPMDIR}/usr/bin/php" /etc/csf/csf.pignore; then
        echo "exe:${FPMDIR}/usr/bin/php" >> /etc/csf/csf.pignore
    fi

    if command -v memcached >/dev/null 2>&1; then
        if ! grep -q "exe:/usr/bin/memcached" /etc/csf/csf.pignore; then
            echo "exe:/usr/bin/memcached" >> /etc/csf/csf.pignore
        fi
    fi

    if command -v redis-server >/dev/null 2>&1; then
        if ! grep -q "exe:/usr/bin/redis-server" /etc/csf/csf.pignore; then
            echo "exe:/usr/bin/redis-server" >> /etc/csf/csf.pignore
        fi
    fi

    csf -r || true
fi

# --- Monitor integration ---
if [ -d "/etc/monit.d" ]; then
    if [ ! -e "/etc/monit.d/php-fpm${PHPMAJOR}" ]; then
        if [ -e "/usr/local/cwpsrv/htdocs/resources/conf/monit.d/php-fpm${PHPMAJOR}" ]; then
            cp "/usr/local/cwpsrv/htdocs/resources/conf/monit.d/php-fpm${PHPMAJOR}" /etc/monit.d/ 2>/dev/null || true
            monit reload || true
        fi
    fi
fi

rm -rf /usr/local/src/php-build
rm -rf /usr/local/src/build-dir

systemctl restart "php-fpm${PHPMAJOR}"

echo "PHP ${PHPVER} (php-fpm${PHPMAJOR}) build finished successfully."

Sometimes it is necessary for a legacy system to be able to operate temporarily even under AlmaLinux 9.

Create an account or sign in to comment

Account

Navigation

Search

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.