Intern:Hauptseite/Bplaced/PHP-ini-Konfiguration

Aus ArtisanCommerce Dokumentation
Version vom 25. Februar 2026, 21:49 Uhr von Admin (Diskussion | Beiträge)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

PHP-CGI Wrapper & PHP-ini-Konfiguration auf bplaced

Übersicht

Dieses Skript dient als Wrapper für PHP-CGI auf Shared-Hosting-Systemen wie bplaced. Ziele:

  • Automatische PHP-Versionserkennung
  • Dynamische Pfad- und Modulkonfiguration
  • OpenBaseDir-Management
  • Integration von Composer-, Mailparse- und IMAP-Pfaden
  • Logging & Debugging

Aufbau des Wrappers

1. Debug-Flag & Argumente

DEBUG=0
for ARG in "$@"; do
    if [ "$ARG" = "-vv" ]; then
        DEBUG=1
        break
    fi
done
  • Prüft, ob `-vv` übergeben wird, um Debug-Ausgaben zu aktivieren.
  • Fallstrick: Zu viele Debug-Ausgaben können CGI-Output zerstören.

2. System-Pfad Fix

ORIGINAL_PATH="$PATH"
export PATH="/usr/share/7.4/ext/bin:/usr/share/8.2/ext/bin:/usr/share/8.3/ext/bin:$ORIGINAL_PATH"
  • Priorisiert bplaced-spezifische PHP-Binaries.
  • Fallstrick: Fehlende Binaries verhindern Script-Ausführung.

3. Wrapper-Signal

[[ "$DEBUG" -eq 1 ]] && echo "PHPWRAPPER_CALL"
  • Signalisiert den Start des Wrappers bei Debug-Modus.

4. Output-Kontrolle

exec 3>&1 4>&2
  • Speichert stdout & stderr für spätere Wiederherstellung.
  • Fallstrick: Falsches Zurücksetzen unterdrückt Ausgabe.

5. Fehlerbehandlung

handle_error() {
    [[ "$DEBUG" -eq 1 ]] && echo "Error on line $1"
}
trap 'handle_error $LINENO' ERR
  • Fängt Script-Fehler ab.
  • Fallstrick: Subshell-Fehler werden nicht immer erfasst.

6. Laufzeit- & Kontextdaten

datetime=$(date +"%Y-%m-%d %H:%M:%S")
calling_process_info=$(ps -p $$ | tail -n 1)
current_directory=$(pwd)
script_name="$0"
  • Nützliche Metadaten für Logging.

7. User- & Host-Kontext

USERNAME='peterpatoschka'
HOST='server6.bplaced.net'
source /users/_core/${USERNAME}/env
  • Lädt Benutzer-Umgebungsvariablen.
  • Fallstrick: `env` muss lesbar sein.

8. PHP-Versionserkennung

  • Erkennung via `.php-version` oder Verzeichnisregel für Support-Projekte.
  • Fallstrick: Leerzeichen in `.php-version` oder fehlende Datei verhindern korrekte Erkennung.

9. PHP Basis-Konfiguration

export PHP_INI_SCAN_DIR="/users/${USERNAME}/etc/php/${PV}"
export PHPRC="${PHP_INI_SCAN_DIR}/php.ini"
  • Bestimmt benutzerdefinierte PHP-INIs.
  • Fallstrick: Falsche Pfade verhindern Modul-Laden.

10. Pfaddefinitionen

  • BASE_PATH, TEMP_PATH, Composer-Pfade, Vendor-Pfade.
  • Fallstrick: Schreibrechte prüfen.

11. OpenBaseDir

OB="/users/${USERNAME}/:/users/_temp/${USERNAME}:/etc/ssl/certs/:/etc/ca-certificates/"
OB="${OB}:${COMPOSER_CONFIG_PATH}:${COMPOSER_CACHE_PATH}:${COMPOSER_SHARE_PATH}"
OB="${OB}:${DIRTYFIX_PATH}"
  • Limitiert Dateizugriffe auf sichere Pfade.
  • Fallstrick: Fehlerhafte OB-Pfade blockieren Zugriff auf Temp, Composer, SSL.

12. Projekt- / Release-Erkennung

  • Fügt Vendor-Pfade dynamisch zu OB hinzu.
  • Fallstrick: Einzelne Dateien als OB-Pfad können fehlschlagen.

13. PHP-Module

  • IonCube, Mailparse, IMAP werden nur geladen, wenn vorhanden.
  • Fallstrick: Fehlende `.so` Dateien verhindern PHP-Start.

14. PHP-CGI Kommando

CGI=(
    /usr/share/${PV}${PR}/bin/php
    -c /users/${USERNAME}/etc/php/${PV}${PR}/php.ini
    $IC $MP $IMAP
    -d curl.cainfo=/etc/ssl/certs/ca-certificates.crt
    -d memory_limit=${MM:=256}M
    -d open_basedir="${OB}"
    -d upload_tmp_dir="${TEMP_PATH}/"
    -d session.save_path="${TEMP_PATH}/"
)
  • Fallstricke: curl-Zertifikate, Memory-Limit, Schreibrechte beachten.

