PHP file_get_contentsで、リモートホストから取得出来ない場合の代替関数サンプル POSTもあるよ

ネタ元

file_get_contents()でURLから取得できないサーバーがあるんですよー

function curl_get_contents($url){
    // 「scheme://」の形式でないならローカルファイルとみなす
    if (!preg_match('/^[a-z][a-z0-9+\-.]+:\/\//i', $url)) {
        return file_get_contents($url);
    }

    // それ以外は従来通り cURL で取得
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT'] ?? 'Mozilla/5.0');

    // テスト環境用:SSL証明書の検証をスキップ
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // ←★これが重要
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // ←★これも重要

    $response = curl_exec($ch);
    if ($response === false) {
        error_log("[ERROR] curl_exec failed: " . curl_error($ch));
    } else {
        error_log("[LOG] curl_exec succeeded: $url");
    }
    curl_close($ch);
    return $response;
}

サーバー切り替え中テストでhostsでIPを切り替えてると
SSL証明書と実IPが一致しておらず、ブラウザでは「保護されていない接続」扱いになります。
PHP の cURL は デフォルトでSSL証明書の検証を強制するため、接続に失敗します(= curl_exec() が false を返す)
なので切り替えテストのときだけは SSL証明書の検証をスキップ する処理をいれておくこと。


POST送る場合はこちらを参考に。

$POST_DATA = array(
    'foo' => 'bar'
);
$curl=curl_init("URL");
curl_setopt($curl,CURLOPT_POST, TRUE);
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($POST_DATA));
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER, FALSE);  // オレオレ証明書対策
curl_setopt($curl,CURLOPT_SSL_VERIFYHOST, FALSE);  // 
curl_setopt($curl,CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl,CURLOPT_COOKIEJAR,      'cookie');
curl_setopt($curl,CURLOPT_COOKIEFILE,     'tmp');
curl_setopt($curl,CURLOPT_FOLLOWLOCATION, TRUE); // Locationヘッダを追跡

$output= curl_exec($curl);

ネタ元

qiita.com