Ich habe ein Problem beim Abrufen einer Datei mit PHP curl über ftps mit impliziten ssl (wie hier diskutiert: ftp_ssl_connect with implicit ftp over tls). Das Problem ist, dass manchmal - wahrscheinlich 5% der Zeit, am Ende mit einem partiellen Download.FTPS mit PHP Curl bekommen partiellen Download
Meine Klasse ist mehr oder weniger angepasst von angepasst von Nico Westerdale Antwort und hier sind die relevanten Methoden:
class ftps {
private $server;
private $username;
private $password;
private $curlhandle;
public $dir = '/';
public function __construct($server, $username, $password) {
$this->server = $server;
$this->username = $username;
$this->password = $password;
$this->curlhandle = curl_init();
}
private function common($remote) {
curl_reset($this->curlhandle);
curl_setopt($this->curlhandle, CURLOPT_URL, 'ftps://' . $this->server . '/' . $remote);
curl_setopt($this->curlhandle, CURLOPT_USERPWD, $this->username . ':' . $this->password);
curl_setopt($this->curlhandle, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($this->curlhandle, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($this->curlhandle, CURLOPT_FTP_SSL, CURLFTPSSL_TRY);
curl_setopt($this->curlhandle, CURLOPT_FTPSSLAUTH, CURLFTPAUTH_TLS);
return $this->curlhandle;
}
public function download($filepath, $local = false) {
$filename = basename($filepath);
$remote = dirname($filepath);
if ($remote == '.') {
$remote = $this->dir;
}
if ($local === false) {
$local = $filename;
}
if ($fp = fopen($local, 'w')) {
$this->curlhandle = self::common($remote . $filename);
curl_setopt($this->curlhandle, CURLOPT_UPLOAD, 0);
curl_setopt($this->curlhandle, CURLOPT_FILE, $fp);
curl_exec($this->curlhandle);
if (curl_error($this->curlhandle)) {
return false;
} else {
return $local;
}
}
return false;
}
}
ich es so bin mit:
$ftps = new ftps('example.com','john_doe','123456');
$ftps->download('remote_filename','local_filename');
Wie ich bereits erwähnt funktioniert das fast fehlerfrei außer etwa 5% der Zeit ist das Ergebnis eine teilweise heruntergeladene Datei. Ich überprüfe dann den Remote-Server und bin in der Lage zu überprüfen, ob die Datei tatsächlich in ihrer Gesamtheit vorhanden ist - probiere das Skript erneut aus und es erhält unweigerlich die gesamte Datei bei einem zweiten Versuch.
Was würde ein intermittierendes Problem bei der Verwendung von Curl wie dies verursachen? Mein nächster Schritt wäre, eine Art Prüfsummen zu implementieren und Download-Versuche fortzusetzen, bis alles hashe, aber das fühlt sich eher wie eine schlampige Problemumgehung als eine echte Lösung an und es wäre schön, die eigentliche Wurzel des Problems zu kennen.
Überprüfen Sie die Ergebnisse von 'curl_exec ($ this-> lurlhandle);' im Falle von Fehlern. Überprüfen Sie auch die Inhaltsgröße und den Header der Inhaltslänge bei der Antwort, um festzustellen, ob eine Nichtübereinstimmung vorliegt. Als nächstes werde ich auch Timeout-Werte hinzufügen.'CURLOPT_CONNECTIMEOUT',' CURLOPT_FTP_RESPONSE_TIMEOUT', 'CURLOPT_ACCEPTTIMEOUT_MS',' CURLOPT_TIMEOUT'. Der letzte ist für eine vollständige Anfrage. Rest sind für Phasen der Anfrage. Versuchen Sie also, mit diesen Timeouts herumzuspielen und zu sehen, ob die Fehlerrate sinkt. Stellen Sie außerdem sicher, dass das Skript genügend Zeit für die Ausführung hat und nicht vom Webserver auf das Ausführungszeitlimit getötet wird –