PHP cURL กับ file_get_contents


112

โค้ดสองส่วนนี้แตกต่างกันอย่างไรเมื่อเข้าถึง REST API

$result = file_get_contents('http://api.bitly.com/v3/shorten?login=user&apiKey=key&longUrl=url');

และ

$ch = curl_init('http://api.bitly.com/v3/shorten?login=user&apiKey=key&longUrl=url');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);

ทั้งคู่ให้ผลลัพธ์เหมือนกันโดยตัดสินโดย

print_r(json_decode($result))

2
cURLfile_get_contentsมีความสามารถในมากขึ้นกว่า แค่นั้นก็น่าจะเพียงพอแล้ว

18
FWIW มีความแตกต่างเล็กน้อยเกี่ยวกับความเร็ว ฉันเพิ่งดึงข้อมูล URL 5,000 รายการเสร็จแล้วและบันทึก HTML ลงในไฟล์ (ประมาณ 200k ต่อไฟล์) ฉันทำครึ่งหนึ่งโดยใช้ curl และครึ่งหนึ่งกับ file_get_contents เป็นการทดลองและไม่มีความแตกต่างที่มองเห็นได้
David Gilbertson

8
เป็นไปได้ที่จะส่งข้อมูลโพสต์ด้วย file_get_contents ตราบใดที่คุณใช้เวอร์ชันที่รองรับบริบทสตรีม
Chris Strickland

คำตอบ:


129

file_get_contents()เป็นไขควงธรรมดา เหมาะสำหรับคำขอ GET แบบง่ายโดยที่ส่วนหัววิธีการร้องขอ HTTP ระยะหมดเวลาคุกกี้จาร์การเปลี่ยนเส้นทางและสิ่งสำคัญอื่น ๆ ไม่สำคัญ

fopen()ด้วยบริบทสตรีมหรือ cURL พร้อมsetoptคือ powerdrills ที่มีทุกบิตและตัวเลือกที่คุณสามารถนึกถึงได้


17
เพื่อให้อยู่ในอุปมาดังกล่าวโปรดทราบว่า cURL เป็น powerdrill ที่มีหัวจับดอกสว่านที่ซับซ้อนซึ่งคุณต้องรู้ว่ามันค่อนข้างดีในการเปลี่ยนแปลง (อ่าน: การตั้งค่าตัวเลือก cURL เป็นเรื่องที่น่าเบื่อเล็กน้อย แต่ช่วยให้สามารถทำอะไรก็ได้ที่คุณต้องการ)
โผล่

20
file_get_contentsอนุญาตให้ตั้งค่าบริบทซึ่งหมายความว่าคุณสามารถตั้งค่าฟิลด์ส่วนหัวได้ตามที่คุณต้องการ
velop

4
และนอกเหนือจากความคิดเห็นของ @ velop แล้วผ่านบริบทของสตรีมยังสามารถส่ง POST, PUT, การตรวจสอบสิทธิ์, ส่วนหัว, เนื้อหา, พร็อกซีและอื่น ๆ อีกมากมายด้วยคำขอ file_get_contents หนึ่งรายการ
Markus Köhler

@ พัฒนา: ใช่ และวิธีการด้วย และเปลี่ยนเส้นทาง. และหมดเวลา ... php.net/manual/en/context.http.php
Sz.

25

นอกจากนี้เนื่องจากการแฮ็กเว็บไซต์ล่าสุดเราจึงต้องรักษาความปลอดภัยให้เว็บไซต์ของเรามากขึ้น ในการทำเช่นนั้นเราพบว่าfile_get_contentsทำงานไม่สำเร็จโดยที่curlยังคงใช้งานได้

ไม่ใช่ 100% แต่ฉันเชื่อว่าการตั้งค่า php.ini นี้อาจบล็อกคำขอfile_get_contents

; Disable allow_url_fopen for security reasons
allow_url_fopen = 0

ทั้งสองวิธีรหัสของเราตอนนี้ทำงานกับขด


9
ใช่file_get_contentsต้องallow_url_fopenเป็นจริง
Costa

2
ใช่ บริษัท โฮสติ้งหลายแห่งปิดการใช้งานfile_get_contents()เนื่องจากมีช่องโหว่มากมายที่ทราบกันดีว่าใช้ฟังก์ชันนี้ cURL เป็นฟังก์ชันที่ผู้คนควรใช้ในโค้ดตอนนี้
ผิดหวังเท

15
@frustratedtech "การหาประโยชน์" เหล่านี้คืออะไร?
rdlowrey

3
บริษัท โฮสติ้งปิดการใช้งานเพราะพวกเขาชนิดของความผิดพลาดมันallow_url_fopen และใช้ได้ดี allow_url_includeallow_url_fopenfile_get_contents
fritzmg

2
@vr_driver ลิงก์เหล่านี้ไม่เกี่ยวข้องกับfile_get_contents()
rdlowrey

20

นี่เป็นหัวข้อเก่า แต่ในการทดสอบครั้งล่าสุดของฉันกับ API ตัวเดียวของฉัน cURL เร็วและเสถียรกว่า บางครั้ง file_get_contents ตามคำขอขนาดใหญ่ต้องใช้เวลามากกว่า 5 วินาทีเมื่อ cURL ต้องการเพียง 1.4 ถึง 1.9 วินาทีซึ่งจะเร็วขึ้นสองเท่า

ฉันต้องการเพิ่มหนึ่งบันทึกเกี่ยวกับสิ่งนี้ฉันเพิ่งส่ง GET และรับเนื้อหา JSON หากคุณตั้งค่า cURL อย่างถูกต้องคุณจะได้รับคำตอบที่ดี เพียงแค่ "บอก" เพื่อ cURL สิ่งที่คุณต้องส่งและสิ่งที่คุณต้องการเพื่อรับข้อมูลเพียงเท่านี้

ในการสอบของคุณฉันต้องการตั้งค่านี้:

$ch =  curl_init('http://api.bitly.com/v3/shorten?login=user&apiKey=key&longUrl=url');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
    curl_setopt($ch, CURLOPT_TIMEOUT, 3);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: application/json'));
$result = curl_exec($ch);

คำขอนี้จะส่งคืนข้อมูลในเวลาสูงสุด 0.10 วินาที


1
0.1 ไมโครวินาที (1 / 1,000 ของมิลลิวินาที) ... ฉันคิดว่ามันยากที่จะเชื่อ
Mark Tomlin

ใช่. ฉันมีคำตอบใน 0.02ms เช่นตรวจสอบหมายเลขโทรศัพท์ Twilio API เป็นไปอย่างรวดเร็ว
Ivijan Stefan Stipić

4
0.02ms = 20 ไมโครวินาที; คุณบอกว่า 0.1 ไมโครวินาทีซึ่งไม่ถูกต้อง
Walf

2
นี่เร็วกว่าเกือบสองเท่าเมื่อเทียบกับที่file_get_contents ฉันเพิ่งเรียก API เพื่อยืนยัน 0.8 วินาทีสำหรับfile_get_contents& 0.49 วินาทีสำหรับcurl(3 การเรียก API)
Jsp

1
คุณควรใช้การตั้งค่าของคุณเอง คำถามของคุณจะเปลี่ยนจาก 1.4-1.9 วินาทีเป็น 0.01 วินาที;)
Rauli Rajande
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.