Không thể tìm thấy trình bao bọc https https - bạn có quên bật nó khi bạn định cấu hình PHP không?


143

Vấn đề là trong câu hỏi. Tôi đã thực hiện một cuộc điều tra kỹ lưỡng cho các giải pháp liên quan đến vấn đề này và tôi biết có những chủ đề cho vấn đề này và tôi cũng đã theo dõi chúng và không có gì hiệu quả. Điều đó được nói rằng tôi sẽ liệt kê chính xác mọi thứ tôi đã làm cho đến nay. Tôi đang chạy PHP 5.2.14 với Zend Debugging trên phiên bản Eclipse mới nhất trên máy tính Windows XP của tôi. Tôi có RAM 1 GB. Tôi đã cài đặt XAMPP với Apache, MySQL và FileZilla.

Trên XAMPP tôi đã thực hiện các thao tác sau (Apache đã tắt trong những thay đổi này): Nhấp vào Quản trị viên từ Bảng điều khiển XAMPP và đi đến https:// localhost/xampp/. Từ đó tôi chấp nhận các certs từ dòng này trên trang chào mừng:

Để được hỗ trợ OpenSSL, vui lòng sử dụng chứng chỉ kiểm tra với https: // 127.0.0.1 hoặc https: // localhost.

Trên cùng một phần tôi đã kiểm tra phpinfo(). Trong "Môi trường", SERVER["HTTPS"]on. Trong phần 'Môi trường Apache', HTTPSOn. Trong 'Biến PHP, _SERVER["HTTPS"]On. Trong 'Phar', OpenSSL supportdisabled(cài đặt ext / openssl). Tôi không biết cách kích hoạt Phar.

Bây giờ liên quan đến các tệp trong C: \ xampp, tôi đã chuyển đến thư mục PHP. Theo cả hai sản xuất và phát triển các file php.ini (tốt hơn an toàn hơn xin lỗi), tôi có allow_url_fopen=On, allow_url_include=Onvà tôi loại bỏ các dấu chấm phẩy, do đó extension=php_openssl.dllkhông còn được nhận xét ra. Tôi thậm chí đã xác nhận rằng các dll nằm trong thư mục ext của thư mục PHP. Cả libeay32.dll và ssleay32.dll đều có trong các thư mục PHP và Apache. Thư mục Apache không chứa các tệp php.ini sản xuất hoặc phát triển.

Tôi đã truy cập http://www.slproweb.com/products/Win32OpenSSL.html và cài đặt Win32 OpenSSL v1.0.0d để có biện pháp an toàn.

Bây giờ, dòng mã được đề cập trong lấy_website.php của tôi trông như thế này:

$urlquery = "https://www.googleapis.com/customsearch/v1?key=".$appid."&cx=".$google_searchid."&q=".$query."&alt=atom&num=".$results;
$xmlresults = file_get_contents($urlquery);

Tôi có hai trang web khác mà tôi truy vấn nhưng chúng được phục vụ qua HTTP và chúng hoạt động tốt. Tôi cũng có dòng mã này được nhập vào gần cuối tập lệnh:

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);

Khi tôi chạy nó dưới dạng PHP Script trên Eclipse, mọi thứ đều hoàn toàn tốt theo cách tôi muốn cùng với các kết quả này:

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"
}

Bất chấp tất cả những thay đổi tôi đã thực hiện (sau khi tôi khởi động Apache), tôi vẫn gặp lỗi tương tự khi lần đầu tiên tôi truy cập tập lệnh PHP của mình trong Eclipse và Firefox qua http: //localhost/tutorial/retrieve_website.php :

Cảnh báo: file_get_contents () [function.file-get-nội dung]: Không thể tìm thấy trình bao bọc "https" - bạn có quên bật nó khi bạn định cấu hình PHP không? trong C: \ xampp \ htdocs \ guide \ lấy_website.php trên dòng 29

