私はWindowsでPHP 5.2.6を実行していますが、php.iniでextension=php_curl.dll
とextension=php_openssl.dll
のコメントが外されています。そのため、phpinfo
:
curl
cURL support enabled
cURL Information libcurl/7.16.0 OpenSSL/0.9.8g zlib/1.2.3
openssl
OpenSSL support enabled
OpenSSL Version OpenSSL 0.9.8g 19 Oct 2007
これにcURLを有効にすることが不可欠かどうかはわかりませんが、OpenSSLについて言及しているので、完全を期すためにここに含めると思いました。
私がやりたいのは簡単です。fsockopen
を使用してSSL経由で別のサーバーにPOSTリクエストを送信します。
これまでの私のコードは次のとおりです。
$Host = 'www.redacted.com';
$data = 'user=redacted&pass=redacted&action=redacted';
$response = "";
if ( $fp = fsockopen("ssl:{$Host}", 443, $errno, $errstr, 30) ) {
$msg = 'POST /wsAPI.php HTTP/1.1' . "\r\n";
$msg .= 'Content-Type: application/x-www-form-urlencoded' . "\r\n";
$msg .= 'Content-Length: ' . strlen($data) . "\r\n";
$msg .= 'Host: ' . $Host . "\r\n";
$msg .= 'Connection: close' . "\r\n\r\n";
$msg .= $data;
if ( fwrite($fp, $msg) ) {
while ( !feof($fp) ) {
$response .= fgets($fp, 1024);
}
}
fclose($fp);
} else {
$response = false;
}
もちろん、これは$Host
を渡してポート80を使用すれば問題なく機能します。しかし、これをSSL経由で送信する必要があり、現在は機能していません。 $response
はfalse
に設定され、$errno
は0
に留まり、$errstr
はphp_network_getaddresses: getaddrinfo failed: No such Host is known.
に設定されます。ポート80を安全に経由しなくても機能するため、サーバーのダウンやホスト名のタイプミスなどの問題ではないことを私は知っています。 SSLに切り替えようとすると、問題が発生します。
これを機能させるにはどうすればよいですか?
これは明白に聞こえるかもしれませんが、代わりにこれを試しましたか?
if ($fp = fsockopen('ssl://'. $Host, 443, $errno, $errstr, 30)) {
//
が必要かどうかはわかりませんが、 PHPインターネットトランスポートページ のssl
とtls
の例にあります。
P.S.なぜ今文字列連結を使用しているのか疑問に思われるかもしれませんが、文字列に含まれる変数についても「何か」があります。