
Warum die üblichen php.ini-Anleitungen für WordPress-, Shop- und CMS-Nutzer im Shared Hosting oft nicht funktionieren
Für viele Website-Betreiber beginnt das Thema nicht in der Serververwaltung, sondern in einem Moment, in dem plötzlich etwas nicht mehr funktioniert: Ein WordPress-Update läuft ins Leere, ein Backup-Plugin bricht ab, ein Seitenimport endet mit einer Fehlermeldung, das Backend wird weiß oder es erscheint der Hinweis, dass die erlaubte Speichergröße überschritten wurde.
Gerade WordPress-, Shop- und CMS-Nutzer kommen mit Begriffen wie memory_limit, php.ini, .htaccess oder .user.ini oft genau dann zum ersten Mal in Berührung, wenn sie unter Zeitdruck nach einer Lösung suchen. Und fast immer stoßen sie dann auf denselben Standardtipp: php.ini öffnen, memory_limit erhöhen, fertig. Das ist technisch nicht falsch. Es ist nur in vielen Hosting-Realitäten zu grob.
TL;DR: Die Lösung in Kürze
- Einfach das kostenfreie PHP-Config-Check-Tool nutzen, um zu erfahren, ob die .user.ini oder die .htaccess erstellt bzw. angepasst werden muss
- Zuerst im Hosting-Kundenbereich nachsehen, ob es dort eine Einstellung wie „PHP Memory Limit“, „PHP-Einstellungen“ oder „PHP-Optionen“ gibt.
- Falls der Hoster eine .user.ini unterstützt, diese Datei anlegen oder bearbeiten und dort zum Beispiel memory_limit = 512M eintragen.
- Ein guter Indikator für .user.ini ist phpinfo(): Steht dort bei user_ini.filename der Wert .user.ini, kann diese Datei grundsätzlich verwendet werden.
- Falls der Hoster stattdessen .htaccess nutzt, dort zum Beispiel php_value memory_limit 512M eintragen.
- Ein guter Indikator für .htaccess ist phpinfo(): Steht dort bei Server API meist apache2handler, ist .htaccess eher relevant als .user.ini.
- Bei WordPress zusätzlich in der wp-config.php einen höheren Wert setzen, zum Beispiel define( ‚WP_MEMORY_LIMIT‘, ‚512M‘ );.
- Wichtig: Die WordPress-Einstellung hilft nur innerhalb der Grenzen, die der Server oder Hoster erlaubt.
- Wenn sich trotz Änderung nichts ändert, liegt die wirksame Grenze sehr wahrscheinlich beim Hoster und muss dort angehoben werden.
Inhalt
- Warum das Thema gerade bei WordPress so oft zum ersten Mal auftaucht
- Der Punkt, an dem viele Anleitungen zu kurz greifen
- Wie individuelle PHP-Werte im Shared Hosting tatsächlich entstehen können
- Was php.ini, .user.ini und .htaccess in der Praxis wirklich bedeuten
- Die schnellsten Praxiswege für Nutzer
- Warum manche Einstellungen leicht anpassbar sind und andere praktisch gesperrt bleiben
- Warum eine selbst angelegte php.ini im Webspace oft wirkungslos bleibt
- Die drei Wege, die für Kunden im Shared Hosting meistens wirklich relevant sind
- Was WordPress-Nutzer zusätzlich im Blick behalten sollten
- Kostenfreies Tool nutzen: PHP-Konfigurations-Diagnose
Warum das Thema gerade bei WordPress so oft zum ersten Mal auftaucht
WordPress macht das Problem besonders sichtbar, weil speicherintensive Vorgänge im Alltag sehr häufig sind: Plugin-Updates, Theme-Installationen, Bildverarbeitung, XML-Importe, Backups, Suchindizierung, WooCommerce-Prozesse oder auch nur ein unglücklicher Mix aus Plugins und Theme können den verfügbaren PHP-Speicher schnell an die Grenze bringen. WordPress kennt zwar eigene Konstanten wie WP_MEMORY_LIMIT und WP_MAX_MEMORY_LIMIT, mit denen zusätzlicher Speicher angefordert werden kann. Aber diese Werte heben keine vom Server gesetzte Obergrenze magisch auf. WordPress kann nur im Rahmen dessen arbeiten, was die zugrunde liegende PHP-Umgebung erlaubt. Wenn der Hoster den Speicher auf einer bestimmten Ebene fest begrenzt, bleibt WordPress daran gebunden.
Genau deshalb erleben viele Nutzer dieselbe irritierende Situation: In der wp-config.php wurde ein höherer Wert gesetzt, in irgendeiner Anleitung stand etwas von php.ini, vielleicht wurde sogar eine Datei im Webspace angelegt — und trotzdem bleibt die Fehlermeldung bestehen. Das ist kein Widerspruch. Es zeigt nur, dass in dieser Hosting-Umgebung nicht die bearbeitete Datei, sondern eine andere Konfigurationsebene entscheidet.
Der Punkt, an dem viele Anleitungen zu kurz greifen
Der entscheidende Denkfehler lautet meist: Wenn für meine Website ein Wert wie 512 MB oder 1 GB gilt, dann muss es doch irgendwo eine eigene php.ini für meinen Account geben, die ich direkt ändern kann. Das klingt logisch, ist aber nicht zwingend so. In PHP gibt es einen wichtigen Unterschied zwischen einer eigenen, physischen Konfigurationsdatei und einem eigenen, wirksamen Konfigurationswert. Eine Website kann einen individuellen effektiven Wert für memory_limithaben, ohne dass der Kunde die zentrale php.ini selbst besitzt oder direkt editiert.
Mit anderen Worten: Ja, ein Kunde kann auf demselben Server 512 MB sehen, während ein anderer Kunde 1 GB zur Verfügung hat. Daraus folgt aber nicht automatisch, dass beide eine frei bearbeitbare Haupt-php.ini im Webspace besitzen. Es bedeutet nur, dass der Anbieter für verschiedene Kunden oder Websites unterschiedliche wirksame Einstellungen bereitstellt. Diese Unterschiede können aus mehreren Schichten zusammengesetzt sein: einer globalen Serverkonfiguration, zusätzlichen Pool- oder Website-spezifischen Overrides, panelgesteuerten Einstellungen und lokal erlaubten Verzeichnis-Konfigurationen.
Die zentrale php.ini ist die Basis. Sie liefert den globalen Standard. Darüber hinaus können Anbieter aber auf verschiedenen Ebenen abweichende Werte setzen. Gerade mit PHP-FPM ist es üblich, unterschiedliche Pools oder Website-Kontexte mit eigenen Vorgaben zu betreiben. Zusätzlich lassen sich Werte serverseitig über Webserver- oder FPM-Parameter überschreiben. Und schließlich gibt es, je nach Anbindung, noch lokale Mechanismen wie .user.ini oder .htaccess, die bestimmte Einstellungen pro Verzeichnis verändern können. Das Ergebnis ist eine individuell wirkende PHP-Konfiguration, obwohl die eigentliche Hauptkonfiguration trotzdem zentral vom Hoster verwaltet wird.
So lässt sich die Konfigurationslogik am besten verstehen
| Ebene | Was dort passiert | Wer sie typischerweise kontrolliert |
|---|---|---|
| Zentrale PHP-Basis | allgemeine Standardwerte für den Server | Hoster oder Administrator |
| Website-, Pool- oder VHost-Overrides | abweichende Limits für einzelne Kunden, Domains oder Anwendungen | Hoster, Panel oder Serververwaltung |
| Lokale Verzeichnis-Konfiguration | zusätzliche Feinsteuerung innerhalb einer Website | Kunde, sofern erlaubt |
| Anwendungsebene | z. B. WordPress fordert mehr Speicher an | CMS oder Website-Code, aber nur innerhalb der erlaubten Grenzen |
Diese gestapelte Logik erklärt, warum zwei Kunden auf demselben Server unterschiedliche effektive Werte sehen können, obwohl nicht beide Zugriff auf dieselbe Art von Konfigurationsdatei haben.
Was php.ini, .user.ini und .htaccess in der Praxis wirklich bedeuten
Die berühmte php.ini ist die zentrale PHP-Hauptkonfiguration. Auf einem eigenen Server ist sie der natürliche Ort für globale Änderungen. Im Shared Hosting ist sie dagegen häufig nicht frei zugänglich oder nicht die Datei, die der Kunde direkt bearbeiten darf. .user.ini ist ein Mechanismus, mit dem PHP bei CGI- oder FastCGI-/FPM-Umgebungen bestimmte Einstellungen pro Verzeichnis verarbeiten kann. .htaccess wiederum ist in Apache-Umgebungen ein Mechanismus für lokale Webserver- und teilweise auch PHP-bezogene Overrides — allerdings nur dann, wenn Apache dieses Modell überhaupt erlaubt.
Welche Methode in welchem Setup typischerweise relevant ist
| Umgebung | Was meistens zählt |
|---|---|
| Eigener Server oder Root-Hosting | direkte Änderung in der geladenen php.ini |
| Shared Hosting mit PHP-FPM oder FastCGI | .user.ini, Hosting-Panel oder hosterseitige Pool-Konfiguration |
| Apache mit PHP als Modul | .htaccess oder Hosting-Panel |
| Nginx-basiertes Shared Hosting | meist Panel oder .user.ini, nicht .htaccess |
Diese Unterscheidung ist wichtig, weil es eben nicht genügt, nur die richtige Direktive zu kennen. Entscheidend ist immer auch, an welcher Stelle das jeweilige Hosting-Setup sie überhaupt akzeptiert.
Die schnellsten Praxiswege für Nutzer
Weil viele Betroffene nicht erst tief in Serverarchitektur einsteigen wollen, hilft eine einfache Reihenfolge. Wer ein Speicherlimit erhöhen will, fährt in der Praxis meist mit dieser Abfolge am besten:
- Zuerst das Hosting-Panel prüfen.
Gibt es dort Einstellungen wie „PHP Memory Limit“, „PHP-Einstellungen“, „PHP-Optionen“ oder „Select PHP Version“, ist das meistens der richtige Einstieg. - Dann die PHP-Anbindung klären.
Läuft die Website mit PHP-FPM oder FastCGI, ist.user.inioft relevant. Läuft PHP als Apache-Modul, kommt eher.htaccessinfrage. - WordPress nur ergänzend konfigurieren.
WP_MEMORY_LIMITinwp-config.phpkann sinnvoll sein, ersetzt aber keine serverseitige Erhöhung. - Wenn alles wirkungslos bleibt: Hoster kontaktieren.
Dann liegt die Grenze sehr wahrscheinlich oberhalb dessen, was im Webspace selbst verändert werden darf.
Typische Schnelllösungen
| Situation | Typischer Ansatz |
|---|---|
| Hosting-Panel vorhanden | dort memory_limit erhöhen |
| PHP-FPM / FastCGI | .user.ini mit memory_limit = 512M |
| Apache + mod_php | .htaccess mit php_value memory_limit 512M |
| WordPress verlangt mehr Speicher | zusätzlich WP_MEMORY_LIMIT setzen |
| Änderung greift nicht | Hoster-Support oder Serverlimit prüfen |
Warum manche Einstellungen leicht anpassbar sind und andere praktisch gesperrt bleiben
PHP unterscheidet intern, wie frei eine Einstellung verändert werden darf. Für normale Nutzer muss man sich die kryptischen Kürzel dahinter nicht merken, aber die Grundidee ist wichtig: Manche Werte sind relativ flexibel und dürfen je nach Setup auf mehreren Ebenen gesetzt werden. Andere dürfen nur pro Verzeichnis oder in bestimmten Serverkontexten verändert werden. Wieder andere sind klar als System- oder Hauptkonfigurationssache gedacht. Deshalb ist ein Hilfeartikel, der pauschal behauptet, „PHP-Einstellungen lassen sich einfach anpassen“, immer zu ungenau. Er verschweigt, dass nicht jede Direktive denselben Spielraum hat.
Ein praktischer Blick auf typische Werte
| Einstellung | Was das praktisch bedeutet |
|---|---|
memory_limit | oft vergleichsweise flexibel, aber nur über die im Hosting erlaubten Wege |
upload_max_filesize | häufig lokal steuerbar, aber ebenfalls nicht beliebig überall |
max_execution_time | oft anpassbar, je nach Umgebung |
allow_url_fopen | meist eine Sache des Servers oder Hosters |
disable_functions | typischerweise nichts, was ein normaler Webspace-Kunde frei setzt |
Gerade dieser Unterschied macht die Sache für WordPress- oder Shop-Nutzer so verwirrend: Der eine Wert lässt sich im Panel ändern, der nächste nicht, der dritte reagiert nur über .user.ini, der vierte überhaupt nicht. Das wirkt willkürlich, folgt aber den Regeln der PHP-Konfiguration.
Warum eine selbst angelegte php.ini im Webspace oft wirkungslos bleibt
Der Name einer Datei allein entscheidet nicht, ob PHP sie verwendet. Entscheidend ist, welche Konfigurationsdatei die laufende PHP-Umgebung tatsächlich lädt und welche zusätzlichen Ebenen darübergelegt sind. Deshalb kann problemlos eine php.ini im Webspace liegen, ohne dass sie für die aktive Website irgendeine Rolle spielt. Gerade im Shared Hosting ist das einer der häufigsten Gründe, warum Nutzer trotz sichtbarer Änderungen keine Wirkung bemerken. Nicht die Existenz der Datei ist ausschlaggebend, sondern ihre tatsächliche Einbindung in das konkrete Hosting-Setup.
Das Hosting-Panel
Am alltagstauglichsten ist oft der Weg über das Kundenpanel des Hosters. Dort gibt es je nach Anbieter Funktionen für Speicherlimit, Upload-Größe oder maximale Laufzeit. Technisch bearbeitet der Nutzer damit nicht unbedingt die zentrale php.ini, sondern löst im Hintergrund einen vom Anbieter vorgesehenen Override aus. Gerade im Shared Hosting ist das oft der sauberste und zuverlässigste Weg, weil er exakt dem Berechtigungsmodell der Plattform entspricht.
Die .user.ini
Bei CGI-, FastCGI- oder FPM-Umgebungen kann .user.ini wichtig sein. Sie erlaubt bestimmte lokale Anpassungen pro Verzeichnis. Wichtig ist dabei zweierlei: Erstens funktioniert dieses Modell nicht in jeder PHP-Anbindung. Zweitens werden Änderungen nicht immer sofort sichtbar, weil PHP solche Dateien nicht bei jeder einzelnen Anfrage neu einliest. Wer direkt testet, hält eine funktionierende Änderung deshalb manchmal fälschlich für wirkungslos.
Ein typischer Inhalt sieht so aus:
memory_limit = 512M
upload_max_filesize = 128M
post_max_size = 128M
max_execution_time = 300
Die .htaccess
Wenn PHP als Apache-Modul läuft, können bestimmte Werte über .htaccess beeinflusst werden. Aber auch hier entscheidet die Serverkonfiguration. Ist die Nutzung lokaler Overrides eingeschränkt oder abgeschaltet, hat die Datei keine Wirkung. Gerade deshalb ist .htaccess kein Beweis dafür, dass Kunden im Shared Hosting ihren Server frei konfigurieren, sondern eher ein begrenzter Mechanismus für freigegebene Anpassungen.
Ein typisches Beispiel:
php_value memory_limit 512M
php_value upload_max_filesize 128M
php_value post_max_size 128M
php_value max_execution_time 300
Was WordPress-Nutzer zusätzlich im Blick behalten sollten
WordPress kann mehr Speicher anfordern, aber nicht gegen jede Hosting-Grenze durchsetzen. Das ist der zentrale Punkt. Wer in wp-config.php einen höheren Wert setzt, formuliert damit zunächst nur einen Wunsch an die Umgebung. Ob dieser Wunsch wirksam wird, entscheidet die darunterliegende PHP-Konfiguration. Deshalb ist eine Änderung in WordPress weder nutzlos noch garantiert erfolgreich. Sie kann funktionieren — oder an einer niedrigeren hosterseitigen Obergrenze scheitern. Gerade bei WooCommerce-Shops, Importern, Page-Buildern, Backup-Plugins und Bildverarbeitung ist dieses Zusammenspiel häufig sichtbar, weil dort schon kleine Unterschiede im verfügbaren Speicher spürbare Auswirkungen haben.
Typische WordPress-Ergänzung
In vielen Fällen wird zusätzlich in der wp-config.php gearbeitet:
define( 'WP_MEMORY_LIMIT', '512M' );
define( 'WP_MAX_MEMORY_LIMIT', '512M' );
Wichtig ist dabei: Diese Werte helfen nur, wenn die Serverumgebung sie auch zulässt.
Typische Situationen aus der Praxis
| Was Nutzer tun | Was tatsächlich passieren kann |
|---|---|
WP_MEMORY_LIMIT in wp-config.phperhöhen | WordPress fordert mehr Speicher an, bleibt aber an die Servergrenze gebunden |
eine php.ini im Webspace anlegen | funktioniert nur, wenn genau dieser Mechanismus im Hosting vorgesehen ist |
memory_limit im Hosting-Panel erhöhen | oft direkt wirksam, weil der Hoster diesen Weg vorgesehen hat |
| den Support kontaktieren | notwendig, wenn das Limit auf einer Ebene festgelegt ist, die der Kunde nicht selbst beeinflussen darf |
Kostenfreies Tool nutzen: PHP-Konfigurations-Diagnose

