Module die den Private Ordner nutzen, müssen dort fähig sein, eigene Unterordner anlegen zu können. Damit das korrekt funktioniert sind ein paar Punkte zu beachten. Es betrifft die Drupal-Settings, sowie Servereinstellungen (open_basedir).
Konflikt mit open_basedir
Die PHP-Option oben_basedir die auf den meisten Webservern dafür sorgt, dass Drupal oder PHP-Anwendungen nur in den für sie freigegebenen Verzeichnissen arbeiten dürfen. Bei plesk ist die Standardeinstellung so, dass man im Projektverzeichnis und dem Server-TMP {WEBSPACEROOT}{/}{:}{TMP}{/} frei ist. Auch wenn Private in meinen Fällen im Webspaceroot liegt, kann Drupal dort nur Verzeichnisse anlegen, wenn der Serverpfad NICHT absolut angegeben ist. Dieses Problem ist übrigens nicht ein generelles PHP-Problem, sondern seit Drupal 8.1 ein drupaleigenes. Es bedeutet im einzelnen:
- Bei absolutem Private-Pfad prüft Drupal beim Anlegen von Ordnern jeden Teil des Pfads ab
/(z.B./home,/home/httpd). - open_basedir (Auf plesk: Dashboard > php > open_basedir) verbietet PHP den Blick auf diese Ordner. Drupal meint dann, sie existieren nicht, und bricht still ab.
- Fehlermeldung z.B. bei Feeds: «Feeds directory "private://feeds/..." either cannot be created or is not writable».
- Mit relativem Pfad baut Drupal ab dem Web-Root auf und stösst nicht an die open_basedir Grenze.
- Relativ ist zuverlässig, weil Drupal (Browser) und Drush immer vom Web-Root aus starten.
- Private Path:
relativ zum Web-Root (da wo index.php liegt). In der Regel im Verzeichnisweb.
In meinen aktuellen Projekten mit der bekannten Struktur muss man also zwei Verzeichnisse zurück:mein-projekt/ Projektverzeichnis ├── config/ ├── private/ ├── feeds/ ├── backup_migrate/ ├── tmp/ └── public/ Composer-Root ├── composer.json ├── composer.lock ├── vendor/ └── web/ Drupal-Root$settings['file_private_path'] = '../../private';
- Temp Path:
Hier wird empfohlen den absoluten Pfad zu behalten. Zum einen wird hier wohl selten ein Unterverzeichnis erstellt und zum zweiten besteht die Möglichkeit, dass nicht aus dem Webroot der Pfad aufgerufen wird und somit der relative Pfad nicht stimmen würde. Darum hier so belassen. Falls mal Probleme auftreten, für diesen Fall open_basedir kurz auf none stellen, oder auch relative Pfade in settings angeben.$settings['file_temp_path'] = dirname($app_root, 2) . '/private/tmp';
- open_basedir in Plesk auf der sicheren Einstellung lassen (nicht auf `none` setzen)
- Metanet:
{WEBSPACEROOT}/:{TMP}/
- mva (ist die gleiche Einstellung wie bei Metanet, nur eine andere Schreibweise):
{WEBSPACEROOT}{/}{:}{TMP}{/}
Drupal vs. Drush
- Cron per Drush funktioniert, manueller Import im Browser nicht.
- Grund: PHP auf der Kommandozeile hat kein open_basedir, PHP im Webserver schon.
Gut zu wissen
- SSH-Shell und geplante Aufgaben in Plesk laufen abgeschottet (chroot):
/= Abo-Ordnerdrush statuszeigt deshalb z.B./httpdocs/private, der Webserver sieht aber/home/httpd/vhosts/<domain>/httpdocs/private.