Heim  >  Artikel  >  Backend-Entwicklung  >  PHP5.0~5.6 Kompatibilität jeder Version cURL-Datei-Upload-Funktion Beispielanalyse PHP-Kenntnisse

PHP5.0~5.6 Kompatibilität jeder Version cURL-Datei-Upload-Funktion Beispielanalyse PHP-Kenntnisse

jacklove
jackloveOriginal
2018-06-25 16:53:481465Durchsuche

In diesem Artikel wird hauptsächlich die Funktion zum Hochladen von Curl-Dateien in Bezug auf die Kompatibilität verschiedener Versionen von PHP5.0 bis 5.6 vorgestellt und anhand von Beispielen die relevanten Implementierungsfähigkeiten und Vorsichtsmaßnahmen für den Hochladevorgang für Curl-Dateien verschiedener gängiger PHP-Versionen analysiert . Freunde in Not können darauf verweisen.

In diesem Artikel wird die Kompatibilität der einzelnen Versionen von PHP5.0 bis 5.6 analysiert. Teilen Sie es als Referenz mit allen. Die Details lauten wie folgt:

Eine aktuelle Anforderung besteht darin, cURL über PHP aufzurufen, um Dateien im Multipart-/Formulardatenformat hochzuladen. Ein paar Fallstricke genügen für einen Artikel.

Wichtige Warnung

Lesen Sie nicht die offizielle chinesische Dokumentation von PHP! Die Version kann nicht mithalten und wird dich umbringen!

Unterschiede in cURL zwischen verschiedenen PHP-Versionen

PHPs cURL unterstützt die Übergabe eines assoziativen Arrays (anstelle eines Strings) an CURL_POSTFIELDS to Generieren Sie eine POST-Anfrage für multipart/form-data.

Traditionell unterstützt cURL von PHP das Anhängen von Dateien durch die Verwendung der Syntax „@+vollständiger Dateipfad“ in den Array-Daten, damit cURL sie lesen und hochladen kann. Dies steht im Einklang mit der Syntax für den direkten Aufruf des cURL-Programms über die Befehlszeile:

curl_setopt(ch, CURLOPT_POSTFIELDS, array(
  'file' => '@'.realpath('image.png'),
));

equals

$ curl -F "file=@/absolute/path/to/image.png" <url>

Aber PHP hat seit 5.5 eine neue CURLFile-Klasse eingeführt, um auf Dateien zu verweisen. Die CURLFile-Klasse kann außerdem im Detail zusätzliche Informationen wie MIME-Typen, Dateinamen usw. definieren, die in Multipart-/Formulardatendaten erscheinen können. PHP empfiehlt die Verwendung von CURLFile, um die alte @-Syntax zu ersetzen:

curl_setopt(ch, CURLOPT_POSTFIELDS, [
  &#39;file&#39; => new CURLFile(realpath(&#39;image.png&#39;)),
]);

PHP 5.5 führt außerdem die Option CURL_SAFE_UPLOAD ein, die das cURL-Modul von PHP zur Ablehnung zwingen kann Mit der alten @-Syntax werden nur Dateien im CURLFile-Stil akzeptiert. Der Standardwert ist „false“ für 5,5 und „true“ für 5,6.

Aber die Gefahr ist: Die @-Syntax ist in 5.5 veraltet und wurde in 5.6 direkt gelöscht (es wird eine ErorException generiert: Die Verwendung der @filename-API zum Hochladen von Dateien ist veraltet. Bitte verwenden Sie stattdessen die Klasse CURLFile).

Für PHP 5.6+ ist es sinnlos, CURL_SAFE_UPLOAD manuell auf „false“ zu setzen. Es wird nicht wörtlich so verstanden, dass „das Setzen auf „false“ die alte unsichere Methode aktiviert“ – die alte Methode existiert als veraltete Syntax überhaupt nicht mehr. PHP 5.6+ == Nur CURLFile, machen Sie sich keine Illusionen.

Meine Bereitstellungsumgebung ist 5.4 (nur @Syntax), aber meine Entwicklungsumgebung ist 5.6 (nur CURLFile). Keiner von beiden konzentriert sich auf 5.5, eine Übergangsversion, die beide unterstützen. Daher müssen zwei Codesätze mit Umweltbeurteilung geschrieben werden.

Jetzt kommt das Problem...

Umweltbeurteilung: Vorsicht vor der magischen Zahl!

Ich habe diese Art von Umweltbeurteilungscode gesehen:

