จะส่งคำขอ GET จาก PHP ได้อย่างไร


280

ฉันวางแผนที่จะใช้ PHP สำหรับข้อกำหนดที่เรียบง่าย ฉันต้องดาวน์โหลดเนื้อหา XML จาก URL ซึ่งฉันต้องส่งคำขอ HTTP GET ไปยัง URL นั้น

ฉันจะทำใน PHP ได้อย่างไร

คำตอบ:


378

file_get_contentsถ้าคุณต้องการมากกว่าเพียงแค่เนื้อหาของไฟล์ที่คุณสามารถใช้

$xml = file_get_contents("http://www.example.com/file.xml");

สำหรับสิ่งที่ซับซ้อนมากขึ้นฉันต้องการใช้ม้วน


3
สิ่งนี้ถูกต้องเว้นแต่คุณจะต้องใช้พารามิเตอร์สตริงแบบสอบถาม
Raptor

2
@musicfreak: บางครั้งสตริงข้อความค้นหาอาจถูกละเว้นโดยเซิร์ฟเวอร์บางตัวสำหรับการตั้งค่าความปลอดภัย นอกจากนี้แบบสอบถามข้ามเซิร์ฟเวอร์อาจส่งผลให้เกิดข้อผิดพลาดนี้:failed to open stream: HTTP request failed!
Raptor

26
@ShivanRaptor: ฉันไม่แน่ใจว่าสิ่งที่คุณกำลังพูดถึง ... สตริงแบบสอบถามเป็นเพียงส่วนหนึ่งของสตริง ไม่มีเหตุผลที่เซิร์ฟเวอร์จะเพิกเฉย ตอนนี้เห็นได้ชัดว่าfile_get_contentsไม่อนุญาตให้คุณส่งคำขอด้วยคุกกี้ที่กำหนดเองส่วนหัวและอื่น ๆ ที่เบราว์เซอร์จะส่งโดยทั่วไปดังนั้นคุณอาจไม่ได้รับคำตอบที่ต้องการ ในกรณีนี้คุณควรใช้ CURL ดีกว่า ( แต่ที่ไม่ได้กรณีของ OP.)
Sasha Chedygov

1
Curl เร็วกว่า file_get_contents ชอบขดมากกว่า file_get_contents ในสภาพแวดล้อมการรับส่งข้อมูลที่สูง
Deb

2
@Sasha - ฉันต้องเผชิญกับสิ่งนี้ในสภาพแวดล้อมการผลิตจำนวนมาก แต่คุณสามารถดูลิงก์เหล่านี้ได้ในตอนนี้: haltiko.blogspot.com/2013/02/…หรือmdb9.wordpress.com/2011/03/06/…
Deb

132

สำหรับคำขอ GET / POST ขั้นสูงเพิ่มเติมคุณสามารถติดตั้งไลบรารี CURL ( http://us3.php.net/curl ):

$ch = curl_init("REMOTE XML FILE URL GOES HERE"); // such as http://example.com/example.xml
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, 0);
$data = curl_exec($ch);
curl_close($ch);

10
แม้ว่าจะไม่จำเป็นต้องใช้ CURL สำหรับ "ความต้องการง่าย ๆ " แต่ก็เป็นเพราะมันเป็นทางออกที่ดีที่สุดสำหรับการทำอะไรขั้นสูงกับคำขอ HTTP ใน PHP
xyz

ดังที่ได้กล่าวไปแล้ว curl นั้นเร็วกว่าfile_get_contents()มาก สตริงตัวอักษร 4 ตัวที่เรียบง่ายใช้เวลาประมาณ 10 วินาทีในขณะที่ขดจะมีความเหมาะสมสูงสุด ~ 1 วินาที
ปีเตอร์กอร์ดอน

@pgmann คุณแน่ใจในผลลัพธ์นั้นหรือไม่ นี่ไม่สอดคล้องกับสถิติอื่น ๆ ที่มีการเสนอราคา แน่นอน CURL นั้นเร็วกว่า แต่ก็ไม่ควรจะเร็วขนาดนั้น บางทีเวลาตอบสนองที่ลดลงนี้มาจากการแคชทรัพยากรของเซิร์ฟเวอร์หรือไม่? บางทีคุณควรทำแบบทดสอบซ้ำหรือไม่?
Rauni Lillemets

