[PHP] Problem mit open_basedir()

ayk

Ensign
Registriert
Apr. 2004
Beiträge
163
Hi,
möchte per PHP über FTP auf einen Server zugreifen, und den Inhalt des Verzeichnises in ein Array einlesen. Soweit das Script:

PHP:
<?php
$verbindung = ftp_connect('ftp.mozilla.org') or die ("Fehler (Server)!");
ftp_login($verbindung,'anonymous','anonymous') or die("Fehler (Login)!");
ftp_pasv($verbindung,true);

$inhalt = ftp_nlist($verbindung, "/pub/mozilla.org/firefox/");

print_r($inhalt);

ftp_close($verbindung);
?>
Nun bekomme ich beim Aufruf folgende Fehlermeldung:
Code:
[B]Warning[/B]:  ftp_nlist() [[URL="http://ayk.rshost.de/function.ftp-nlist"]function.ftp-nlist[/URL]]: open_basedir restriction in effect. File(/tmp) is not within the allowed path(s): (/home/www/web590/html/:/home/www/web590/phptmp/:/home/www/web590/files/:/home/www/web590/atd/) in [B]/home/www/web590/html/1.php[/B] on line [B]6[/B]

[B]Warning[/B]:  ftp_nlist() [[URL="http://ayk.rshost.de/function.ftp-nlist"]function.ftp-nlist[/URL]]: Unable to create temporary file.  Check permissions in temporary files directory. in [B]/home/www/web590/html/1.php[/B] on line [B]6[/B]
Hab es auf einem anderen Server getestet, und es funktioniert.
Muss hier in der php.ini unter den allowed Paths die "/tmp" mit eingefügt werden? Liegts evtl daran?

Gruß
 
Kurzantwort die du wahrscheinlich hören willst:
Was ich probieren würde, wäre mit putenv die Umgebungsvarible TMPDIR zu setzen, wenn dein Script aufgerufen wird - also am besten in die 1. Zeile schreiben:
Code:
putenv('TMPDIR=/home/www/web590/phptmp');


Ausführliche Erklärung:

Interessanter Fehler - ich hab mal n bissl im Quellcode gestöbert und bin auf folgendes gestoßen:
Code:
1600         if ((tmpstream = php_stream_fopen_tmpfile()) == NULL) {
1601                 php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to create temporary file.  Check permissions in temporary files directory");
1602                 return NULL;
1603         }
Um den Tempdir zu bestimmen ist folgender Codeabschnitt zuständig:
Code:
151 /*
152  *  Determine where to place temporary files.
153  */
154 PHPAPI const char* php_get_temporary_directory(void)
155 {
156         /* Cache the chosen temporary directory. */
157         static char* temporary_directory;
158 
159         /* Did we determine the temporary directory already? */
160         if (temporary_directory) {
161                 return temporary_directory;
162         }
163 
164 #ifdef PHP_WIN32
... egal unter Linux ...
177 #else
178         /* On Unix use the (usual) TMPDIR environment variable. */
179         {
180                 char* s = getenv("TMPDIR");
181                 if (s) {
182                         temporary_directory = strdup(s);
183                         return temporary_directory;
184                 }
185         }
186 #ifdef P_tmpdir
187         /* Use the standard default temporary directory. */
188         if (P_tmpdir) {
189                 temporary_directory = P_tmpdir;
190                 return temporary_directory;
191         }
192 #endif
193         /* Shouldn't ever(!) end up here ... last ditch default. */
194         temporary_directory = "/tmp";
195         return temporary_directory;
196 #endif
197 }

Wenn man also ein Linux-System hat, wird die Umgebungsvariable TMPDIR ausgelesen um das Temp-Dir zu bestimmen. Da dies offensichtlich ein Konfigurationsproblem des Provider ist, müsstest du ihn bitten die Umgebungsvariable TMPDIR auf dem Server für alle Kunden korrekt zu setzen, falls du es nicht selber wie oben beschrieben machen kannst.
 
Hab nun meinen Provider gebeten, meine php.ini in soweit abzuändern, dass unter den open_basedir(s) die /tmp auftaucht. Script funktioniert jetzt.
Trotzdem danke für die ausführliche Erklärung. Mich würde allerdings interessieren, ob es mit 'putenv' funktioniert hätte.

P.S. Grüße aus Weingarten/RV ;)
 
Zurück
Oben