php下curl與file_get_contents性能對比

前言

      php站點沒什麼訪問量,可是負載又出奇的高,反饋給程序員通常就一個結果,代碼沒有問題,檢查一下服務器是否是正常的,有些人就不停的處在扯皮時期了,何不查查問題. 好吧,我這有一例,即是file_get_contents遠程url引發的.好,進入正題. php

      以下是curl和file_get_contents鏈接淘寶ip地址庫的接口. html

php代碼

文件:1829.php 程序員

<?php
/**
 * 經過淘寶IP接口獲取IP地理位置
 * @param string $ip
 * @return: string
 **/
function getCityCurl($ip)
{
    $url="http://ip.taobao.com/service/getIpInfo.php?ip=".$ip;
    $ch = curl_init();
    $timeout = 5;
    curl_setopt ($ch, CURLOPT_URL, $url);
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
    $file_contents = curl_exec($ch);
    curl_close($ch);

    $ipinfo=json_decode($file_contents);
    if($ipinfo->code=='1'){
        return false;
    }
    $city = $ipinfo->data->region.$ipinfo->data->city;
    return $city;
}

function getCity($ip)
{
    $url="http://ip.taobao.com/service/getIpInfo.php?ip=".$ip;
    $ipinfo=json_decode(file_get_contents($url));
    if($ipinfo->code=='1'){
        return false;
    }
    $city = $ipinfo->data->region.$ipinfo->data->city;
    return $city;
}

// for file_get_contents
$startTime=explode(' ',microtime());
$startTime=$startTime[0] + $startTime[1];
for($i=1;$i<=10;$i++)
{
   echo getCity("121.207.247.202")."</br>";
}
$endTime = explode(' ',microtime());
$endTime = $endTime[0] + $endTime[1];
$totalTime = $endTime - $startTime;
echo 'file_get_contents:'.number_format($totalTime, 10, '.', "")." seconds</br>";

//for curl
$startTime2=explode(' ',microtime());
$startTime2=$startTime2[0] + $startTime2[1];
for($i=1;$i<=10;$i++)
{
   echo getCityCurl('121.207.247.202')."</br>";
}
$endTime2 = explode(' ',microtime());
$endTime2=$endTime2[0] + $endTime2[1];
$totalTime2 = $endTime2 - $startTime2;
echo "curl:".number_format($totalTime2, 10, '.', "")." seconds";
?>


測試

      訪問http://test.ttlsa.com/html/1829.php,結果以下圖: json


php下curl與file_get_contents性能對比
php下curl與file_get_contents性能對比- 圖


file_get_contents速度:4.2404510975 seconds
curl速度:2.8205530643 seconds

curl比file_get_contents速度快了30%左右,不過最重要的是服務器負載更低. api


禁用url_open

爲了防止這一問題,我直接把file_get_contents遠程url功能,禁用是最靠譜得選擇,口頭告知程序員,沒效率. 服務器

allow_url_fopen = On
改成
allow_url_fopen = Off

替換方法

使用curl替換file_get_contents
curl

總結

     file_get_contents用來讀文件就行,不要用它來獲取遠程url得信息,走api之類得絕對不要考慮它,強烈建議系統管理員禁用url_open. 速度方面curl已經佔優,性能上你們本身測試一下就會下決心之後再也不使用這麼粗劣得函數了. 函數

我的博客:http://www.ttlsa.com/html/1829.html
osc博客:http://my.oschina.net/766/blog/157580 性能

相關文章
相關標籤/搜索