PHP'den bir GET isteği nasıl gönderilir?


280

Basit bir gereksinim için PHP kullanmayı planlıyorum. Bir URL'den bir XML içeriği indirmem gerekiyor, bunun için bu URL'ye HTTP GET isteği göndermem gerekiyor.

PHP nasıl yaparım?

Yanıtlar:


378

Dosyanın içeriğinden daha fazlasına ihtiyacınız olmadığı sürece kullanabilirsiniz file_get_contents.

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

Daha karmaşık bir şey için cURL kullanırdım .


3
Sorgu dizesi parametrelerini kullanmanız gerekmedikçe bu doğrudur.
Raptor

2
@musicfreak: güvenlik ayarları nedeniyle sorgu dizesi bazen bazı sunucular tarafından yok sayılır. Ayrıca, sunucular arası sorgu bu hatayla sonuçlanabilir:failed to open stream: HTTP request failed!
Raptor

26
@ShivanRaptor: Neden bahsettiğinizden emin değilim ... Sorgu dizesi dizenin sadece bir parçası. Bir sunucunun bunu görmezden gelmesinin bir nedeni yoktur. Şimdi, açıkça, file_get_contentsözel çerezler, başlıklar ve bir tarayıcının genellikle göndereceği diğer şeylerle istekte bulunmanıza izin vermez, bu nedenle aradığınız yanıtı alamayabilirsiniz. Bu durumda, yine de CURL kullanmaktan daha iyi olur. (Ama bu OP'nin durumu değil.)
Sasha Chedygov

1
Curl, file_get_contents'tan çok daha hızlı. Yüksek trafikli bir ortamda file_get_contents yerine Curl tercih et
Deb

2
@Sasha - Bunu birçok üretim ortamında gördüm ancak şimdilik bu bağlantıları görebiliyorsunuz: haltiko.blogspot.com/2013/02/… veya mdb9.wordpress.com/2011/03/06/…
Deb

132

Daha gelişmiş GET / POST istekleri için CURL kitaplığını yükleyebilirsiniz ( 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
"Basit bir gereksinim" için CURL kullanmaya gerçekten gerek yok olmasına rağmen, +1, çünkü PHP'deki HTTP istekleriyle daha gelişmiş bir şey yapmak için en iyi çözümdür.
xyz

Daha önce de belirtildiği gibi, kıvrılma daha hızlıdır file_get_contents(). Basit bir 4 harfli dize yaklaşık 10 saniye sürerken, kıvrım daha makul ~ 1 saniye maks.
Peter Gordon

@pgmann Bu sonuçtan emin misiniz? bu, alıntılananlarla diğer istatistiklerle uyumlu değildir. Gerçekten de, CURL daha hızlıdır, ancak bu kadar hızlı olmamalıdır. Belki yanıt süresindeki bu düşüş, bazı kaynakların sunucu tarafında önbelleğe alınması vb. Belki testi tekrar etmelisin?
Rauni Lillemets

1
@Rauni Ben tekrar test edemiyorum korkuyorum ama her zaman hız artışı, vb için cURL ile gitmek. İstek süreleri yaklaşık, sayfa yüklenirken ne hissettiğini yaklaşık. Birden çok kez denedim.
Peter Gordon

63

http_gethile yapmalı. Avantajları http_getüzerinde file_get_contentsHTTP başlıkları görüntüleme yeteneği, erişim isteği ayrıntıları ve bağlantı zaman aşımı kontrol sayılabilir.

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

83
http uzantısı PHP ile birlikte verilmez ve genellikle paylaşılan ana bilgisayarlarda kullanılamaz.
Imran

27
bu, varsayılan olarak kurulu olmayan pecl_http> = 0.1.0 gerektirir.
Raptor

5
"Aradığınız manuel sayfa ( us2.php.net/manual/en/function.http-get.php ) şu anda bu sunucuda mevcut değil."
Pang

20

Bir proxy kullanıyorsanız, php kodunuzda küçük bir numara yapmanız gerektiğini unutmayın:

(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 kurulumunuzun URL'lerde fopen'e izin verip vermediğine bağlı olarak, URL'yi dizedeki get bağımsız değişkenleriyle de (örneğin, http://example.com?variable=value ) fopen edebilirsiniz.

Düzenleme: Soruyu yeniden okumak Değişkenleri geçmek isteyip istemediğinizden emin değilim - değilseniz, http://example.com/filename.xml içeren fopen isteğini gönderebilirsiniz - çekinmeyin değişkeni yoksaymak = değer parçası



5

Öte yandan, diğer sunucuların REST API'sini kullanmak PHP'de çok popülerdir. Bazı HTTP isteklerini diğer sunucuya yönlendirmek için bir yol aradığınızı varsayalım (örneğin, bir xml dosyası almak). İşte size yardımcı olacak bir PHP paketi:

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

Yani, xml dosyasını almak:

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

5

Guzzle her türlü HTTP çağrısı yapmayı son derece kolaylaştıran çok iyi bilinen bir kütüphanedir. Bkz. Https://github.com/guzzle/guzzle . İle yükleyin composer require guzzlehttp/guzzleve çalıştırın composer install. Şimdi bir http almak için aşağıdaki kod yeterlidir.

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

echo $response->getStatusCode();
echo $response->getBody();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.