Cảnh báo: file_get_contents (https: // www.googleapis.com/customsearch/v1?key= ID API đã xóa & cx = đã xóa ID tìm kiếm & q = The + Devil + đi + xuống + xuống + Georgia & alt = nguyên tử & num = 5) [function.file-get-nội dung]: không thể mở luồng: Không có tệp hoặc thư mục như vậy trong C: \ xampp \ htdocs \ guide \ lấy_website.php trên dòng 29

Cảnh báo: DOMDocument :: loadXML () [domdocument.loadxml]: Chuỗi rỗng được cung cấp làm đầu vào trong C: \ xampp \ htdocs \ guide \ lấy_website.php trên dòng 33

openssl: no http Wrapper: yes https Wrapper: no Wrappers: Array (10) {[0] => chuỗi (3) "php" [1] => chuỗi (4) "file" [2] => chuỗi (4 ) "global" [3] => chuỗi (4) "data" [4] => chuỗi (4) "http" [5] => chuỗi (3) "ftp" [6] => chuỗi (3) " zip "[7] => chuỗi (13)" nén.zlib "[8] => chuỗi (14)" nén.bzip2 "[9] => chuỗi (4)" phar "}

Tôi đã bỏ qua hoặc thất bại để làm gì? Theo hiểu biết của riêng tôi, tôi đã làm mọi thứ mà tôi đã nghiên cứu về HTTPS và OpenSSL

Câu trả lời:


183

Tôi giải quyết nó trong XAMPP bởi uncommenting ;extension=php_openssl.dlltrong /apache/bin/php.ini mặc dù phpinfo () nói với tôi /php/php.inilà file ini tải.

EDIT: Tôi đoán Ezra trả lời là giải pháp tốt nhất trực tiếp thêm dòng mở rộng vào tệp ini thích hợp.


1
Bạn có chắc chắn rằng /apache/bin/php.ini, tôi không thể tìm thấy nó trong XAMPP Portable Light 1.8.1? Tuy nhiên php/php.initồn tại, nhưng cho phép ssl ở đây không phải không giúp đỡ :(
vine'th

1
câu trả lời này sau đó sẽ tạo ra một vấn đề khác bởi vì openssl hiện đã bị vô hiệu hóa và sẽ gây ra lỗi nếu tôi get_file_contents một liên kết được bảo mật
thedjaney 26/07/13

5
Đối với tôi đó là xampp/php/php.ini:) cảm ơn, PS: ĐỪNG QUÊN ĐẾN NHÀ HÀNG APACHE SAU KHI THAY ĐỔI THAY ĐỔI
jave.web

97

Tôi đã phải thêm extension=php_openssl.dllvào php.initập tin của tôi nằm ở xampp/php/php.ini. Bằng cách nào đó nó không có ở đó, sau khi thêm nó và khởi động lại Apache, mọi thứ đều hoạt động tốt.


2
Tôi đã phải thêm dòng, vì nó không có trong php.ini - nhưng sau đó đã thực hiện thủ thuật - cảm ơn!
Q Studio

33

chỉ cần thêm hai dòng trong tệp php.ini của bạn.

extension=php_openssl.dll
allow_url_include = On

nó làm việc cho tôi


7
Tôi đang sử dụng wamp và bạn cần chỉnh sửa php.ini trong thư mục apache thay vì thư mục thông thường trong thư mục PHP: O
Al_

Cảm ơn bạn, nó đã allow_url_include = Ongiải quyết nó cho tôi.
Kiee

Không bật allow_url_include - điều này khiến máy chủ của bạn dễ bị tấn công.
Pascal9x

18

Apache của bạn có thể không được biên dịch với hỗ trợ SSL. Sử dụng cURL thay vì file_get_contents. Hãy thử mã này, nếu nó thất bại thì tôi đúng.

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;
}

1
chạy chức năng curl mà bạn đã cho tôi và thay thế $xmlresults = file_get_contents($urlquery);bằng $xmlresults = curl($urlquery);. PHP Script chạy nó tốt với kết quả tương tự như file_get_contents (). Chạy nó dưới dạng trang web PHP thông qua localhost / guide / lấy_website.php và tôi gặp lỗi này:Fatal error: Call to undefined function curl_init() in C:\xampp\htdocs\tutorial\retrieve_website.php on line 14
John M

1
Vấn đề là probaby trong hỗ trợ SSL, chạy phpinfo () và kiểm tra xem có các lệnh / cờ sau không : '--with-openssl=/usr' '--with-openssl-dir=/usr', về cơ bản bạn cần biên dịch Apache với hỗ trợ SSL, bạn cũng nên bật cURL nhanh hơn vài lần so với FGC và có nhiều tùy chọn. Tôi không biết làm thế nào để làm điều này trên Windows, xin lỗi.
Dejan Marjanović

