php中file_get_contents和curl_get_contents介紹_PHP教程

來源:互聯網
上載者:User
php中file_get_contents和curl_get_contents介紹 有需要的朋友可參考一下。

分享一個實際在用的函數:

file_get_contents() 函數是用於將檔案的內容讀入到一個字串中的首選方法。如果作業系統支援,還會使用記憶體映射技術來增強效能。

/*比file_get_contents穩定的多!$timeout為逾時時間,單位是秒,預設為1s。*/

代碼如下 複製代碼
function curl_get_contents($url,$timeout=1) {
$curlHandle = curl_init();
curl_setopt( $curlHandle , CURLOPT_URL, $url );
curl_setopt( $curlHandle , CURLOPT_RETURNTRANSFER, 1 );
curl_setopt( $curlHandle , CURLOPT_TIMEOUT, $timeout );
$result = curl_exec( $curlHandle );
curl_close( $curlHandle );
return $result;
}
$hx = curl_get_contents('http://www.bKjia.c0m/');

相信使用過file_get_contents函數的朋友都知道,當擷取的$url訪問不了時,會導致頁面漫長的等待,甚至還能導致PHP進程佔用CPU達100%,因此這個函數就誕生了。


通過php.ini中的default_socket_timeout設定,預設逾時時間是default_socket_timeout = 60

代碼如下 複製代碼
max_execution_time = 30
default_socket_timeout = 60

假設你使用file_get_contents花費45,而max_execution_time是30,它將逾時嗎?
答案是NO,因為max_execution_time不影響作業系統調用或stream操作
另一點要指出的的是default_socket_timeout是在socket響應之前計算的,只要得到響應,將會一直執行下去

可以通過以下三種方式設定

代碼如下 複製代碼

1 直接在php.ini中修改 default_socket_timeout =120
2 ini_set('default_socket_timeout', 120);
3 $strm = stream_context_create(array(
'http' => array(
'timeout' => 120
)
)
);

curl的一些常識介紹

保留原file_get_contents函數的原因是當讀取本地檔案時,用原生的file_get_contents顯然更合適。

另來自張宴的file_get_contnets的最佳化,具體可看:

首先,使用 top 命令查看 CPU 使用率較高的 php-cgi 進程。

代碼如下 複製代碼

top - 10:34:18 up 724 days, 21:01, 3 users, load average: 17.86, 11.16, 7.69
Tasks: 561 total, 15 running, 546 sleeping, 0 stopped, 0 zombie
Cpu(s): 5.9%us, 4.2%sy, 0.0%ni, 89.4%id, 0.2%wa, 0.0%hi, 0.2%si, 0.0%st
Mem: 8100996k total, 4320108k used, 3780888k free, 772572k buffers
Swap: 8193108k total, 50776k used, 8142332k free, 412088k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
10747 www 18 0 360m 22m 12m R 100.6 0.3 0:02.60 php-cgi
10709 www 16 0 359m 28m 17m R 96.8 0.4 0:11.34 php-cgi
10745 www 18 0 360m 24m 14m R 94.8 0.3 0:39.51 php-cgi
10707 www 18 0 360m 25m 14m S 77.4 0.3 0:33.48 php-cgi
10782 www 20 0 360m 26m 15m R 75.5 0.3 0:10.93 php-cgi
10708 www 25 0 360m 22m 12m R 69.7 0.3 0:45.16 php-cgi
10683 www 25 0 362m 28m 15m R 54.2 0.4 0:32.65 php-cgi
10711 www 25 0 360m 25m 15m R 52.2 0.3 0:44.25 php-cgi
10688 www 25 0 359m 25m 15m R 38.7 0.3 0:10.44 php-cgi
10719 www 25 0 360m 26m 16m R 7.7 0.3 0:40.59 php-cgi

  找其中一個 CPU 100% 的 php-cgi 進程的 PID,用以下命令跟蹤一下:

strace -p 10747

  如果螢幕顯示:

代碼如下 複製代碼

select(7, [6], [6], [], {15, 0}) = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0) = 0 (Timeout)
select(7, [6], [6], [], {15, 0}) = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0) = 0 (Timeout)
select(7, [6], [6], [], {15, 0}) = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0) = 0 (Timeout)
select(7, [6], [6], [], {15, 0}) = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0) = 0 (Timeout)
select(7, [6], [6], [], {15, 0}) = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0) = 0 (Timeout)
select(7, [6], [6], [], {15, 0}) = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0) = 0 (Timeout)
select(7, [6], [6], [], {15, 0}) = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0) = 0 (Timeout)
select(7, [6], [6], [], {15, 0}) = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0) = 0 (Timeout)
select(7, [6], [6], [], {15, 0}) = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0) = 0 (Timeout)
select(7, [6], [6], [], {15, 0}) = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0) = 0 (Timeout)

那麼,就可以確定是 file_get_contents() 導致的問題了。

同樣是設定逾時時間來解決這個問題。如果沒裝curl,就必須得用這個方式了。

代碼如下 複製代碼

$ctx = stream_context_create(array(
'http' => array(
'timeout' => 1 //設定一個逾時時間,單位為秒
)
)
);
file_get_contents("http://www.hzhuti.com/", 0, $ctx);

http://www.bkjia.com/PHPjc/631590.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/631590.htmlTechArticlephp中file_get_contents和curl_get_contents介紹 有需要的朋友可參考一下。 分享一個實際在用的函數: file_get_contents() 函數是用於將檔案的內容讀入...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.