1
@Rununi ฉันเกรงว่าฉันไม่สามารถสอบซ้ำได้ แต่ฉันมักจะไปกับ cURL เพื่อเพิ่มความเร็ว ฯลฯ เวลาที่ร้องขอเป็นค่าประมาณสิ่งที่รู้สึกเหมือนเมื่อโหลดหน้าเว็บ ฉันลองหลายครั้ง
Peter Gordon

63

http_getควรทำเคล็ดลับ ข้อดีของการใช้http_getเกินfile_get_contentsความสามารถในการดูส่วนหัว HTTP รายละเอียดการร้องขอการเข้าถึงและควบคุมการหมดเวลาการเชื่อมต่อ

$response = http_get("http://www.example.com/file.xml");

83
ส่วนขยาย http ไม่ได้รวมอยู่กับ PHP และมักจะไม่สามารถใช้ได้ในโฮสต์ที่ใช้ร่วมกัน
Imran

27
สิ่งนี้ต้องการ pecl_http> = 0.1.0 ซึ่งไม่ได้ติดตั้งไว้ตามค่าเริ่มต้น
Raptor

5
"หน้าคู่มือที่คุณกำลังมองหา ( us2.php.net/manual/en/function.http-get.php ) ไม่สามารถใช้งานได้บนเซิร์ฟเวอร์นี้ในตอนนี้"
ปาง

20

จำไว้ว่าถ้าคุณใช้พรอกซีคุณต้องทำอะไรเล็กน้อยในรหัส php ของคุณ:

(PROXY WITHOUT AUTENTICATION EXAMPLE)

<?php
$aContext = array(
    'http' => array(
        'proxy' => 'proxy:8080',
        'request_fulluri' => true,
    ),
);
$cxContext = stream_context_create($aContext);

$sFile = file_get_contents("http://www.google.com", False, $cxContext);

echo $sFile;
?>

9

ขึ้นอยู่กับว่าการตั้งค่า php ของคุณอนุญาตให้ fopen บน URL หรือไม่คุณสามารถ fopen url ด้วยอาร์กิวเมนต์รับในสตริงได้ (เช่นhttp://example.com?variable=value )

แก้ไข: Re-อ่านคำถามผมไม่แน่ใจว่าคุณกำลังมองหาที่จะผ่านตัวแปรหรือไม่ - ถ้าคุณไม่ได้คุณก็สามารถส่งคำขอ fopen containg http://example.com/filename.xml - รู้สึกฟรี เพื่อละเว้นตัวแปร = ส่วนที่เป็นค่า



5

ในทางกลับกันการใช้ REST API ของเซิร์ฟเวอร์อื่นเป็นที่นิยมอย่างมากใน PHP สมมติว่าคุณกำลังมองหาวิธีที่จะเปลี่ยนเส้นทางคำร้องขอ HTTP บางอย่างไปยังเซิร์ฟเวอร์อื่น (เช่นรับไฟล์ xml) นี่คือแพ็คเกจ PHP ที่จะช่วยคุณ:

https://github.com/romanpitak/PHP-REST-Client

ดังนั้นรับไฟล์ xml:

$client = new Client('http://example.com');
$request = $client->newRequest('/filename.xml');
$response = $request->getResponse();
echo $response->getParsedResponse();

5

Guzzle เป็นห้องสมุดที่รู้จักกันดีซึ่งทำให้การโทร HTTP ทุกประเภทเป็นเรื่องง่าย ดูhttps://github.com/guzzle/guzzle ติดตั้งและเรียกใช้composer require guzzlehttp/guzzle composer installตอนนี้โค้ดด้านล่างก็เพียงพอสำหรับการรับสาย http

$client = new \GuzzleHttp\Client();
$response = $client->get('https://example.com/path/to/resource');

echo $response->getStatusCode();
echo $response->getBody();
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.