1
điều duy nhất gần đó là Configure Command ở đầu phpinfo () và không có bất cứ thứ gì có chứa - liên quan đến openssl. nó chứa những thứ khác - với những thứ khác Cập nhật nhỏ: trên localhost, trạng thái đã kiểm tra và thông báo HTTPS (SSL) đã được kích hoạt.
John M

1
Nếu bạn gọi return curl_exec($curl);, điều đó có ngăn cản curl_close($curl);dòng tiếp theo thực thi không?
Jason Plank

12

Tôi đã kích hoạt tính năng mở rộng openssl và nó hoạt động với tôi :)

; extension = php_openssl.dll

đến

tiện ích mở rộng = php_openssl.dll


6

Trong trường hợp của tôi, vấn đề là do WAMP sử dụng php.ini khác cho CLI so với Apache, vì vậy các cài đặt của bạn được thực hiện qua menu WAMP không áp dụng cho CLI. Chỉ cần sửa đổi CLI php.ini và nó hoạt động.


1
Xin chào, bạn đã làm như thế nào, nơi tôi có thể tìm thấy CLI php.ini
botenvouwer

1
Của tôi nằm ở đây:C:\path\to\wamp\bin\php\php5.3.10\php.ini
dtbarne

2
cảm ơn câu trả lời của bạn, tôi nghĩ ở đó có nhiều tệp php.ini. Khi tôi tìm kiếm, tôi chỉ tìm thấy một và tôi không bị lỗi :; extension = php_openssl.dll Nhưng tôi sử dụng xammp Tôi đã nhầm lẫn nó với wamp. Bây giờ nó hoạt động, yeah!
botenvouwer

6

trong OpenSuse 12.1, điều duy nhất cần có là:

zypper in php5-openssl

1
bạn có thể giải thích được không??
Jason W

1
Ý tôi là tôi đã nhận được thông báo lỗi "Không thể tìm thấy trình bao bọc https https - bạn có quên bật nó khi bạn định cấu hình PHP không?" và giải quyết nó bằng cách nhập "zypper trong php5-openssl" vào dòng lệnh. Điều đó đã sửa lỗi.
TheSatinKnight

5

Đối với tôi, tôi đã bỏ ghi chú những dòng này trong php.ini:

extension=php_openssl.dll
extension_dir = "ext"

"ext" có thể áp dụng nếu php_openssl.dll nằm trong thư mục "ext".

Lưu ý: Tôi đã phải làm điều này cho hai tệp php.ini của mình nếu không nó sẽ không hoạt động. Một cái nằm trong thư mục cài đặt vs.php, và cái kia nằm trên thư mục PHP

C:\Program Files (x86)\Jcx.Software\VS.Php\2013\Php 5.6
C:\Program Files (x86)\PHP\v5.6

Nguồn


5

Trên MAC AMPPS, tôi đã cập nhật php-5.5.ini với các mục sau và bây giờ nó hoạt động.

allow_url_include = On
extension=openssl.so

5

Trong trường hợp của tôi (PHP 7.3 trên Windows ở chế độ FastCGI), nó đã không được chú ý extension=openssl. Không phải phần mở rộng = php_ openssl , vì hầu hết mọi người đăng ở đây.

(Điều tương tự đã được đăng ở đây , nhưng không có chi tiết về HĐH có thể là điểm khác biệt chính ở đây.)



4

Sự cố với file_get_contents cho các yêu cầu https trong Windows , bỏ qua các dòng sau trong tệp php.ini:

extension=php_openssl.dll
extension_dir = "ext"

4

Bạn có thể sử dụng chức năng này thay vì nếu cài đặt curl trên hệ thống của bạn:

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;  
}

2

Sau khi rình mò cả ngày, tôi đã tìm ra câu trả lời nhờ vào hướng dẫn này: http://piwigo.org/forum/viewtopic.php?id=15727

Về cơ bản trong Eclipse -> Windows -> Preferences -> PHP Executables, có một phần về nơi .exe và .ini được tham chiếu. Những cái được mặc định nằm trong thư mục Eclipse khi bạn cài đặt Tính năng SDK của Công cụ phát triển PHP từ Eclipses Cài đặt phần mềm mới trong menu Trợ giúp.

