$ _REQUEST, $ _GET ve $ _POST arasında hangisi en hızlı?


177

Bu kodlardan hangisi daha hızlı olacak?

$temp = $_REQUEST['s'];

veya

if (isset($_GET['s'])) {
  $temp = $_GET['s'];
}
else {
  $temp = $_POST['s'];
}

6
Üçüncü bir dava var, biliyorsun. !isset($_REQUEST['s']).
Franz

5
Diğer kişilerin kodunuzu açıkça anlamaları ne kadar önemlidir? POST ve GET açıktır, ancak TALEP çeşitli kaynaklardan gelebilir. Her istek için REQUEST, POST ve GET süper küreselleri her zaman yüklendiğinden, verimliliğin önemsiz olduğunu düşünüyorum.
Kevin

Yanıtlar:


273

$_REQUESTVarsayılan olarak, içeriğini içerir $_GET, $_POSTve $_COOKIE.

Ama bu sadece bir varsayılan, hangi bağlıdır variables_order; ve çerezlerle çalışmak istediğinizden emin değilim.

Eğer seçmek zorunda kalsaydım, muhtemelen kullanmazdım $_REQUESTve seçerdim $_GETya da $_POST- başvurumun ne yapması gerektiğine bağlı olarak (yani biri ya da diğeri, ama ikisi de değil) : genel olarak konuşursak:

  • Sen kullanmalıdır $_GETbirisi veri talep olduğunda gelen uygulamanıza.
  • Ve kullanmalıdır $_POSTbirisi bastırıyor zaman (veya silme ekleme veya güncelleme) verileri için uygulamanıza.

Her iki durumda da, performanslar hakkında fazla bir fark olmayacak: fark, senaryonuzun geri kalanıyla ne yapacağına kıyasla ihmal edilebilir.


1
İdeal olarak, her zaman $ _REQUEST kullanabilmeniz gerekir. Ama bu elbette sadece mükemmel bir dünya.
Tyler Carter

2
$ _REQUEST, doğrudan $ _POST ve $ _GET kullanmaktan daha pahalı (veya en azından eskiden) daha pahalı.
Darrell Brogdon

3
Performans farkı ihmal edilebilir ve bakım perspektifinin daha önemli olduğu için +1: $ _GET ve $ _POST, $ _REQUEST'in yapamayacağı şekilde anlam ifade eder.
Jon Cram

9
$ _REQUEST kullanmak XSS / XSRF'ye neden olmaz. XSS / XSRF nüanslarını anlama XSS / XSRF'ye neden olur. Jetonları azalttığınız sürece sorun yoktur ve $ _REQUEST kullanmanın avantajlarından faydalanırsınız (tüm değişkenleriniz bir süper küreseldir). Aslında 'değişken_düzeni' nedeniyle diğer süper küresellere dayalı kullanmadan önce $ _REQUEST yeniden inşa. $ _COOKIE, sonra $ _GET, sonra $ _POST işlerim. Bu şekilde POST değişkenleri en yüksek önceliğe sahiptir ve çerez değişkenleri en düşük değere sahiptir, bu da bir dizi hatayı (örneğin Adobe Flash ve sihirli tırnaklar) örtülü olarak düzeltmeme izin verir.
CubicleSoft

onun adına, Get = get, Post = gönderi
Grumpy

32

POST'a karşılık GET

1) Hem GET hem de POST bir dizi oluşturur (örneğin dizi (anahtar => değer, anahtar2 => değer2, anahtar3 => değer3, ...)). Bu dizi anahtar / değer çiftlerini içerir; burada anahtarlar, form denetimlerinin adlarıdır ve değerler, kullanıcıdan gelen girdi verileridir.

2) Hem GET hem de POST, $ _GET ve $ _POST olarak değerlendirilir. Bunlar süper küreseller, yani kapsamdan bağımsız olarak her zaman erişilebilir oldukları anlamına gelir ve özel bir şey yapmadan herhangi bir işlev, sınıf veya dosyadan bunlara erişebilirsiniz.

3) $ _GET, geçerli komut dosyasına URL parametreleri aracılığıyla iletilen bir değişkenler dizisidir.

4) $ _POST, geçerli komut dosyasına HTTP POST yöntemi aracılığıyla iletilen bir değişkenler dizisidir.