15. Logging

  • Aufruf wird in zentralem Logfile protokolliert.
  • Fallstrick: Logfile muss beschreibbar sein.

16. Cleanup & Ausführung

  • Temporäre Variablen löschen und PHP-CGI ausführen.

Zusammenfassung Fallstränge

  • OpenBaseDir → Zugriff auf Temp, Composer, SSL
  • PHP-Module → IonCube, Mailparse, IMAP
  • SSL → curl.cainfo
  • Schreibrechte → Temp-Ordner, Logfile
  • PHP-Version → Module/Pfade unterschiedlich
  • Debug/Logging → CGI-Output zerstörbar

Code-Uebersicht

#!/bin/bash
###############################################################################
# PHP CGI WRAPPER
#
# Logik:
# 1. Debug-Modus & Pfad-Initialisierung
# 2. Fehlerbehandlung & Umgebungsvariablen
# 3. Dynamische PHP-Versionserkennung (.php-version oder Projektpfad)
# 4. Konfiguration von PHP_INI_SCAN_DIR & Open_Basedir (OB)
# 5. Modul-Check (IonCube, Mailparse, IMAP)
# 6. Finaler PHP-CGI Call
###############################################################################

# --- 1. DEBUG-FLAG AUS ARGUMENTEN ---
# Prüft, ob -vv übergeben wurde, um zusätzliche Infos auszugeben.
DEBUG=0
for ARG in "$@"; do
    if [ "$ARG" = "-vv" ]; then
        DEBUG=1
        break
    fi
done

# --- 2. SYSTEM PATH FIX ---
# Priorisiert die bplaced-spezifischen Binaries in der PATH-Variable.
ORIGINAL_PATH="$PATH"
export PATH="/usr/share/7.4/ext/bin:/usr/share/8.2/ext/bin:/usr/share/8.3/ext/bin:$ORIGINAL_PATH"

# --- 3. WRAPPER-SIGNAL ---
# Signalisiert den Start des Wrappers bei aktivem Debugging.
[[ "$DEBUG" -eq 1 ]] && echo "PHPWRAPPER_CALL"

# --- 4. OUTPUT-KONTROLLE ---
# Sichert die Standard-Descriptoren für spätere Verwendung.
exec 3>&1 4>&2

# --- 5. FEHLERBEHANDLUNG ---
# Einfacher Trap, um Fehlerzeilen im Debug-Modus auszugeben.
handle_error() {
    [[ "$DEBUG" -eq 1 ]] && echo "Error on line $1"
}
trap 'handle_error $LINENO' ERR

# --- 6. LAUFZEIT- & KONTEXTDATEN ---
datetime=$(date +"%Y-%m-%d %H:%M:%S")
calling_process_info=$(ps -p $$ | tail -n 1)
current_directory=$(pwd)
script_name="$0"

# --- 7. USER- & HOST-KONTEXT ---
USERNAME='peterpatoschka'
HOST='server6.bplaced.net'
source /users/_core/${USERNAME}/env

# --- 8. PHP-VERSION ERKENNUNG ---
# Ermittelt die PHP-Version basierend auf Verzeichnissen oder .php-version Dateien.
PV="7.4" # Initialer Default

detect_php_version_file() {
    local dir="$current_directory"
    local BASE_PATH_LOCAL="/users/${USERNAME}/www"

    # Sonderregel für Support-Projekt
    if [[ "$dir" == "$BASE_PATH_LOCAL/support"* ]]; then
        PV="8.3"
        [[ "$DEBUG" -eq 1 ]] && echo "Forced PHP 8.3 for support project"
        return
    fi

    # Rekursive Suche nach .php-version Datei nach oben bis zum Root
    while [[ "$dir" != "/" && "$dir" == "$BASE_PATH_LOCAL"* ]]; do
        if [[ -f "$dir/.php-version" ]]; then
            local version
            version=$(tr -d '[:space:]' < "$dir/.php-version")
            if [[ "$version" =~ ^8\.[2-3]$ ]]; then
                PV="$version"
                return
            fi
        fi
        dir=$(dirname "$dir")
    done
}
detect_php_version_file

# Wenn PHP 8.x genutzt wird, erzwinge /ext Variante
if [[ "$PV" =~ ^8\. ]]; then
    PR="/ext"
fi

# --- 9. PHP BASIS KONFIGURATION ---
# Setzt die Pfade für die INI-Dateien basierend auf der erkannten Version.
export PHP_INI_SCAN_DIR="/users/${USERNAME}/etc/php/${PV}"
export PHPRC="${PHP_INI_SCAN_DIR}/php.ini"

# --- 10. PFADDEFINITIONEN ---
BASE_PATH="/users/${USERNAME}/www"
TEMP_PATH="/users/_temp/${USERNAME}"

COMPOSER_CONFIG_PATH="/users/${USERNAME}/.config/composer/"
COMPOSER_CACHE_PATH="/users/${USERNAME}/.cache/composer/"
COMPOSER_SHARE_PATH="/users/${USERNAME}/.local/share/composer/"

