Intern:Hauptseite/Bplaced/PHP-ini-Konfiguration
Aus ArtisanCommerce Dokumentation
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[@]}" "$@"
