Проблема в этом. Я провел тщательное исследование решений в отношении этого, и я знаю, что есть темы для этого, и я следил за ними тоже, и ничего не сработало. Это, как говорится, я точно перечислю все, что я сделал до сих пор. Я запускаю PHP 5.2.14 с Zend Debugging в последней версии Eclipse на моем компьютере под управлением Windows XP. У меня 1 ГБ ОЗУ. У меня XAMPP работает с Apache, MySQL и FileZilla.
На XAMPP я сделал следующее (во время этих изменений Apache отключился): нажал на Admin из панели управления XAMPP и перешел на https:// localhost/xampp/
. Оттуда я принял сертификаты из этой строки на странице приветствия:
Для поддержки OpenSSL используйте тестовый сертификат с https: // 127.0.0.1 или https: // localhost.
В этом же разделе я проверил phpinfo()
. В разделе «Окружающая среда» SERVER["HTTPS"]
. В разделе «Apache Environment» HTTPS
. В разделе «Переменные PHP» параметр _SERVER["HTTPS"]
On
. В разделе «Phar» OpenSSL support
disabled
(установите ext / openssl). Я не знаю, как включить Phar.
Теперь о самих файлах в C: \ xampp, я пошел в папку PHP. Под производством и разработкой файлов php.ini (лучше безопасно, чем извините), у меня есть allow_url_fopen=On
, allow_url_include=On
, и я удалил точку с запятой, так что extension=php_openssl.dll
больше не комментируется. Я даже подтвердил, что .dll находится в папке ext папки PHP. Оба файла libeay32.dll и ssleay32.dll находятся в папках PHP и Apache. Папка Apache не содержит файлов производительности или разработки php.ini.
Я пошел на http://www.slproweb.com/products/Win32OpenSSL.html и установил Win32 OpenSSL v1.0.0d для безопасной меры.
Теперь строка кода, о которой идет речь в моем файле retrieve_website.php, выглядит так:
$urlquery = "https://www.googleapis.com/customsearch/v1?key=".$appid."&cx=".$google_searchid."&q=".$query."&alt=atom&num=".$results; $xmlresults = file_get_contents($urlquery);
У меня есть два других веб-сайта, которые я запрашиваю, но они обслуживаются через HTTP, и они работают нормально. У меня также есть эта строка кода, введенная в конце скрипта:
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_dump($w);
Когда я запускаю его как скрипт PHP на Eclipse, все выводит отлично, как я хочу, вместе с этими результатами:
openssl: yes http wrapper: yes https wrapper: yes wrappers: array(10) { [0]=> string(5) "https" [1]=> string(4) "ftps" [2]=> string(3) "php" [3]=> string(4) "file" [4]=> string(4) "data" [5]=> string(4) "http" [6]=> string(3) "ftp" [7]=> string(13) "compress.zlib" [8]=> string(14) "compress.bzip2" [9]=> string(3) "zip" }
Несмотря на все эти изменения, которые я сделал (после того, как я начал Apache), я все равно получаю те же ошибки при первом доступе к моему скрипту PHP в Eclipse и Firefox через http: //localhost/tutorial/retrieve_website.php :
Предупреждение: file_get_contents () [function.file-get-contents]: Не удалось найти оболочку «https» – вы забыли включить ее при настройке PHP? в C: \ xampp \ htdocs \ tutorial \ retrieve_website.php в строке 29
Предупреждение: file_get_contents (https: // www.googleapis.com/customsearch/v1?key= удаленный идентификатор API и cx = удаленный идентификатор поиска & q = + Devil + go + down + to + Georgia & alt = atom & num = 5) [function.file -get-contents]: не удалось открыть поток: нет такого файла или каталога в C: \ xampp \ htdocs \ tutorial \ retrieve_website.php в строке 29
Предупреждение: DOMDocument :: loadXML () [domdocument.loadxml]: пустая строка, предоставленная в качестве входа в C: \ xampp \ htdocs \ tutorial \ retrieve_website.php в строке 33
openssl: no http wrapper: yes https wrapper: no wrappers: array (10) {[0] => string (3) "php" [1] => string (4) "file" [2] => string (4 ) «glob» [3] => строка (4) «данные» [4] => строка (4) «http» [5] => строка (3) «ftp» [6] => строка (3) " zip "[7] => string (13)" compress.zlib "[8] => string (14)" compress.bzip2 "[9] => string (4)" phar "}
Что я забыл или не сделал? Насколько мне известно, я сделал все, что я исследовал относительно HTTPS и OpenSSL
Я решил его в XAMPP, раскомментируя ;extension=php_openssl.dll
в /apache/bin/php.ini
несмотря на то, что phpinfo () говорит мне, что /php/php.ini
был загруженным ini-файлом.
EDIT: Я думаю, что ответ Ezra – лучшее решение, непосредственно добавляющее линию расширения к соответствующему ini-файлу.
Мне пришлось добавить extension=php_openssl.dll
в файл php.ini
расположенный в xampp/php/php.ini
. Как-то его там не было, после добавления его и перезапуска Apache все работало нормально.
просто добавьте две строки в файл php.ini.
extension=php_openssl.dll allow_url_include = On
он работает для меня.
Возможно, ваш Apache не скомпилирован с поддержкой SSL. В любом случае используйте cURL вместо file_get_contents. Попробуйте этот код, если он терпит неудачу, я прав.
function curl_get_contents($url) { $curl = curl_init($url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0); $data = curl_exec($curl); curl_close($curl); return $data; }
Я включил расширение openssl, и он работает для меня 🙂
; расширение = php_openssl.dll
в
расширение = php_openssl.dll
В моем случае проблема была связана с WAMP с использованием другого php.ini для CLI, чем Apache, поэтому ваши настройки, сделанные в меню WAMP, не относятся к CLI. Просто измените CLI php.ini, и он работает.
в OpenSuse 12.1 требовалось только следующее:
zypper in php5-openssl
Вместо этого вы можете использовать эту функцию.
function get_url_contents($url){ if (function_exists('file_get_contents')) { $result = @file_get_contents($url); } if ($result == '') { $ch = curl_init(); $timeout = 30; curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); $result = curl_exec($ch); curl_close($ch); } return $result; }
Для меня мне пришлось раскомментировать эти строки в php.ini:
extension=php_openssl.dll extension_dir = "ext"
«ext» применим, если php_openssl.dll находится в папке «ext».
Примечание. Мне пришлось сделать это для двух моих файлов php.ini, иначе это не сработало. Один находится в папке установки vs.php, а другой – в папке PHP
C:\Program Files (x86)\Jcx.Software\VS.Php\2013\Php 5.6 C:\Program Files (x86)\PHP\v5.6
Источник
После того, как я проверил весь день, я понял ответ благодаря этому руководству: http://piwigo.org/forum/viewtopic.php?id=15727
В основном под Eclipse -> Windows -> Preferences -> PHP Executables, есть раздел, на котором ссылаются .exe и .ini. По умолчанию они были в каталоге Eclipse, когда вы устанавливаете функцию SDK для инструментов разработки PHP из Eclipses Install New Software в меню «Справка».
Поэтому вместо этого я добавил новый исполняемый файл под названием PHP 5.3.5 (CGI) и ссылался на cgi.exe и .ini из папки php xampp.
Спасибо webarto за то, что уделили вам время, чтобы помочь мне.
Попробуй это:
function curl($url){ $curl = curl_init($url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0); **$buffer = curl_exec($curl);** curl_close($curl); **return $buffer;** }
На MAC AMPPS я обновил php-5.5.ini следующим образом, и теперь он работает.
allow_url_include = On extension=openssl.so
Я тоже получил эту ошибку. Я понял, что в моей версии PHP не было скомпилировано openssl, поэтому просто добавить директиву расширения в php.ini было недостаточно. Я не знаю, как вы должны решить это в своем конкретном случае, но для меня я использую macports, и команда была просто:
sudo port install php5-openssl
Я использую opsenSUSE Leap, и у меня была такая же проблема – это означает, что OpenSSL не поддерживается. Вот как я это решил:
sudo service apache2 restart
Вот и все, все готово.