Dieses kleine Diagnose-Tool nimmt Nutzern die mühsame Fehlersuche ab und zeigt direkt an, welcher Konfigurationsweg auf dem eigenen Hosting tatsächlich greift. Statt blind an php.ini, .user.ini, .htaccess oder WordPress-Einstellungen herumzuprobieren, analysiert es die aktive PHP-Umgebung, prüft die entscheidenden Indikatoren und gibt daraus eine konkrete Handlungsempfehlung aus.
Für die Nutzung genügt es, den untenstehenden Code in eine neue Datei zu kopieren, sie zum Beispiel als phpconfigtest.php zu speichern, per FTP oder Dateimanager in den eigenen Webspace hochzuladen und anschließend im Browser aufzurufen. Danach zeigt das Tool übersichtlich an, ob eher .user.ini, .htaccess, das Hosting-Panel oder der Hoster selbst der richtige Weg ist.
Wichtig ist nur: Weil die Ausgabe technische Umgebungsinformationen enthält, sollte die Datei nach der Prüfung aus Sicherheitsgründen wieder vom Server gelöscht werden.
Code der phpconfigtest.php zum Kopieren und Hochladen auf den eigenen Webspace:
<?php
declare(strict_types=1);
/**
* PHP Memory / Config Diagnose Tool
*
* Zweck:
* - Erkennt die laufende PHP-Umgebung
* - Zeigt, welche Konfigurationswege wahrscheinlich greifen
* - Prüft .user.ini-Indikatoren
* - Prüft Apache/.htaccess-Indikatoren
* - Gibt dem Nutzer konkrete Handlungsempfehlungen aus
*
* Nutzung:
* - Datei z. B. als php-diagnose.php ins Webverzeichnis legen
* - Im Browser aufrufen
* - Danach aus Sicherheitsgründen wieder löschen
*/
error_reporting(E_ALL);
ini_set('display_errors', '1');
header('Content-Type: text/html; charset=utf-8');
function h(string $value): string
{
return htmlspecialchars($value, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}
function yesNo(bool $value): string
{
return $value ? 'Ja' : 'Nein';
}
function safeIniGet(string $key): string
{
$value = ini_get($key);
if ($value === false) {
return 'nicht verfügbar';
}
if ($value === '') {
return '(leer)';
}
return (string)$value;
}
function normalizePath(string $path): string
{
$real = realpath($path);
return $real !== false ? $real : $path;
}
function findNearbyWordPressConfig(string $startDir, int $maxLevels = 5): ?string
{
$dir = $startDir;
for ($i = 0; $i <= $maxLevels; $i++) {
$candidate = $dir . DIRECTORY_SEPARATOR . 'wp-config.php';
if (is_file($candidate)) {
return normalizePath($candidate);
}
$parent = dirname($dir);
if ($parent === $dir) {
break;
}
$dir = $parent;
}
return null;
}
function detectApacheModule(string $sapi): bool
{
return stripos($sapi, 'apache') !== false || strtolower($sapi) === 'apache2handler';
}
function detectFastCgiLike(string $sapi): bool
{
$sapi = strtolower($sapi);
return in_array($sapi, ['fpm-fcgi', 'cgi-fcgi', 'cgi'], true)
|| str_contains($sapi, 'fcgi')
|| str_contains($sapi, 'fpm');
}
function detectHostingPanelHints(): array
{
$hints = [];
$serverSoftware = $_SERVER['SERVER_SOFTWARE'] ?? '';
$scriptFilename = $_SERVER['SCRIPT_FILENAME'] ?? '';
$documentRoot = $_SERVER['DOCUMENT_ROOT'] ?? '';
$envText = implode(' ', array_map(
static fn($v) => is_string($v) ? $v : '',
[
$serverSoftware,
$scriptFilename,
$documentRoot,
getenv('PATH') ?: '',
getenv('PWD') ?: '',
]
));
$haystack = strtolower($envText);
$possible = [
'plesk' => 'Plesk',
'cpanel' => 'cPanel',
'directadmin' => 'DirectAdmin',
'cloudlinux' => 'CloudLinux',
'litespeed' => 'LiteSpeed',
'kasserver' => 'KAS / managed hosting',
'kas_' => 'KAS / managed hosting',
];
foreach ($possible as $needle => $label) {
if (str_contains($haystack, $needle)) {
$hints[] = $label;
}
}
return array_values(array_unique($hints));
}
function renderBadge(string $text, string $type = 'neutral'): string
{
$class = 'badge badge-neutral';
if ($type === 'good') {
$class = 'badge badge-good';
} elseif ($type === 'warn') {
$class = 'badge badge-warn';
} elseif ($type === 'bad') {
$class = 'badge badge-bad';
}
return '<span class="' . $class . '">' . h($text) . '</span>';
}
function buildDecisionRows(array $ctx): array
{
$rows = [];
$rows[] = [
'rule' => 'Unterstützt dieses Hosting grundsätzlich .user.ini?',
'result' => $ctx['userIniSupported'] ? 'Ja' : 'Nein',
'status' => $ctx['userIniSupported'] ? 'good' : 'bad',
'meaning' => $ctx['userIniSupported']
? 'Ja. PHP sucht laut Konfiguration nach einer .user.ini.'
: 'Nein. .user.ini ist hier laut Konfiguration nicht aktiv.'
];
$rows[] = [
'rule' => 'Ist .user.ini hier der wahrscheinlich richtige Hauptweg?',
'result' => ($ctx['userIniSupported'] && $ctx['fastCgiLikely']) ? 'Ja' : 'Nein',
'status' => ($ctx['userIniSupported'] && $ctx['fastCgiLikely']) ? 'good' : 'bad',
'meaning' => ($ctx['userIniSupported'] && $ctx['fastCgiLikely'])
? 'Ja. Die Server API ist eine FastCGI-/FPM-Variante und .user.ini ist aktiv.'
: 'Nein. Die Kombination aus SAPI und Einstellungen spricht nicht klar für .user.ini als Hauptweg.'
];
$rows[] = [
'rule' => 'Ist .htaccess hier der wahrscheinlich richtige Hauptweg?',
'result' => $ctx['apacheLikely'] ? 'Ja' : 'Nein',
'status' => $ctx['apacheLikely'] ? 'warn' : 'good',
'meaning' => $ctx['apacheLikely']
? 'Eher ja. Die Umgebung wirkt wie Apache-Modulbetrieb oder Apache-nahe SAPI.'
: 'Nein. Die laufende PHP-SAPI spricht nicht für .htaccess als primären PHP-Konfigurationsweg.'
];
$rows[] = [
'rule' => 'Wird memory_limit aktuell bereits lokal überschrieben?',
'result' => $ctx['memoryLocallyOverridden'] ? 'Ja' : 'Nein',
'status' => $ctx['memoryLocallyOverridden'] ? 'warn' : 'good',
'meaning' => $ctx['memoryLocallyOverridden']
? 'Ja. Local Value und Master Value unterscheiden sich.'
: 'Nein. Local Value und Master Value sind gleich; aktuell greift kein zusätzlicher lokaler Override für memory_limit.'
];
$rows[] = [
'rule' => 'Gibt es Hinweise auf zusätzliche hosterseitige Vorgaben?',
'result' => $ctx['hosterOverridesLikely'] ? 'Ja' : 'Unklar',
'status' => $ctx['hosterOverridesLikely'] ? 'warn' : 'neutral',
'meaning' => $ctx['hosterOverridesLikely']
? 'Ja. Zusätzliche gescannte INI-Dateien oder systemseitige Dateien deuten auf hosterseitige Steuerung hin.'
: 'Es gibt keine starken technischen Hinweise, aber hosterseitige Vorgaben sind im Shared Hosting trotzdem möglich.'
];
$rows[] = [
'rule' => 'Ist ein Hosting-Panel wahrscheinlich ein sinnvoller erster Weg?',
'result' => $ctx['hasHostingPanelHint'] ? 'Ja' : 'Ja, trotzdem prüfen',
'status' => $ctx['hasHostingPanelHint'] ? 'good' : 'neutral',
'meaning' => $ctx['hasHostingPanelHint']
? 'Ja. Es gibt Umgebungs-Hinweise auf ein Hosting-Panel oder managed Hosting.'
: 'Auch ohne technische Hinweise lohnt sich der Blick ins Kundenpanel fast immer zuerst.'
];
return $rows;
}
function recommendPaths(array $ctx): array
{
$recommendations = [];
if ($ctx['hasHostingPanelHint']) {
$recommendations[] = 'Zuerst im Hosting-Kundenbereich nach "PHP-Einstellungen", "PHP Memory Limit", "PHP-Optionen" oder ähnlichen Menüpunkten suchen.';
} else {
$recommendations[] = 'Zuerst im Hosting-Kundenbereich prüfen, ob es dort bereits eine Einstellung für PHP-Werte gibt.';
}
if ($ctx['userIniSupported'] && $ctx['fastCgiLikely']) {
$recommendations[] = 'Die primäre Testmethode ist hier .user.ini. Legen Sie im relevanten Webverzeichnis eine Datei namens .user.ini an oder bearbeiten Sie sie.';
$recommendations[] = 'Tragen Sie dort testweise "memory_limit = 512M" ein und prüfen Sie danach erneut den wirksamen Wert.';
if ($ctx['userIniCacheTtl'] !== '(leer)' && $ctx['userIniCacheTtl'] !== 'nicht verfügbar') {
$recommendations[] = 'Warten Sie nach der Änderung ungefähr ' . $ctx['userIniCacheTtl'] . ' Sekunden oder etwas länger, weil .user.ini oft nicht sofort neu eingelesen wird.';
}
} elseif ($ctx['apacheLikely']) {
$recommendations[] = 'Die primäre Testmethode ist hier eher .htaccess. Tragen Sie dort testweise "php_value memory_limit 512M" ein, sofern Ihr Hoster solche Overrides erlaubt.';
} else {
$recommendations[] = 'Die Umgebung ist nicht eindeutig. Wenn kein Panel vorhanden ist, sollte der Hoster-Support gefragt werden, welcher Weg für PHP-Einstellungen vorgesehen ist.';
}
if ($ctx['memoryLocallyOverridden']) {
$recommendations[] = 'Da memory_limit bereits lokal überschrieben wird, gibt es auf diesem Hosting schon mindestens eine zusätzliche Konfigurationsebene.';
} else {
$recommendations[] = 'Da Local Value und Master Value gleich sind, greift aktuell kein zusätzlicher lokaler Override für memory_limit.';
}
if ($ctx['hosterOverridesLikely']) {
$recommendations[] = 'Die zusätzlichen gescannten INI-Dateien sprechen dafür, dass der Hoster eigene Vorgaben auf Systemebene setzt. Wenn Ihre .user.ini- oder .htaccess-Änderung nicht greift, liegt die Grenze sehr wahrscheinlich dort.';
}
if ($ctx['wordpressDetected']) {
$recommendations[] = 'WordPress wurde erkannt. Zusätzlich kann in der wp-config.php testweise "define( \'WP_MEMORY_LIMIT\', \'512M\' );" gesetzt werden. Das wirkt aber nur innerhalb der vom Server erlaubten Grenzen.';
}
$recommendations[] = 'Wenn sich der wirksame Wert trotz korrekter Änderung nicht verändert, muss der Hoster das Limit wahrscheinlich auf seiner Ebene anheben.';
return $recommendations;
}
function buildConcreteInterpretation(array $ctx): array
{
$items = [];
if ($ctx['userIniSupported'] && $ctx['fastCgiLikely']) {
$items[] = 'Auf diesem Hosting ist .user.ini der naheliegendste Weg für eigene PHP-Anpassungen.';
} else {
$items[] = 'Auf diesem Hosting ist .user.ini nicht eindeutig als primärer Weg belegt.';
}
if ($ctx['apacheLikely']) {
$items[] = '.htaccess ist hier wahrscheinlich relevant oder zumindest prüfenswert.';
} else {
$items[] = '.htaccess ist hier nicht der primäre Hinweisgeber für PHP-Werte.';
}
if ($ctx['memoryLocallyOverridden']) {
$items[] = 'memory_limit ist bereits lokal oder durch eine zusätzliche Ebene überschrieben.';
} else {
$items[] = 'memory_limit ist aktuell nicht lokal überschrieben; der wirksame Wert entspricht dem globalen Wert.';
}
if ($ctx['hosterOverridesLikely']) {
$items[] = 'Es gibt technische Hinweise darauf, dass der Hoster zusätzliche INI- oder Systemvorgaben setzt.';
} else {
$items[] = 'Es gibt keine harten Beweise für hosterseitige Zusatzlimits, aber sie sind im Shared Hosting weiterhin möglich.';
}
return $items;
}
$sapi = PHP_SAPI;
$loadedConfig = php_ini_loaded_file();
$scannedFiles = php_ini_scanned_files();
$userIniFilename = safeIniGet('user_ini.filename');
$userIniCacheTtl = safeIniGet('user_ini.cache_ttl');
$memoryLimit = safeIniGet('memory_limit');
$postMaxSize = safeIniGet('post_max_size');
$uploadMaxFilesize = safeIniGet('upload_max_filesize');
$maxExecutionTime = safeIniGet('max_execution_time');
$iniDetailed = @ini_get_all(null, true);
$memoryLocal = null;
$memoryGlobal = null;
if (is_array($iniDetailed) && isset($iniDetailed['memory_limit'])) {
$memoryLocal = isset($iniDetailed['memory_limit']['local_value']) ? (string)$iniDetailed['memory_limit']['local_value'] : null;
$memoryGlobal = isset($iniDetailed['memory_limit']['global_value']) ? (string)$iniDetailed['memory_limit']['global_value'] : null;
}
$apacheLikely = detectApacheModule($sapi);
$fastCgiLikely = detectFastCgiLike($sapi);
$userIniSupported = $userIniFilename !== '(leer)' && $userIniFilename !== 'nicht verfügbar' && $userIniFilename !== '';
$docRoot = isset($_SERVER['DOCUMENT_ROOT']) ? normalizePath($_SERVER['DOCUMENT_ROOT']) : 'nicht verfügbar';
$currentScriptDir = normalizePath(__DIR__);
$wordpressConfig = findNearbyWordPressConfig(__DIR__);
$wordpressDetected = $wordpressConfig !== null;
$hostingHints = detectHostingPanelHints();
$hasHostingPanelHint = count($hostingHints) > 0;
$memoryLocallyOverridden = ($memoryLocal !== null && $memoryGlobal !== null && $memoryLocal !== $memoryGlobal);
$hosterOverridesLikely = false;
if (is_string($scannedFiles) && trim($scannedFiles) !== '') {
$scanLower = strtolower($scannedFiles);
$hosterPatterns = [
'kas_',
'kasserver',
'php-fpm_',
'/etc/php-fpm',
'/conf.d/',
'nmmconfig',
'memory_limit.ini',
];
foreach ($hosterPatterns as $pattern) {
if (str_contains($scanLower, strtolower($pattern))) {
$hosterOverridesLikely = true;
break;
}
}
}
$context = [
'apacheLikely' => $apacheLikely,
'fastCgiLikely' => $fastCgiLikely,
'userIniSupported' => $userIniSupported,
'userIniCacheTtl' => $userIniCacheTtl,
'memoryLocal' => $memoryLocal,
'memoryGlobal' => $memoryGlobal,
'memoryLocallyOverridden' => $memoryLocallyOverridden,
'wordpressDetected' => $wordpressDetected,
'hasHostingPanelHint' => $hasHostingPanelHint,
'hosterOverridesLikely' => $hosterOverridesLikely,
];
$decisionRows = buildDecisionRows($context);
$recommendations = recommendPaths($context);
$concreteInterpretation = buildConcreteInterpretation($context);
$recommendedPrimary = 'Hosting-Panel oder Hoster-Support';
if ($userIniSupported && $fastCgiLikely) {
$recommendedPrimary = '.user.ini';
} elseif ($apacheLikely) {
$recommendedPrimary = '.htaccess';
} elseif ($hasHostingPanelHint) {
$recommendedPrimary = 'Hosting-Panel';
}
?>
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>PHP-Konfigurations-Diagnose</title>
<style>
:root {
--bg: #0b1020;
--panel: #11182d;
--panel-2: #17203a;
--line: #2a3558;
--text: #e8ecf8;
--muted: #9aa6c7;
--good: #1fb980;
--warn: #f0b429;
--bad: #e45757;
--accent: #6ea8fe;
--code: #0d152b;
}
* { box-sizing: border-box; }
body {
margin: 0;
font-family: Inter, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Arial, sans-serif;
background:
radial-gradient(circle at top right, rgba(110, 168, 254, 0.14), transparent 28%),
radial-gradient(circle at top left, rgba(31, 185, 128, 0.08), transparent 24%),
var(--bg);
color: var(--text);
line-height: 1.55;
}
.wrap {
max-width: 1240px;
margin: 0 auto;
padding: 32px 20px 60px;
}
.hero {
background: linear-gradient(180deg, rgba(23, 32, 58, 0.95), rgba(17, 24, 45, 0.98));
border: 1px solid var(--line);
border-radius: 20px;
padding: 28px;
box-shadow: 0 12px 40px rgba(0,0,0,0.28);
margin-bottom: 24px;
}
h1, h2, h3 {
margin: 0 0 14px;
line-height: 1.2;
}
h1 {
font-size: clamp(28px, 5vw, 42px);
letter-spacing: -0.03em;
}
h2 {
font-size: 24px;
margin-top: 28px;
}
p {
margin: 0 0 14px;
color: var(--muted);
}
.lead {
font-size: 17px;
max-width: 940px;
}
.grid {
display: grid;
gap: 18px;
}
.grid-2 {
grid-template-columns: repeat(auto-fit, minmax(340px, 1fr));
}
.card {
background: linear-gradient(180deg, rgba(17,24,45,0.96), rgba(14,20,37,0.98));
border: 1px solid var(--line);
border-radius: 18px;
padding: 20px;
box-shadow: 0 10px 32px rgba(0,0,0,0.18);
}
.badge {
display: inline-flex;
align-items: center;
padding: 6px 10px;
border-radius: 999px;
font-size: 13px;
font-weight: 700;
letter-spacing: 0.01em;
margin-right: 8px;
margin-bottom: 8px;
border: 1px solid transparent;
}
.badge-neutral {
background: rgba(110,168,254,0.12);
color: #cfe0ff;
border-color: rgba(110,168,254,0.24);
}
.badge-good {
background: rgba(31,185,128,0.14);
color: #baf3de;
border-color: rgba(31,185,128,0.24);
}
.badge-warn {
background: rgba(240,180,41,0.15);
color: #ffe7ae;
border-color: rgba(240,180,41,0.25);
}
.badge-bad {
background: rgba(228,87,87,0.14);
color: #ffc4c4;
border-color: rgba(228,87,87,0.26);
}
.status-pill {
display: inline-block;
min-width: 90px;
text-align: center;
padding: 6px 10px;
border-radius: 999px;
font-weight: 700;
font-size: 13px;
border: 1px solid transparent;
}
.status-good {
background: rgba(31,185,128,0.14);
color: #baf3de;
border-color: rgba(31,185,128,0.24);
}
.status-warn {
background: rgba(240,180,41,0.15);
color: #ffe7ae;
border-color: rgba(240,180,41,0.25);
}
.status-bad {
background: rgba(228,87,87,0.14);
color: #ffc4c4;
border-color: rgba(228,87,87,0.26);
}
.status-neutral {
background: rgba(110,168,254,0.12);
color: #cfe0ff;
border-color: rgba(110,168,254,0.24);
}
table {
width: 100%;
border-collapse: collapse;
margin-top: 8px;
}
th, td {
text-align: left;
vertical-align: top;
padding: 12px 10px;
border-bottom: 1px solid var(--line);
font-size: 14px;
}
th {
color: var(--text);
font-weight: 700;
}
td {
color: var(--muted);
word-break: break-word;
}
ul, ol {
margin: 0;
padding-left: 20px;
}
li {
margin: 0 0 10px;
color: var(--muted);
}
code, .code-inline {
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace;
background: var(--code);
color: #dbe7ff;
border: 1px solid var(--line);
border-radius: 8px;
padding: 2px 7px;
font-size: 0.95em;
}
.code-block {
background: var(--code);
color: #dbe7ff;
border: 1px solid var(--line);
border-radius: 12px;
padding: 14px 16px;
overflow: auto;
white-space: pre-wrap;
word-break: break-word;
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace;
font-size: 14px;
}
.summary {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));
gap: 14px;
margin-top: 18px;
}
.summary-box {
border: 1px solid var(--line);
border-radius: 14px;
padding: 16px;
background: rgba(255,255,255,0.02);
}
.summary-box strong {
display: block;
font-size: 13px;
color: var(--muted);
margin-bottom: 8px;
text-transform: uppercase;
letter-spacing: 0.05em;
}
.summary-box span {
font-size: 20px;
font-weight: 800;
color: var(--text);
}
.callout {
border: 1px solid var(--line);
border-left: 4px solid var(--accent);
border-radius: 14px;
padding: 16px 18px;
background: rgba(110,168,254,0.08);
margin-top: 18px;
}
.footer-note {
margin-top: 24px;
font-size: 13px;
color: var(--muted);
}
.subtle {
color: var(--muted);
font-size: 14px;
}
</style>
</head>
<body>
<div class="wrap">
<section class="hero">
<div>
<?php
echo renderBadge('Diagnose aktiv', 'good');
echo renderBadge('PHP-SAPI: ' . $sapi, 'neutral');
echo renderBadge('Empfohlener Hauptweg: ' . $recommendedPrimary, 'warn');
?>
</div>
<h1>PHP-Konfigurations-Diagnose</h1>
<p class="lead">
Dieses Tool prüft, wie Ihre Website derzeit PHP lädt, ob eine <span class="code-inline">.user.ini</span>
grundsätzlich unterstützt wird, ob eher <span class="code-inline">.htaccess</span> infrage kommt
und welche nächsten Schritte für das Erhöhen des PHP-Memory-Limits am wahrscheinlichsten sind.
</p>
<div class="summary">
<div class="summary-box">
<strong>Server API</strong>
<span><?php echo h($sapi); ?></span>
</div>
<div class="summary-box">
<strong>Memory Limit aktuell</strong>
<span><?php echo h($memoryLimit); ?></span>
</div>
<div class="summary-box">
<strong>.user.ini unterstützt</strong>
<span><?php echo h(yesNo($userIniSupported)); ?></span>
</div>
<div class="summary-box">
<strong>Primärempfehlung</strong>
<span><?php echo h($recommendedPrimary); ?></span>
</div>
</div>
<div class="callout">
<strong>Konkretes Ergebnis für dieses Hosting:</strong>
<ul style="margin-top:10px;">
<?php foreach ($concreteInterpretation as $item): ?>
<li><?php echo h($item); ?></li>
<?php endforeach; ?>
</ul>
</div>
</section>
<section class="grid grid-2">
<div class="card">
<h2>Das sollten Sie jetzt tun</h2>
<ol>
<?php foreach ($recommendations as $item): ?>
<li><?php echo h($item); ?></li>
<?php endforeach; ?>
</ol>
</div>
<div class="card">
<h2>Schnelle Einordnung</h2>
<p>
<?php if ($userIniSupported && $fastCgiLikely): ?>
Ihre Umgebung spricht klar für <strong>.user.ini</strong>. Die laufende PHP-Anbindung ist eine FastCGI-/FPM-Variante und <span class="code-inline">user_ini.filename</span> ist aktiv.
<?php elseif ($apacheLikely): ?>
Ihre Umgebung spricht eher für <strong>.htaccess</strong>. PHP wirkt wie Apache-Modulbetrieb oder eine Apache-nahe SAPI.
<?php elseif ($hasHostingPanelHint): ?>
Es gibt Hinweise auf ein <strong>Hosting-Panel</strong> oder managed Hosting. Prüfen Sie zuerst die Kundenoberfläche.
<?php else: ?>
Die Umgebung ist nicht eindeutig. Prüfen Sie zuerst das Hosting-Panel. Falls dort nichts vorhanden ist, ist der Hoster-Support wahrscheinlich der richtige Weg.
<?php endif; ?>
</p>
<table>
<tr>
<th>Loaded Configuration File</th>
<td><?php echo h($loadedConfig !== false ? normalizePath($loadedConfig) : 'keine Hauptdatei gemeldet'); ?></td>
</tr>
<tr>
<th>Server API</th>
<td><?php echo h($sapi); ?></td>
</tr>
<tr>
<th>user_ini.filename</th>
<td><?php echo h($userIniFilename); ?></td>
</tr>
<tr>
<th>user_ini.cache_ttl</th>
<td><?php echo h($userIniCacheTtl); ?></td>
</tr>
<tr>
<th>Document Root</th>
<td><?php echo h($docRoot); ?></td>
</tr>
<tr>
<th>Aktuelles Verzeichnis</th>
<td><?php echo h($currentScriptDir); ?></td>
</tr>
<tr>
<th>WordPress erkannt</th>
<td>
<?php echo h(yesNo($wordpressDetected)); ?>
<?php if ($wordpressDetected): ?>
<br><small><?php echo h($wordpressConfig ?? ''); ?></small>
<?php endif; ?>
</td>
</tr>
<tr>
<th>Hosting-Hinweise</th>
<td><?php echo h($hostingHints ? implode(', ', $hostingHints) : 'keine eindeutigen Hinweise erkannt'); ?></td>
</tr>
</table>
</div>
</section>
<section class="card" style="margin-top: 18px;">
<h2>Entscheidungsmatrix für dieses Hosting</h2>
<table>
<tr>
<th style="width: 34%;">Prüffrage</th>
<th style="width: 14%;">Ergebnis</th>
<th>Bewertung</th>
</tr>
<?php foreach ($decisionRows as $row): ?>
<tr>
<td><?php echo h($row['rule']); ?></td>
<td>
<span class="status-pill status-<?php echo h($row['status']); ?>">
<?php echo h($row['result']); ?>
</span>
</td>
<td><?php echo h($row['meaning']); ?></td>
</tr>
<?php endforeach; ?>
</table>
</section>
<section class="grid grid-2" style="margin-top: 18px;">
<div class="card">
<h2>Wichtige PHP-Werte</h2>
<table>
<tr>
<th>memory_limit</th>
<td><?php echo h($memoryLimit); ?></td>
</tr>
<tr>
<th>post_max_size</th>
<td><?php echo h($postMaxSize); ?></td>
</tr>
<tr>
<th>upload_max_filesize</th>
<td><?php echo h($uploadMaxFilesize); ?></td>
</tr>
<tr>
<th>max_execution_time</th>
<td><?php echo h($maxExecutionTime); ?></td>
</tr>
<tr>
<th>memory_limit Master Value</th>
<td><?php echo h($memoryGlobal ?? 'nicht verfügbar'); ?></td>
</tr>
<tr>
<th>memory_limit Local Value</th>
<td><?php echo h($memoryLocal ?? 'nicht verfügbar'); ?></td>
</tr>
</table>
<p style="margin-top:14px;">
<?php if ($memoryLocal !== null && $memoryGlobal !== null): ?>
<?php if ($memoryLocal !== $memoryGlobal): ?>
Der lokale Wert unterscheidet sich vom globalen Wert. Das bedeutet: Es greift bereits eine zusätzliche Konfigurationsebene.
<?php else: ?>
Globaler und lokaler Wert sind gleich. Das bedeutet: Für <span class="code-inline">memory_limit</span> greift aktuell kein zusätzlicher lokaler Override.
<?php endif; ?>
<?php else: ?>
Die Unterscheidung zwischen lokalem und globalem Wert konnte nicht sicher ausgelesen werden.
<?php endif; ?>
</p>
</div>
<div class="card">
<h2>Empfohlene Testeinträge</h2>
<p>Wenn dieses Tool <strong>.user.ini</strong> als Hauptweg empfiehlt:</p>
<div class="code-block">memory_limit = 512M</div>
<p style="margin-top:14px;">Wenn dieses Tool <strong>.htaccess</strong> als Hauptweg empfiehlt:</p>
<div class="code-block">php_value memory_limit 512M</div>
<?php if ($wordpressDetected): ?>
<p style="margin-top:14px;">Zusätzlich für <strong>WordPress</strong> in der <span class="code-inline">wp-config.php</span>:</p>
<div class="code-block">define( 'WP_MEMORY_LIMIT', '512M' );</div>
<?php endif; ?>
<p style="margin-top:14px;">
Wichtig: Wenn der wirksame Wert trotz korrekt gesetztem Testeintrag unverändert bleibt,
setzt der Hoster das Limit wahrscheinlich auf einer höheren Ebene fest.
</p>
</div>
</section>
<section class="card" style="margin-top: 18px;">
<h2>Scans und Zusatzinformationen</h2>
<table>
<tr>
<th>Zusätzlich gescannte INI-Dateien</th>
<td><?php echo h($scannedFiles !== false && trim($scannedFiles) !== '' ? $scannedFiles : 'keine zusätzlichen INI-Dateien gemeldet'); ?></td>
</tr>
<tr>
<th>PHP Binary</th>
<td><?php echo h(PHP_BINARY ?? 'nicht verfügbar'); ?></td>
</tr>
<tr>
<th>PHP Version</th>
<td><?php echo h(PHP_VERSION); ?></td>
</tr>
<tr>
<th>Server Software</th>
<td><?php echo h($_SERVER['SERVER_SOFTWARE'] ?? 'nicht verfügbar'); ?></td>
</tr>
</table>
</section>
<section class="card" style="margin-top: 18px;">
<h2>Was bedeutet das konkret für dieses Hosting?</h2>
<ul>
<?php if ($userIniSupported && $fastCgiLikely): ?>
<li><strong>.user.ini ist hier technisch vorgesehen.</strong></li>
<?php else: ?>
<li><strong>.user.ini ist hier nicht eindeutig als Hauptweg belegt.</strong></li>
<?php endif; ?>
<?php if ($apacheLikely): ?>
<li><strong>.htaccess ist hier technisch relevant oder zumindest prüfenswert.</strong></li>
<?php else: ?>
<li><strong>.htaccess ist hier nicht der primäre Weg für PHP-Einstellungen.</strong></li>
<?php endif; ?>
<?php if ($memoryLocallyOverridden): ?>
<li><strong>memory_limit wird bereits durch eine zusätzliche Ebene überschrieben.</strong></li>
<?php else: ?>
<li><strong>memory_limit ist aktuell nicht lokal überschrieben.</strong></li>
<?php endif; ?>
<?php if ($hosterOverridesLikely): ?>
<li><strong>Es gibt Hinweise auf hosterseitige INI- oder Systemvorgaben.</strong></li>
<?php else: ?>
<li><strong>Es gibt keine harten Beweise für Hostervorgaben, aber sie bleiben möglich.</strong></li>
<?php endif; ?>
<li><strong>Die praktisch richtige Reihenfolge lautet:</strong> zuerst Hosting-Panel prüfen, dann den vom Tool empfohlenen Weg testen, danach gegebenenfalls den Hoster kontaktieren.</li>
</ul>
<p class="footer-note">
Sicherheitshinweis: Diese Datei zeigt sensible Umgebungsinformationen an. Nach der Prüfung sollte sie wieder vom Server entfernt werden.
</p>
</section>
</div>
</body>
<footer style="margin-top: 28px; padding: 18px 0 0; border-top: 1px solid #2a3558; color: #9aa6c7; font-size: 13px; line-height: 1.7;">
<div style="background: rgba(255,255,255,0.02); border: 1px solid #2a3558; border-radius: 14px; padding: 16px 18px;">
<p style="margin: 0 0 10px;">
<strong style="color: #e8ecf8;">Disclaimer:</strong>
Dieses Tool dient ausschließlich der technischen Orientierung und ersetzt keine verbindliche Auskunft des Hosting-Anbieters. Trotz sorgfältiger Analyse kann die tatsächlich wirksame PHP-Konfiguration zusätzlich durch hosterseitige Vorgaben, Panel-Einstellungen, Pool-Konfigurationen oder andere serverseitige Mechanismen beeinflusst werden.
</p>
<p style="margin: 0; color: #9aa6c7;">
© <?php echo date('Y'); ?> Meroth IT-Service
(<a href="https://www.pcffm.de" target="_blank" rel="noopener noreferrer" style="color: #cfe0ff; text-decoration: none;">www.pcffm.de</a>)
</p>
</div>
</footer>
</html>
Meroth IT-Service ist Ihr lokaler IT-Dienstleister in Frankfurt am Main für kleine Unternehmen, Selbstständige und Privatkunden
Kostenfreie Ersteinschätzung Ihres Anliegens?
Werbung
(**) UVP: Unverbindliche Preisempfehlung
Preise inkl. MwSt., zzgl. Versandkosten




