Od jakiegoś czasu wśród moich serwerów pojawił się jeden działający w oparciu Plesk postawiony na Debianie. Generalnie jestem zadowolony z tego rozwiązania, ale oczywiście od czasu do czasu napotykam na różne kwiatki (choć rzadko). Jednym z takich kwiatków okazał się PEAR (choć to nie jego wina, tylko Pleska).

W czym rzecz? Ano w tym, że niby mam PEAR, ale nie działa. Tzn. można instalować pakiety, ale za diabła żaden skrypt PHP nie może uzyskać dostępu do plików PEAR. Próba uruchomienia poniższego skryptu

<?php
require ("PEAR.php");
?>

kończy się tak:

Warning: require(PEAR.php) [function.require]: failed to open stream: No such file or directory in /var/www/vhosts/domena.com/httpdocs/pear.php on line 2

Fatal error: require() [function.require]: Failed opening required ‘PEAR.php’ (include_path=’.:/usr/share/php’) in /var/www/vhosts/domena.com/httpdocs/pear.php on line 2

Zacząłem więc po kolei sprawdzać w czym rzecz. Najpierw odpaliłem phpinfo().

Directive Local Value Master Value
include_path .:/usr/share/php .:/usr/share/php
open_basedir /var/www/vhosts/domena.com/httpdocs:/tmp /usr/share/php

include_path
PEAR znajduje się w include_path, czyli w /usr/share/php, więc powinno chodzić. No ale nie chodzi.

open_basedir
No to jesteśmy (prawie) w domu. Nadrzędna wartość open_basedir jest OK – zawiera /usr/share/php, ale LOKALNA już nie – i dlatego nie działa.

Rozwiązanie

Trzeba przygotować sobie plik vhost.conf o zawartości analogicznej do poniższej i wgrać go do katalogu /var/www/vhosts/domena.com/conf/. Jest to jedyne rozwiązanie żeby na trwałe zmienić konfigurację dla wybranego vhosta (bo musimy zmienić LOKALNĄ wartość). Broń Boże wprowadzać zmainy w pliku httpd.include!

<Directory /var/www/vhosts/domena.com/httpdocs>
php_admin_flag safe_mode off
php_admin_value open_basedir "/var/www/vhosts/domena.com/httpdocs:/tmp:/usr/share/php"
</Directory>

Na koniec trzeba powiadomić Pleska o tym, że zmieniła się konfiguracja serwera. Robimy to takim poleceniem:

/usr/local/psa/admin/bin/websrvmng -a

Podobno nie trzeba po tym nawet Apache’a restartować, ale bez tego mi nie działało. Dlatego dorzucamy jeszcze to:

/etc/init.d/apache2 restart

I teraz wszystko pięknie hula!