ホームページ >バックエンド開発 >PHPチュートリアル >PHP5.0~5.6 各バージョンの互換性 cURLファイルアップロード機能例分析 PHPスキル

PHP5.0~5.6 各バージョンの互換性 cURLファイルアップロード機能例分析 PHPスキル

jacklove
jackloveオリジナル
2018-06-25 16:53:481512ブラウズ

この記事では、主に、PHP 5.0 ~ 5.6 のさまざまなバージョンの互換性の cURL ファイル アップロード機能を紹介し、PHP のさまざまな一般的なバージョンの CURL ファイル アップロード操作に関連する実装スキルと注意事項を例の形で分析します。次へ

この記事の例では、PHP5.0 ~ 5.6 の各バージョンの cURL ファイルアップロード機能の互換性を分析します。参考のために皆さんと共有してください。詳細は次のとおりです。

最近の要件は、PHP を通じて cURL を呼び出して、multipart/form-data 形式でファイルをアップロードすることです。いくつかの落とし穴があれば、記事としては十分です。

#重要な警告

PHP の中国語の公式ドキュメントは読まないでください。バージョンが追いつかないと死んでしまいます!

PHP の異なるバージョン間の cURL の違い

PHP の cURL は、連想配列を

CURL_POSTFIELDS に渡すことをサポートしています(その間文字列ではありません) を使用して、multipart/form-data に対する POST リクエストを生成します。

従来、PHP の cURL は、cURL が読み取りおよびアップロードするための配列データ内で「@ file full path」構文を使用することによるファイルの添付をサポートしていました。これは、コマンド ラインから cURL プログラムを直接呼び出すための構文と一致しています:

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

equals

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

しかし、PHP は 5.5 以降、ファイルを指すための新しい CURLFile クラスを導入しました。 CURLFile クラスは、multipart/form-data データに表示される MIME タイプ、ファイル名などの追加情報を詳細に定義することもできます。 PHP では、古い

@ 構文の代わりに CURLFile を使用することをお勧めします。

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

PHP 5.5 では、

CURL_SAFE_UPLOAD オプションも導入されています。これにより、PHP の cURL モジュールが古い @ 構文を拒否し、CURLFile スタイルのファイルのみを受け入れるように強制できます。デフォルト値は、5.5 の場合は false、5.6 の場合は true です。

しかし、落とし穴は次のとおりです。

@ 構文は 5.5 で非推奨となり、5.6 では直接削除されました (ElorException が生成されます: @ filename の使用法)ファイルアップロード用の API は廃止されました。代わりに CURLFile クラスを使用してください。

PHP 5.6 の場合、

CURL_SAFE_UPLOAD を手動で false に設定しても意味がありません。これは文字通り「安全でない古いメソッドを有効にするために false に設定する」とは理解されません。古いメソッドは廃止された構文として完全に存在しなくなりました。 PHP 5.6 == CURLFile のみ、幻想を抱かないでください。

私の展開環境は 5.4 (

@Syntax のみ ) ですが、開発環境は 5.6 (CURLFile のみ) です。どちらも、両方がサポートする移行バージョンである 5.5 には焦点を当てていないため、環境判断を備えた 2 セットのコードを作成する必要があります。

ここで問題が起こります...

環境判断: マジックナンバーに注意してください!

この種の環境判断コードを見たことがあります:

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

この種の評価は 1 つだけです。コードワード: たわごと。

この判断は、典型的なマジックナンバーの罠に陥ります。コード内にバージョン番号が不可解に表示されるため、PHP マニュアルや更新履歴を長時間確認しないと、作成者がどの機能変更に引っかかっているのかを理解するのは困難です。

コードは原点に戻る必要があります。実際のニーズは、従来の

@ 構文に戻らずに、最初に CURLFile を使用することです。次にコードが続きます:

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));
}

推奨される明示的に指定された劣化オプション

From a信頼性の高い観点から、

CURL_SAFE_UPLOAD の値を指定して、古い @ 構文を許容するか禁止するかを PHP に明確に指示することをお勧めします。 CURLOPT_SAFE_UPLOAD 定数自体は、PHP の以前のバージョンには存在しない可能性があることに注意してください。

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);
  }
}

## を判断する必要があります。 #cURL オプションの設定 順序

curl_setopt()

single または curl_setopt_array()batch のどちらであっても、cURL オプションは常に 1 に設定されます。 1 つずつ変更すると有効になり、オプションを設定すると、後続のオプションを設定するときの cURL の動作にすぐに影響します。 たとえば、

CURLOPT_SAFE_UPLOAD

は、CURLOPT_POSTFIELDS の動作に関連しています。 CURLOPT_POSTFIELDS が最初に設定され、次に CURLOPT_SAFE_UPLOAD が設定された場合、後者の制約は有効になりません。なぜなら、前者を設定すると、cURL はデータの実際の読み取りと処理をすでに完了しているからです。 cURL には、この落とし穴のあるオプションがいくつかあるため、注意してください。幸いなことに、この種の「依存関係」には選択肢は多くなく、仕組みも複雑ではないため、簡単に扱うことができます。私の方法は、最初にすべてのオプションをバッチで設定し、次に

curl_setopt()

シングルショット設定 CURLOPT_POSTFIELDScurl_exec() の直前まで使用することです。 <p>実際、<code>curl_setopt_array() で使用される配列では、後方の CURLOPT_POSTFIELDS の位置も信頼できることが保証されています。 PHP の連想配列はシーケンシャルであることが保証されており、curl_setopt_array() の内部実行順序は最初から最後まで順番である必要があると仮定することもできます (そう仮定するのが良いことではないことはわかっていますが、一部は正しいと仮定します)。単純すぎますので、最低限の主張はしておきます)ので、ご安心ください。

私のアプローチは、コードのパフォーマンスにさらなる保険を追加し、将来の不正行為を防ぐための順序の重要性を強調することです。

名前空間

PHP バージョン 5.2 以前には名前空間がありません。コード内でスペース区切り文字 \ が使用されている場合、パーサー エラーが発生します。 PHP 5.2 を扱うのは実際には簡単で、名前空間を放棄するだけです。

注目すべきは、名前空間を備えた PHP 5.3 です。 CURLFile を呼び出すか、class_exists() を使用して CURLFile の存在を確認するかにかかわらず、コードがクラッシュするのを防ぐために、トップレベルのスペースを明確に指定するために \CURLFile を記述することをお勧めします。名前空間にラップされます。

#興味があるかもしれない記事:

php5 および php7 と互換性のある cURL ドキュメントPHP ブロック クエリ実装方法の分析

phpスキルファイルアップロード機能のインスタンス解析phpスキル

PHPハーフ検索アルゴリズム例解析phpスキル

以上がPHP5.0~5.6 各バージョンの互換性 cURLファイルアップロード機能例分析 PHPスキルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。