if (version_compare(phpversion(), &#39;5.4.0&#39;) >= 0)

Ich habe nur einen Kommentar zu dieser Art von Codewort: Scheiße.

Dieses Urteil gerät in eine typische magische Zahlenfalle. Die Versionsnummer erscheint aus unerklärlichen Gründen im Code. Ohne langes Lesen des PHP-Handbuchs und des Update-Verlaufs ist es schwierig zu verstehen, an welcher Funktionsänderung der Autor festhält.

Der Code sollte zu seinen Wurzeln zurückkehren. Unsere eigentlichen Bedürfnisse sind tatsächlich: Verwenden Sie zuerst CURLFile, ohne auf die traditionelle @-Syntax zurückzugreifen. Dann kommt der Code:

if (class_exists(&#39;\CURLFile&#39;)) {
  $field = array(&#39;fieldname&#39; => new \CURLFile(realpath($filepath)));
} else {
  $field = array(&#39;fieldname&#39; => &#39;@&#39; . realpath($filepath));
}

Es wird empfohlen, die Degradationsoption explizit anzugeben

Aus zuverlässiger Sicht wird empfohlen, den Wert von CURL_SAFE_UPLOAD anzugeben, um PHP klar mitzuteilen, ob die alte @-Syntax toleriert oder verboten werden soll. Beachten Sie, dass die CURLOPT_SAFE_UPLOAD-Konstante selbst in niedrigeren PHP-Versionen möglicherweise nicht vorhanden ist. Sie müssen Folgendes beurteilen:

if (class_exists(&#39;\CURLFile&#39;)) {
  curl_setopt($ch, CURLOPT_SAFE_UPLOAD, true);
} else {
  if (defined(&#39;CURLOPT_SAFE_UPLOAD&#39;)) {
    curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false);
  }
}

Die Reihenfolge von cURL-Optionseinstellungen

Ob curl_setopt() einzeln oder curl_setopt_array() stapelweise, die Optionen von cURL werden immer einzeln wirksam, und die festgelegten Optionen wirken sich sofort auf das Verhalten von cURL aus, wenn nachfolgende Optionen festgelegt werden . .

Zum Beispiel bezieht sich CURLOPT_SAFE_UPLOAD auf das Verhalten von CURLOPT_POSTFIELDS. Wenn CURLOPT_POSTFIELDS zuerst und dann CURLOPT_SAFE_UPLOAD festgelegt wird, wird die Einschränkung des letzteren nicht wirksam. Denn beim Festlegen des ersteren hat cURL das eigentliche Lesen und Verarbeiten der Daten bereits abgeschlossen!

CURL bietet mehrere Optionen, die diese Gefahr bergen. Seien Sie also vorsichtig. Glücklicherweise gibt es für diese Art von „Abhängigkeit“ nicht viele Optionen und der Mechanismus ist nicht kompliziert, sodass er einfach gehandhabt werden kann. Meine Methode besteht darin, zunächst alle Optionen stapelweise festzulegen und dann curl_exec()einzelne Einstellungencurl_setopt() bis kurz vor CURLOPT_POSTFIELDS zu verwenden.

Tatsächlich ist in dem von curl_setopt_array() verwendeten Array garantiert, dass die Position von CURLOPT_POSTFIELDS am Ende zuverlässig ist. Die assoziativen Arrays von PHP sind sequentiell garantiert. Wir können auch davon ausgehen, dass die interne Ausführungsreihenfolge von curl_setopt_array() vom Anfang bis zum Ende in Ordnung sein muss (naja, ich weiß, das ist keine gute Sache, aber einige der Fakten sind zu einfach. Lassen Sie mich das erklären. Dies ist eine Mindestbehauptung. Sie können also beruhigt sein.

Mein Ansatz besteht lediglich darin, die Codeleistung zusätzlich abzusichern und die Bedeutung der Ordnung hervorzuheben, um zukünftiges Betrügen zu verhindern.

Namespace

PHP-Versionen 5.2 oder niedriger haben keine Namespaces. Wenn im Code das Leerzeichen verwendet wird, tritt ein Parserfehler auf. Es ist eigentlich einfach, darüber nachzudenken, sich um PHP 5.2 zu kümmern, indem man einfach den Namespace aufgibt.

Was zu beachten ist, ist, dass PHP 5.3+ über Namespaces verfügt. Unabhängig davon, ob Sie CURLFile aufrufen oder class_exists() verwenden, um die Existenz von CURLFile zu ermitteln, wird empfohlen, CURLFile zu schreiben, um den Speicherplatz der obersten Ebene klar anzugeben und zu verhindern, dass der Code abstürzt, wenn er in den Namespace eingeschlossen wird.

Artikel, die Sie interessieren könnten:

cURL-Dokument kompatibel mit PHP5 und PHP7Analyse der PHP-Blockabfrage-Implementierungsmethode

PHP-KenntnisseInstanzanalyse der Datei-Upload-Funktion PHP-Kenntnisse

PHP-Halbsuchalgorithmus Beispielanalyse PHP-Kenntnisse

Das obige ist der detaillierte Inhalt vonPHP5.0~5.6 Kompatibilität jeder Version cURL-Datei-Upload-Funktion Beispielanalyse PHP-Kenntnisse. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn