Я запускаю PHP 5.2.6 в Windows, у меня есть extension=php_curl.dll
и extension=php_openssl.dll
в php.ini; как таковой, я вижу в 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, я думал, что я включу его здесь в любом случае для полноты.
То, что я хочу сделать, просто: сделайте запрос POST на другой сервер через SSL, используя fsockopen
.
Мой код до сих пор таков:
$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
остается $errstr
0
, а $errstr
получает значение php_network_getaddresses: getaddrinfo failed: No such host is known.
, Я знаю, что это не проблема с сервером, или опечатка в имени хоста и т. Д., Потому что он работает, если я перехожу через порт 80 безотказно. Проблемы возникают только при попытке перейти на SSL.
Что я делаю, чтобы заставить это работать?
Это может показаться очевидным, но попробовали ли вы это?
if ($fp = fsockopen('ssl://'. $host, 443, $errno, $errstr, 30)) {
Я не уверен, требуется ли //
или нет, но в примерах ssl
и tls
на странице PHP Internet Transports есть их.
PS У меня также есть «вещь» о включенных переменных в строках, в случае, если вам интересно, почему она теперь использует конкатенацию строк.