GET ne zaman kullanılır?

GET yöntemiyle bir formdan gönderilen bilgiler herkes tarafından görülebilir (tüm değişken adları ve değerler URL'de görüntülenir). GET'in gönderilecek bilgi miktarı konusunda da sınırları vardır. Sınırlama yaklaşık 2000 karakterdir. Ancak, değişkenler URL'de görüntülendiğinden sayfaya yer işareti koymak mümkündür. Bu, bazı durumlarda yararlı olabilir.

GET, hassas olmayan verileri göndermek için kullanılabilir.

Not: GET ASLA şifre veya diğer hassas bilgileri göndermek için kullanılmamalıdır!

POST ne zaman kullanılır?

POST yöntemiyle bir formdan gönderilen bilgiler başkaları tarafından görülemez (tüm adlar / değerler HTTP isteğinin gövdesine gömülür) ve gönderilecek bilgi miktarı üzerinde herhangi bir sınırlama yoktur.

Ayrıca POST, dosyaları sunucuya yüklerken çok parçalı ikili giriş desteği gibi gelişmiş işlevleri destekler.

Ancak, değişkenler URL'de gösterilmediğinden sayfaya yer imi koymak mümkün değildir.


6
Lütfen REQUEST ile ilgili de bir şeyler ekleyin.
Black Mamba

$ _REQUEST hakkında ne dersiniz?
Aamir Kalimi

22

$ _GET değişkenleri sorgu dizesinden veya URL'nizden alır.

$ _POST (genellikle) formlar gibi POST yönteminden değişkenleri alır.

$ _REQUEST, $ _GET ve $ _POST birleşimidir; burada $ _POST $ _GET'i geçersiz kılar. Doğrulamalar için kendini yenileyen formlarda $ _REQUEST kullanmak güzel.


3
+1 Bu temelde bana öğretildi. Diğer cevaplar gibi teknik değil, ancak hatırlanması çok daha kolay ( GETsorgu dizesinden, POSTform gönderilmesinden).
jp2code

18

Ben kullanarak öneririm $_POSTve $_GETaçıkça.

Yine de $ _REQUEST kullanmak, uygun site tasarımı için gereksiz olmalı CSRF/XSSve URL'de veri depolamaktan kaynaklanan daha kolay saldırılara ve diğer sinsiliğe açık bırakmak gibi bazı olumsuzluklarla birlikte geliyor.

Hız farkı her iki şekilde de minimum olmalıdır.


8

REQUEST kullanın. Kimse böyle basit bir operasyonun hızını umursamıyor ve daha temiz bir kod.


7
Pek çok durumda, her ikisinden birini kullanmak yerine duruma göre bir GET veya POST seçilmesi gerektiği konusunda iyi bir cevap.
ceejayoz

3
Kimsenin umursamaması haklı, ama bence kullanmak $_REQUESTyanlış bir sonuçtur. Cevabımı gör.
Franz

4
$ _REQUEST kullanmak $ _GET veya $ _POST ile karşılaştırıldığında neden daha temiz? $ _REQUEST sahne arkasında aynı mantığı gerçekleştirir ve GET ya da POST öğelerini seçmek size daha fazla kontrol sağlar.
Jay Zeng

6
_REQUEST'in daha hijyenik olduğu iddiasının detaylandırılması gerekmektedir.

2
Kullanıcının URL'yi kopyalayabilmesini ve aynı işlemi önceden yapabilmesini istiyorsanız GET kullanmanızı öneririm (URL 'google.com/q=searchWord' gibi görünürken POST bir web sitesine veri göndermek için kullanılmalıdır yalnızca bir kez girilmesi veya çok fazla veri etkin olması ve kullanıcının veritabanlarına veri
girme

7

Endişelenme. Ancak yine de ikinci çözümü kullanmalısınız (artı bu değişkenlerin hiçbiri için ekstra bir kontrol), çünkü güvenlik sorunları var $_REQUEST(çünkü bu dizi için tek kaynak değildir $_GETve $_POSTdeğildir).

$_REQUESTDünün sorunları hakkında bir yazı vardı , sanırım. Onu bulmama izin ver.

EDIT : Oh, doğrudan bir yazı değil, ama yine de burada: http://kuza55.blogspot.com/2006/03/request-variable-fixation.html


6
if (isset($_GET['s'])) {
  $temp = $_GET['s'];
}
else {
  $temp = $_POST['s'];
}

Bunu kullanın çünkü daha güvenli ve fark edilir bir hız farkı yaratmaz


Hiç de fena bir çözüm değil. İlişkili güvenlik kusurları ile ilgilenir, $_REQUESTancak yine de aynı komut dosyasına her iki şekilde de erişilmesine izin verir (benim durumumda, aynı komut dosyası farklı 'eylemler' ile kullanılır ve bazen $ _GET iyi olur, ancak diğer zamanlarda $ Verileri gizlemek / güvenliğini sağlamak için _POST).
Xandor

4

Bir bilgisayar korsanı, $ _POST veya $ _GET değerini geçersiz kılacak bir çerez ayarlayabileceğinden, bazı güvenlik endişeleri söz konusudur. Hassas verileri işlerseniz, $ _REQUEST kullanmanızı önermem. - Xandor

bazı durumlarda $_GETalternatif olarak kullanılamazsınız $_POST.

Ne zaman ??

  • bir dosya yüklemek istediğinizde.
  • url'de veri göstermezseniz.

GETayrıca gönderilecek bilgi miktarı konusunda da sınırlar vardır. Sınırlama yaklaşık 2000 karakterdir.

Başka bir şey kullanarak bir veri alamazsınız birkaç durum vardır $_POST

Ne zaman ?

  • URL'de veri iletildiğinde.

Dinlenme Servisi için

`GET` - Provides a read only access to a resource.

`PUT` - Used to create a new resource.

kullanılacak yanlış bir şey yok $_REQUEST.

Ancak bunu yapmanın yolu $ _SERVER ['REQUEST_METHOD'] 'i açıkça kontrol etmektir, $ _POST'un bir GET için boş olmasına güvenmemek.


1
$_SERVER['REQUEST_METHOD']Senaryonun herhangi biriyle çağrılıp çağrılmayacağını kontrol etmek için iyi bir tavsiye Ama hiçbir şeyin yanlış olduğunu söylemek $_REQUEST% 100 doğru değildir. Bilgisayar korsanı, $ _POST veya $ _GET değerini geçersiz kılacak bir çerez ayarlayabileceğinden, bazı güvenlik endişeleri söz konusudur. Hassas verileri işlerseniz, kullanmanızı önermem $_REQUEST.
Xandor

Cevabımı
yorumuma

3

$ _GET değişkenleri sorgu dizesinden veya URL'nizden alır.

$ _POST (genellikle) formlar gibi POST yönteminden değişkenleri alır.

$ _REQUEST, $ _GET ve $ _POST birleşimidir; burada $ _POST $ _GET'i geçersiz kılar. Doğrulamalar için kendini yenileyen formlarda $ _REQUEST kullanmak güzel.


2
Geçersiz kılma request_order, çerez değerlerine bağlıdır ve bu çerez değerlerini de içerebilir, bu yüzden çok güvenilir veya kullanışlı bir özellik değildir.
Ja͢ck

1

Daha açık olduğu için ikinci yöntemi kullanırdım. Aksi takdirde değişkenlerin nereden geldiğini bilmiyorsunuz.

Neden yine de GET ve POST'u kontrol etmeniz gerekiyor? Elbette birini ya da diğerini kullanmak daha mantıklı.


1
Bunu daha önce gördüm, GETsadece bir öğe için (örneğin taşıyarak) ve POSTbirden fazla (onay kutuları olan bir form ...) için kullanıldım.
Franz

1

Sadece _GET veya _POST kullanıyorum. Kontrol etmeyi tercih ederim.

Ben OP her iki kod parçası hakkında sevmiyorum onlar HTTP yöntemi kullanılan bilgi atmak olduğunu. Ve bu bilgi girdi temizliği için önemlidir.

Örneğin, bir komut dosyası DB'ye girilecek bir formdan veri kabul ederse, formun POST'u kullanması daha iyi olur ( yalnızca idempotent eylemler için GET kullanın ). Ancak komut dosyası GET yöntemi aracılığıyla giriş verilerini alırsa (normalde) reddedilmelidir. Benim için böyle bir durum, hata günlüğüne güvenlik ihlali yazmayı gerektirebilir, çünkü bu, birinin üzerinde bir şeyler denediğinin bir işaretidir.

OP'deki her iki kod parçasında da bu sterilizasyon mümkün olmazdı.


Aslında, bir sayfaya istediğiniz her şeyi gönderen küçük bir sayfa yazmak son derece basittir. Bu nedenle, gönderilen yönlendirme başlıklarına güvenmediğiniz sürece, yayın varisleri vars'den daha güvenli değildir. Açık I en büyük avantajı varsayalım $_POSTböyle bir şey yapmaktan arama motoru tarayıcılarının önlenmesidir: thedailywtf.com/Articles/WellIntentioned-Destruction.aspx
Duroth

Aksine hiçbir şey söylemedim. Dediğim, HTML formu POST kullanıyorsa ve komut dosyası işlemesi formun verilerini GET aracılığıyla alırsa, komut dosyası bunu bilmek ve her iki kobra örneğinde olduğu gibi bu gerçeği atmak istemezdi. (Btw: yönlendiren de güvenli değil.)

1

Kullanırım $_POST, $_GETçünkü $_REQUESTiçeriklerinden farklı olarak etkilenmez variables_order.
Ne zaman kullanılır $_POSTve $_GETne tür bir işlem yürütüldüğüne bağlıdır. Sunucudan işlenen verileri değiştiren bir işlem bir POST talebi yoluyla, diğer işlemler ise bir GET talebi yoluyla yapılmalıdır. Bir örnek vermek gerekirse, kullanıcı bir bağlantıyı tıklattıktan sonra bir kullanıcı hesabını silen bir işlem doğrudan yürütülmemelidir.


1

Bunu kullanıyorum,

$request = (count($_REQUEST) > 1)?$_REQUEST:$_GET;

$ _REQUEST'in birden fazla parametresi olup olmadığını doğrular ($ _REQUEST içindeki ilk parametre gerektiğinde kullanılabilecek istek uri olacaktır, bazı PHP paketleri $ _GET döndürmez, bu yüzden 1'den fazla _GET, varsayılan olarak $ _POST olacaktır.


0

Zamanından önce optimizasyon yapıyorsunuz. Ayrıca, GET'in POST-ing olduğunuz şeyler için kullanılıp kullanılmayacağını, güvenlik nedeniyle gerçekten düşünmeniz gerekir.


3
Lütfen insanlara POST hakkında GET hakkında olduğundan daha güvenli bir şey olduğunu söylemeye çalışmayın.

Yapmadım. Buradaki nokta, kullanımlarına biraz düşünülmeli ve birbirlerinin yerine kullanılmamalıdır, çünkü "sadece TALEB yazmak çok daha kolaydır".
Alex Brasetvik

Demek istediğin, kobra'nın verilerin beklenen yöntemle gönderildiğini kontrol etmesi gerekiyorsa, o zaman katılıyorum. Kod örneklerinden her ikisi de bu tür testleri imkansız hale getirir.

0

Çirkin ve kodu canlı yayınlarken son bir çözüm olarak tavsiye etmem, ancak dinlenme işlevleri oluştururken, bazen 'tümünü yakala' parametre kavrayıcıya sahip olmak kullanışlı:

public static function parseParams() {
    $params = array();
    switch($_SERVER['REQUEST_METHOD']) {
        case "PUT":
        case "DELETE":
            parse_str(file_get_contents('php://input'), $params);
            $GLOBALS["_{$_SERVER['REQUEST_METHOD']}"] = $params;
            break;
        case "GET":
            $params = $_GET;
            break;
        case "POST":
            $params = $_POST;
            break;
        default:
            $params = $_REQUEST;
            break;
    }
    return $params;
}

Bir reklam öğesi muhtemelen komut satırı parametrelerini veya IDE'nizden gelenleri işlemek için ekleyebilir. Belirli bir dinlenme işlevinin ne yaptığına karar verdiğinizde, konuşlandırma sürümü için ihtiyacınız olanı aldığınızdan emin olmak için söz konusu çağrı için uygun olanı seçebilirsiniz. Bu, 'REQUEST_METHOD' öğesinin ayarlandığını varsayar.

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.