Vì vậy, thay vào đó, tôi đã thêm một tệp thực thi mới có tên PHP 5.3.5 (CGI) và tham chiếu cgi.exe và .ini từ thư mục php của xampp.

Cảm ơn bạn webarto đã dành thời gian của bạn để giúp tôi ra ngoài.


2

Tôi đang sử dụng opsenSUSE Leap và tôi cũng gặp vấn đề tương tự - điều đó có nghĩa là không có hỗ trợ cho OpenSSL. Đây là cách tôi giải quyết nó:

  1. Mở YaST.
  2. Đi đến Quản lý phần mềm.
  3. Trong hộp tìm kiếm ở khung bên trái, nhập 'php5-openssl' và nhấn phím quay lại.
  4. Nhấp vào hộp kiểm bên cạnh 'php5-openssl' trong khung bên phải để chọn nó và nhấp vào 'Chấp nhận' (Điều này thêm hỗ trợ OpenSSL).
  5. Khởi động lại Apache: sudo service apache2 restart

Thế là xong, bạn đã hoàn thành.


1

Tôi cũng gặp lỗi này. Tôi phát hiện ra rằng phiên bản PHP của tôi không có openssl được biên dịch, vì vậy chỉ cần thêm lệnh mở rộng vào php.ini là không đủ. Tôi không biết làm thế nào bạn phải giải quyết vấn đề này trong trường hợp cụ thể của bạn, nhưng đối với tôi, tôi sử dụng macports và lệnh chỉ là:

sudo port install php5-openssl

1

Đối với những người sử dụng Winginx (dựa trên nginx thay vì dựa trên Apache), tôi đã sửa nó bằng 4 bước sau:

  1. Trên menu Công cụ, nhấn Cấu hình PHP5 của Winginx (đừng bận tâm đến 5 trong tên ...):

    Cấu hình Winginx PHP5

  2. Chọn phiên bản PHP bạn muốn php.ini thay đổi:

    Lựa chọn phiên bản PHP

  3. Trên tab Tiện ích mở rộng PHP, chọn tiện ích mở rộng php_openssl và nhấn nút Lưu :

    Lựa chọn php_openssl

  4. khởi động lại dịch vụ PHP thích hợp thông qua thanh tác vụ ( Dừngbắt đầu ):

    Khởi động lại dịch vụ PHP


1

Thử cái này:

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;
}


2
Làm thế nào khác với câu trả lời này đã có trong câu hỏi này ?
HPierce

@HPierce nó có 2 dòng sẽ gây ra lỗi cú pháp do toán tử lũy thừa ở đầu và cuối của các dòng đó ... Được gắn cờ để xóa.
CPHPython

@CPHPython Tôi nghĩ rằng họ đã cố gắng sử dụng kiểu in đậm bên trong một khối mã
Nick

1
@CPHPython, Bạn có thể in đậm mã, nhưng bạn phải sử dụng cú pháp khác nhau ... Nếu bạn thực hiện <code> <pre> mã thông thường ... mã đậm bằng * 's </ pre> </ code> bạn sẽ nhận được :-). Rõ ràng tôi đã không biết rằng vào năm 2016 hoặc tôi có thể đã chỉnh sửa nó. Bất kể, tôi rất vui khi thấy nó bị xóa.
HPierce

1
@Nick, Bạn có thể in đậm mã! Tôi không tin rằng nó được ghi nhận ở bất cứ đâu. Tôi đã thực hiện nó ở đây như một ví dụ, nhưng tôi nghĩ rằng điều này vẫn sẽ bị xóa.
HPierce

0

Nếu bạn đang sử dụng máy chủ wamp thì hãy vào biểu tượng nhấp vào đây biểu tượng máy chủ wamp bấm vào đây

Sau đó vào PHP rồi bấm vào phần mở rộng PHP sẽ có php_openssl cần kích hoạt từ đó và khởi động lại máy chủ wamp php_openssl hoạt động từ đây


-1

Bên trong Simple_html_dom.php thay đổi giá trị của $offsetbiến từ -1thành 0. lỗi này thường xảy ra khi bạn di chuyển sang PHP 7.

HtmlDomParser::file_get_htmlsử dụng một bù mặc định -1, chuyển vào 0sẽ khắc phục vấn đề của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.