Start · Sprachen · PHP · Referenz · ftp_alloc

ftp_alloc

Funktion

Sendet einen <code>ALLO</code>-Befehl an den FTP-Server, um vor dem Upload Speicherplatz für eine Datei zu reservieren.

seit PHP 5.0.0 Kategorie: io

Signatur

ftp_alloc(FTP\Connection $ftp, int $size, string &$response = null): bool

Beschreibung

ftp_alloc() schickt den FTP-Befehl ALLO an den verbundenen FTP-Server und fordert ihn auf, eine bestimmte Anzahl Bytes für eine bevorstehende Dateiübertragung zu reservieren. Manche Server — insbesondere ältere Mainframe- oder proprietäre FTP-Daemon-Implementierungen — verlangen diesen Schritt, bevor eine Datei hochgeladen werden darf.

Die meisten modernen FTP-Server ignorieren den ALLO-Befehl und antworten trotzdem mit einem Erfolgs-Code. In solchen Fällen liefert die Funktion true zurück, obwohl faktisch kein Speicher reserviert wurde. Der optionale Parameter $response enthält nach dem Aufruf die rohe Server-Antwort (z. B. 200 ALLO command successful.) und eignet sich zur Fehlerdiagnose.

Sinnvoll einzusetzen ist ftp_alloc() vor dem Aufruf von ftp_put() oder ftp_fput(), wenn man auf einem System arbeitet, das explizit Speicherplatz anfordern muss. In der Praxis sollte die Funktion dann aufgerufen werden, wenn die genaue Dateigröße im Voraus bekannt ist, z. B. über filesize().

Parameter

Name Typ Default Beschreibung
$ftp Pflicht FTP\Connection Eine aktive FTP-Verbindung, die zuvor mit ftp_connect() oder ftp_ssl_connect() und ftp_login() hergestellt wurde.
$size Pflicht int Anzahl der Bytes, die auf dem Server reserviert werden sollen. Typischerweise entspricht dieser Wert der Dateigröße der hochzuladenden Datei, ermittelt z. B. mit filesize().
$response string null Wird als Referenz übergeben und enthält nach dem Aufruf die textuelle Antwort des FTP-Servers, z. B. 200 ALLO command successful.. Nützlich zur Diagnose von Fehlern oder unerwarteten Server-Antworten.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der Server die Anfrage erfolgreich bestätigt hat, andernfalls false. Beachte: Viele moderne Server antworten immer mit true, auch wenn sie den Befehl intern ignorieren.

Beispiele

Speicher reservieren und Datei hochladen

<?php
$ftp = ftp_connect('ftp.example.com');
ftp_login($ftp, 'benutzer', 'geheim');

$localFile  = '/var/www/uploads/archiv.zip';
$remoteFile = '/uploads/archiv.zip';
$dateigröße = filesize($localFile);

if (ftp_alloc($ftp, $dateigröße, $serverAntwort)) {
    echo "Speicher reserviert: " . $serverAntwort . PHP_EOL;

    if (ftp_put($ftp, $remoteFile, $localFile, FTP_BINARY)) {
        echo "Datei erfolgreich hochgeladen." . PHP_EOL;
    } else {
        echo "Upload fehlgeschlagen." . PHP_EOL;
    }
} else {
    echo "Speicherreservierung fehlgeschlagen: " . $serverAntwort . PHP_EOL;
}

ftp_close($ftp);
Speicher reserviert: 200 ALLO command successful. Datei erfolgreich hochgeladen.

Fehlerbehandlung bei abgelehnter Reservierung

<?php
$ftp = ftp_connect('ftp.example.com');
ftp_login($ftp, 'benutzer', 'geheim');

$datei = '/tmp/großeDatei.tar.gz';
$antwort = '';

if (!ftp_alloc($ftp, filesize($datei), $antwort)) {
    // Protokolliere die Server-Antwort für die Fehlersuche
    error_log('ftp_alloc fehlgeschlagen. Server-Antwort: ' . $antwort);
    ftp_close($ftp);
    exit(1);
}

// Erst nach erfolgreicher Reservierung hochladen
ftp_put($ftp, '/remote/großeDatei.tar.gz', $datei, FTP_BINARY);
ftp_close($ftp);
echo "Fertig.";
Fertig.

// Wichtig · Fallstricke

Kompatibilität: Ab PHP 8.1 ist der Typ des ersten Parameters FTP\Connection statt der früheren Ressource (resource). Älterer Code, der eine Ressource verwendet, muss ggf. angepasst werden.

Serverseitige Unterstützung: Die meisten modernen FTP-Server (z. B. ProFTPd, vsftpd) unterstützen den ALLO-Befehl nicht wirklich und ignorieren ihn. Die Funktion gibt in diesem Fall trotzdem true zurück. Nur auf Systemen, die ALLO explizit voraussetzen, ist ein Aufruf zwingend notwendig.

Sicherheit: FTP überträgt Benutzerdaten unverschlüsselt. Für sensible Verbindungen sollte stattdessen ftp_ssl_connect() verwendet oder auf SFTP (über die SSH2-Erweiterung) umgestiegen werden.