PHP_BASE_PATH="/usr/share/7.4/ext/bin/php"
DIRTYFIX_PATH="/users/${USERNAME}/www/shopwareshow/release/vendor/"

# --- 11. OPEN_BASEDIR (OB) - BASIS ---
PHP_CONFIG_PATH="/users/${USERNAME}/etc/php/"

# Grundberechtigung für User, Temp und SSL-Zertifikate
OB="/users/${USERNAME}/:/users/_temp/${USERNAME}:/etc/ssl/certs/:/etc/ca-certificates/"

# Composer-Pfade hinzufügen
OB="${OB}:${COMPOSER_CONFIG_PATH}:${COMPOSER_CACHE_PATH}:${COMPOSER_SHARE_PATH}"

# DIRTYFIX hinzufügen
OB="${OB}:${DIRTYFIX_PATH}"

# --- 12. PROJEKT / RELEASE ERKENNUNG (OB ERWEITERUNG) ---
# Durchsucht www-Verzeichnis nach Projekten und deren Releases (für Vendor-Zugriff).
PROJECT_PATHS=()
for dir in "${BASE_PATH}"/*; do
    [[ -d "$dir" ]] && PROJECT_PATHS+=("$dir")
done

RELEASE_PATHS=()
for PROJECT_PATH in "${PROJECT_PATHS[@]}"; do
    if [[ -d "${PROJECT_PATH}/app/releases" ]]; then
        for dir in "${PROJECT_PATH}/app/releases/"*; do
            [[ -d "$dir" ]] && RELEASE_PATHS+=("$dir")
        done
    fi
done

for RELEASE_PATH in "${RELEASE_PATHS[@]}"; do
    OB="${OB}:${RELEASE_PATH}/vendor/"
    OB="${OB}:${RELEASE_PATH}/vendor/autoload.php"
done

[[ "$DEBUG" -eq 1 ]] && echo "Generated OB: \"$OB\""

# --- 13. HTTP-/CGI-VARIABLEN INITIALISIERUNG ---
IC=''   # IonCube
MP=''   # Mailparse
IMAP='' # IMAP

# --- 14. PHP MODUL LOGIK (IONCUBE) ---
[[ "$HTTP_IC" == "1" ]] && IC="-d zend_extension=/etc/bplaced/php/${PV}/ioncube_loader_lin_${PV}.so"

# --- 15. PHP MODUL LOGIK (MAILPARSE - NUR PHP 8.3) ---
MAILPARSE_SO="/etc/bplaced/php/8.3/mailparse.so"
if [[ "$PV" == "8.3" && -f "$MAILPARSE_SO" ]]; then
    MP="-d extension=${MAILPARSE_SO}"
    [[ "$DEBUG" -eq 1 ]] && echo "Loaded mailparse for PHP 8.3"
fi

# --- 16. PHP MODUL LOGIK (IMAP - NUR PHP 8.3) ---
IMAP_SO="/etc/bplaced/php/8.3/imap.so"
if [[ "$PV" == "8.3" && -f "$IMAP_SO" ]]; then
    IMAP="-d extension=${IMAP_SO}"
    [[ "$DEBUG" -eq 1 ]] && echo "Loaded IMAP for PHP 8.3"
fi

# --- 17. PHP CGI KOMMANDO DEFINITION ---
CGI=(
    /usr/share/${PV}${PR}/bin/php
    -c /users/${USERNAME}/etc/php/${PV}${PR}/php.ini
    $IC
    $MP
    $IMAP
    -d curl.cainfo=/etc/ssl/certs/ca-certificates.crt
    -d memory_limit=${MM:=256}M
    -d max_execution_time=${ET:=480}
    -d open_basedir="${OB}"
    -d upload_tmp_dir="${TEMP_PATH}/"
    -d session.save_path="${TEMP_PATH}/"
    -d soap.wsdl_cache_dir="${TEMP_PATH}/"
    -d sys_temp_dir="${TEMP_PATH}/"
    -d sendmail_path="/usr/bin/msmtp -t -i --from='${USERNAME}@${HOST}'"
)

# --- 18. LOGGING ---
# Schreibt den Aufruf in das zentrale Logfile des Users.
echo -e "${datetime}\t${calling_process_info}, ${current_directory}, ${script_name}, ${PV}" \
    >> "/users/${USERNAME}/php_access_logfile"

# --- 19. CLEANUP ---
# Entfernt genutzte Variablen aus der Umgebung vor dem exec.
unset HTTP_ET HTTP_IC HTTP_MM HTTP_PV HTTP_PR HTTP_SA
unset ET IC MM PR SA MP IMAP

# --- 20. OUTPUT WIEDER AKTIVIEREN ---
exec >&3 2>&4
exec 3>&- 4>&-

# --- 21. PHP AUSFÜHREN ---
# Finaler Aufruf der PHP-Binary mit allen Argumenten.
[[ "$DEBUG" -eq 1 ]] && echo "${CGI[@]}"

exec "${CGI[@]}" "$@"