2010-12-07 11 views
43

Ben müthiş bir iş (IMHO) yapar bu işlevi bulundu: http://nadeausoftware.com/articles/2007/06/php_tip_how_get_web_page_using_curlPHP CURL & HTTPS

/** 
* Get a web file (HTML, XHTML, XML, image, etc.) from a URL. Return an 
* array containing the HTTP server response header fields and content. 
*/ 
function get_web_page($url) 
{ 
    $options = array(
     CURLOPT_RETURNTRANSFER => true,  // return web page 
     CURLOPT_HEADER   => false, // don't return headers 
     CURLOPT_FOLLOWLOCATION => true,  // follow redirects 
     CURLOPT_ENCODING  => "",  // handle all encodings 
     CURLOPT_USERAGENT  => "spider", // who am i 
     CURLOPT_AUTOREFERER => true,  // set referer on redirect 
     CURLOPT_CONNECTTIMEOUT => 120,  // timeout on connect 
     CURLOPT_TIMEOUT  => 120,  // timeout on response 
     CURLOPT_MAXREDIRS  => 10,  // stop after 10 redirects 
    ); 

    $ch  = curl_init($url); 
    curl_setopt_array($ch, $options); 
    $content = curl_exec($ch); 
    $err  = curl_errno($ch); 
    $errmsg = curl_error($ch); 
    $header = curl_getinfo($ch); 
    curl_close($ch); 

    $header['errno'] = $err; 
    $header['errmsg'] = $errmsg; 
    $header['content'] = $content; 
    return $header; 
} 

Ben tek sorun https için çalışmıyor olmasıdır: //. Anny fikirler bu işi https için yapmak için ne yapmam gerekiyor? Teşekkürler!

curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false) 

veya yalnızca geçerli fonksiyona ekleyin:

+4

"çalışmıyor" özelliğini tanımlar. –

+3

SSL sertifikası geçerli olup olmadığını kontrol edin ... – RageZ

+0

@RegeZ söz konusu sertifikayı kendiniz imzaladıysanız bu davranışı devre dışı bırakmak isteyebilirsiniz - önerinizi nasıl yaparsınız? – StackOverflowNewbie

cevap

70

Hızlı çözüm, seçenekleriniz bu eklemek

/** 
* Get a web file (HTML, XHTML, XML, image, etc.) from a URL. Return an 
* array containing the HTTP server response header fields and content. 
*/ 
function get_web_page($url) 
{ 
    $options = array(
     CURLOPT_RETURNTRANSFER => true,  // return web page 
     CURLOPT_HEADER   => false, // don't return headers 
     CURLOPT_FOLLOWLOCATION => true,  // follow redirects 
     CURLOPT_ENCODING  => "",  // handle all encodings 
     CURLOPT_USERAGENT  => "spider", // who am i 
     CURLOPT_AUTOREFERER => true,  // set referer on redirect 
     CURLOPT_CONNECTTIMEOUT => 120,  // timeout on connect 
     CURLOPT_TIMEOUT  => 120,  // timeout on response 
     CURLOPT_MAXREDIRS  => 10,  // stop after 10 redirects 
     CURLOPT_SSL_VERIFYPEER => false  // Disabled SSL Cert checks 
    ); 

    $ch  = curl_init($url); 
    curl_setopt_array($ch, $options); 
    $content = curl_exec($ch); 
    $err  = curl_errno($ch); 
    $errmsg = curl_error($ch); 
    $header = curl_getinfo($ch); 
    curl_close($ch); 

    $header['errno'] = $err; 
    $header['errmsg'] = $errmsg; 
    $header['content'] = $content; 
    return $header; 
} 
+2

Burada daha fazla bilgi var: http://unitstep.net/blog/2009/05/05/using-curl-in-php-to- access-https-ssltls-protected-site/ – SystemX17

+0

yanlış düzenleme için üzgünüm ;-) Ne demek istediğini anlamadım ... – RageZ

+0

sorun değil - Ben sadece bu yana dün yeni. Bu kodu, soran kişi için daha iyi hale getirdiğiniz için teşekkürler. – SystemX17

21

Bazı https API yapmak için CURL kullanmaya çalışıyordu php aramaları ve bu problemle karşılaştı. Bana kalkıp koşu php sitesinde bir öneri fark: http://php.net/manual/en/function.curl-setopt.php#110457

Please everyone, stop setting CURLOPT_SSL_VERIFYPEER to false or 0. If your PHP installation doesn't have an up-to-date CA root certificate bundle, download the one at the curl website and save it on your server:

http://curl.haxx.se/docs/caextract.html

Then set a path to it in your php.ini file, e.g. on Windows:

curl.cainfo=c:\php\cacert.pem

Turning off CURLOPT_SSL_VERIFYPEER allows man in the middle (MITM) attacks, which you don't want!

+1

Bunu yaptım ama şimdi sadece "35 hatası alıyorum: 14077410: SSL rutinleri: SSL23_GET_SERVER_HELLO: sslv3 uyarı anlaşması hatası" – OZZIE

0
Gavin Palmer cevap gibi başka bir seçenek ama bir bukle seçeneği ile

1- indir son güncellendiği .pem dosyası kullanmaktır

.pemhttps://curl.haxx.se/docs/caextract.html dosya ve (ortak klasöre dışında) sunucu üzerinde bir yere kaydedin

2- kodunuzda seçeneği yerine php.ini dosyasını ayarlamak

curl_setopt($ch, CURLOPT_CAINFO, $_SERVER['DOCUMENT_ROOT'] . "/../cacert-2017-09-20.pem");