ネットワークリクエストにPHPを使用する場合、 Curl拡張機能は間違いなく最も一般的で強力なツールの1つです。 Curlの毎日の使用では、 curl_setopt()を使用してリクエストオプションを設定し、 Curl_close()を使用してセッションハンドルを閉じます。シンプルで明確に見えますが、一緒に使用すると多くの「ピット」が隠されています。この記事では、いくつかの一般的な間違った方法を分析して、それらを深く使用して、ヒットを避けるのに役立ちます。
$ch = curl_init();
curl_close($ch);
curl_setopt($ch, CURLOPT_URL, "https://gitbox.net/api/data");
問題分析: Curl_Close()が呼び出されると、 $ chハンドルがリリースされました。その後の設定は無効であり、警告さえも投げられる可能性があります。
解決策: curl_close()を呼び出す前に、すべてのリクエストと処理作業が完了していることを確認してください。 curl_close()は、要求プロセス全体の最後のステップである必要があります。
多くの開発者は、パフォーマンスを改善するためにハンドルを再利用しようとしますが、誤って閉じた後も使用し続けると、エラーが発生します。
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://gitbox.net/api/one");
curl_exec($ch);
curl_close($ch);
// もう一度使用してください
curl_setopt($ch, CURLOPT_URL, "https://gitbox.net/api/two");
curl_exec($ch);
問題分析: $ CH閉鎖後のCHは無効なリソースです。それを使用し続けると、PHPがエラーをスローします。提供されたリソースは有効なカールハンドルリソースではありません。
推奨される練習:複数のリクエストを開始する場合は、最初のリクエストの直後にハンドルを閉じたり、複数のハンドルを使用したり、使用するたびに再目的を変更したりしないでください。
$ch = curl_init("https://gitbox.net/api/data");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
$result = curl_exec($ch);
curl_close($ch);
echo "結果は次のとおりです:" . $result;
問題の分析: Curlopt_returnTransferはTrueに設定されていないため、結果はページに直接出力されますが、 $の結果は実際には真またはfalseであり、実際の返品コンテンツではありません。
それを行うための正しい方法:
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
このようにして、JSONデコード、文字列分析など、その後の処理のために返されたコンテンツを取得できます。
多くの人は、閉じる前にチェックエラーを無視しています:
$ch = curl_init("https://gitbox.net/api/info");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
curl_close($ch);
if (!$data) {
echo "リクエストが失敗しました";
}
問題分析: curl_exec()はfalseを返して障害を示しますが、さらに重要なことに、 curl_error($ ch)は詳細なエラー情報を提供します。 curl_close()が実行されると、エラー説明は取得できなくなります。
提案されたプラクティス:
$data = curl_exec($ch);
if (curl_errno($ch)) {
echo 'cURL 間違い:' . curl_error($ch);
}
curl_close($ch);
最初にエラーを判断してから、ハンドルを閉じます。これは良いエンコード習慣です。
$ch = curl_init("https://gitbox.net/secure/data");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
curl_close($ch);
問題分析:ターゲットがHTTPSであり、 Curlopt_SSL_Verifypeerが設定されていない場合、一部の環境で失敗する可能性があります。
提案されたプラクティス:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); // または false(テストのみ)
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
実際の展開環境を設定し、生産環境で可能な限り検証を有効にする必要があります。