Cet article présente principalement la fonction de téléchargement de fichiers cURL de la compatibilité des différentes versions de PHP5.0 ~ 5.6, et analyse les compétences et précautions d'implémentation pertinentes pour l'opération de téléchargement de fichiers curl de diverses versions courantes de PHP sous forme d'exemples. . Les amis dans le besoin peuvent s'y référer. Suivant
L'exemple de cet article analyse la compatibilité de la fonction de téléchargement de fichiers cURL de chaque version de PHP5.0~5.6. Partagez-le avec tout le monde pour votre référence, les détails sont les suivants :
Une exigence récente consiste à appeler cURL via PHP pour télécharger des fichiers au format multipart/form-data. Quelques écueils suffisent pour un article.
Avertissement important
Ne lisez pas la documentation officielle chinoise de PHP ! La version ne peut pas suivre et elle va vous tuer !
Différences de cURL entre les différentes versions de PHP
Le cURL de PHP prend en charge la transmission de tableaux associatifs (au lieu de chaînes) à CURL_POSTFIELDS
pour générer un Demande POST pour multipart/form-data
.
Traditionnellement, cURL de PHP prend en charge la pièce jointe de fichiers en utilisant la syntaxe "@+chemin d'accès complet au fichier" dans les données du tableau pour que cURL puisse lire et télécharger. Ceci est cohérent avec la syntaxe permettant d'appeler directement le programme cURL depuis la ligne de commande :
curl_setopt(ch, CURLOPT_POSTFIELDS, array( 'file' => '@'.realpath('image.png'), ));
equals
$ curl -F "file=@/absolute/path/to/image.png" <url>
Mais PHP a introduit une nouvelle classe CURLFile depuis la version 5.5 pour pointer vers des fichiers. La classe CURLFile peut également définir en détail des informations supplémentaires telles que les types MIME, les noms de fichiers, etc. qui peuvent apparaître dans les données multipart/form-data. PHP recommande d'utiliser CURLFile pour remplacer l'ancienne syntaxe @
:
curl_setopt(ch, CURLOPT_POSTFIELDS, [ 'file' => new CURLFile(realpath('image.png')), ]);
PHP 5.5 introduit également l'option CURL_SAFE_UPLOAD
, qui peut forcer le module cURL de PHP pour rejeter l'ancienne syntaxe @
, n'accepte que les fichiers de style CURLFile. La valeur par défaut est false pour 5,5 et true pour 5,6.
Mais le piège est le suivant : la syntaxe @
est obsolète dans la version 5.5 et a été directement supprimée dans la version 5.6 (une ErorException sera générée : l'utilisation de l'API @filename
pour le téléchargement de fichiers est obsolète. Veuillez utilisez plutôt la classe CURLFile).
Pour PHP 5.6+, définir manuellement CURL_SAFE_UPLOAD
sur false est inutile. Cela n'est pas littéralement compris comme "le définir sur false activera l'ancienne méthode non sécurisée" - l'ancienne méthode a complètement cessé d'exister en tant que syntaxe obsolète. PHP 5.6+ == CURLFile uniquement, ne vous faites pas d'illusions.
Mon environnement de déploiement est 5.4 (@Syntax uniquement), mais mon environnement de développement est 5.6 (CURLFile uniquement). Aucun des deux n'est axé sur la version 5.5, une version transitoire prise en charge par les deux. Par conséquent, deux ensembles de codes portant sur le jugement environnemental doivent être rédigés.
Maintenant, voici le problème...
Jugement environnemental : Attention au chiffre magique !
J'ai vu ce genre de code de jugement environnemental :
if (version_compare(phpversion(), '5.4.0') >= 0)
Mon évaluation de ce genre de code Il n'y a qu'un seul mot : merde.
Ce jugement tombe dans un piège typique des nombres magiques. Le numéro de version apparaît inexplicablement dans le code. Sans vérifier longtemps le manuel PHP et l'historique des mises à jour, il est difficile de comprendre sur quel changement de fonction l'auteur est bloqué.
Le code doit retourner à ses racines. Nos besoins réels sont en fait : utiliser CURLFile en premier, sans régresser vers la syntaxe traditionnelle @
. Voici donc le code :
if (class_exists('\CURLFile')) { $field = array('fieldname' => new \CURLFile(realpath($filepath))); } else { $field = array('fieldname' => '@' . realpath($filepath)); }
Des options de dégradation explicitement spécifiées sont recommandées
D'un point de vue fiable, il est recommandé de spécifier la valeur de CURL_SAFE_UPLOAD
pour indiquer clairement à PHP s'il doit tolérer ou interdire l'ancienne syntaxe @
. Notez que la constante CURLOPT_SAFE_UPLOAD
elle-même peut ne pas exister dans les versions inférieures de PHP. Vous devez déterminer :
if (class_exists('\CURLFile')) { curl_setopt($ch, CURLOPT_SAFE_UPLOAD, true); } else { if (defined('CURLOPT_SAFE_UPLOAD')) { curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false); } }
la constante. ordre des paramètres des options cURL
Qu'il s'agisse curl_setopt()
unique ou curl_setopt_array()
lot, les options de cURL sont toujours définies pour prendre effet une par une, et les options définies affecteront immédiatement cURL lors de la définition des options suivantes.
Par exemple, CURLOPT_SAFE_UPLOAD
est lié au comportement de CURLOPT_POSTFIELDS
. Si CURLOPT_POSTFIELDS
est défini en premier puis CURLOPT_SAFE_UPLOAD
est défini, la contrainte de ce dernier ne prendra pas effet. Parce que lors de la configuration du premier, cURL a déjà terminé la lecture et le traitement proprement dit des données !
CURL propose plusieurs options qui présentent cet écueil, alors soyez prudent. Heureusement, il n'existe pas beaucoup d'options pour ce type de "dépendance", et le mécanisme n'est pas compliqué, il peut donc être géré simplement. Ma méthode consiste d'abord à définir toutes les options par lots, puis à utiliser des curl_exec()
paramètres uniquescurl_setopt()
jusqu'à juste avant CURLOPT_POSTFIELDS
.
En effet, dans le tableau utilisé par curl_setopt_array()
, il est garanti que la position de CURLOPT_POSTFIELDS
est fiable à la fin. Les tableaux associatifs de PHP sont garantis séquentiellement. Nous pouvons également supposer que l'ordre d'exécution interne de curl_setopt_array()
doit être dans l'ordre du début à la fin (enfin, je sais que supposer n'est pas une bonne chose, mais certains faits sont trop simples, laissez-moi vous expliquer. Ceci est une affirmation minimale), vous pouvez donc être rassuré.
Mon approche consiste simplement à ajouter une assurance supplémentaire aux performances du code, en soulignant l'importance de l'ordre pour éviter de futures tricheries.
Espace de noms
Les versions PHP 5.2 ou inférieures n'ont pas d'espaces de noms. Si le délimiteur d'espace est utilisé dans le code, une erreur d'analyse se produira. Il est en fait facile de penser à s'occuper de PHP 5.2, il suffit d'abandonner l'espace de noms.
Ce qu'il convient de noter, c'est que PHP 5.3+ a des espaces de noms. Que vous appeliez CURLFile ou que vous utilisiez class_exists()
pour déterminer l'existence de CURLFile, il est recommandé d'écrire CURLFile
pour spécifier clairement l'espace de niveau supérieur afin d'éviter que le code ne plante lorsqu'il est encapsulé dans l'espace de noms.
document cURL compatible avec php5 et php7Analyse de la méthode d'implémentation des requêtes de bloc PHP
Compétences phpExemple de fonction de téléchargement de fichiers, analyse de compétences php
Algorithme de demi-recherche PHP, exemple d'analyse, compétences php
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!