私はクレジットカード処理の設定に取り組んでおり、CURLの回避策を使用する必要がありました。次のコードは、テストサーバー(SSL URLを呼び出していません)を使用している場合は正常に機能していましたが、HTTPSを使用して作業サーバーでテストすると、「ストリームを開くことができませんでした」というエラーメッセージで失敗します。
function send($packet, $url) {
$ctx = stream_context_create(
array(
'http'=>array(
'header'=>"Content-type: application/x-www-form-urlencoded",
'method'=>'POST',
'content'=>$packet
)
)
);
return file_get_contents($url, 0, $ctx);
}
次のスクリプトを試して、PHPスクリプトで使用できるhttpsラッパーがあるかどうかを確認してください。
$w = stream_get_wrappers();
echo 'openssl: ', extension_loaded ('openssl') ? 'yes':'no', "\n";
echo 'http wrapper: ', in_array('http', $w) ? 'yes':'no', "\n";
echo 'https wrapper: ', in_array('https', $w) ? 'yes':'no', "\n";
echo 'wrappers: ', var_export($w);
出力は次のようになります
openssl: yes
http wrapper: yes
https wrapper: yes
wrappers: array(11) {
[...]
}
Httpsラッパーを許可するには:
php_openssl
拡張が存在し、有効になっている必要がありますallow_url_fopen
はon
に設定する必要がありますPhp.iniファイルに、次の行が存在しない場合は追加する必要があります。
extension=php_openssl.dll
allow_url_fopen = On
以下を試してください。
function getSslPage($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_REFERER, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
注:これにより、SSL検証が無効になります。つまり、HTTPSが提供するセキュリティが失われますです。このコードは、テスト/ローカル開発、インターネット上ではない、またはその他の公共向けネットワークにのみ使用してください。このコードが機能する場合は、SSL証明書が信頼されていないか、検証できないことを意味します。別の問題として修正を検討する必要があります。
$url= 'https://example.com';
$arrContextOptions=array(
"ssl"=>array(
"verify_peer"=>false,
"verify_peer_name"=>false,
),
);
$response = file_get_contents($url, false, stream_context_create($arrContextOptions));
これにより、HTTPSであるかどうかにかかわらず、URLからコンテンツを取得できます
これは、おそらくターゲットサーバーに有効なSSL証明書がないためです。
Php.iniファイルに2行追加するだけです。
extension=php_openssl.dll
allow_url_include = On
私のために働いています。
HTTPSは、OpenSSLのサポートでコンパイルした場合、PHP 4.3.0以降でサポートされます。また、ターゲットサーバーに有効な証明書があり、ファイアウォールがアウトバウンド接続を許可し、php.iniのallow_url_fopen
がtrueに設定されていることを確認してください。
同じエラーが発生しました。 allow_url_include = On
でphp.ini
を設定すると、修正されました。
私の場合、この問題は、Apacheとは異なるCLI用のphp.iniを使用するWAMPが原因であったため、WAMPメニューで行った設定はCLIに適用されません。 CLI php.iniを変更するだけで機能します。
サーバーは、httpリクエストヘッダーに表示される内容または表示されない内容(適切なユーザーエージェントなど)に基づいて応答しないことを選択する場合があります。ブラウザーに接続できる場合は、ブラウザーが送信するヘッダーを取得し、ストリームコンテキストでそれらを模倣します。