Pahalı ve riskli olduğu gibi bir süre gerçek bir döngü çözmek için nasıl

5 Cevap php

Ben bir sesion değişken ayarlanmış olup olmadığını bir AJAX isteği görmek için yapmak. Ben bu komut için bir GET isteği olun:

<?php session_start();

while(true){
    if(isset($_SESSION['screen_name'])){
    	return true;
    	break;
    }
}

?>

Açıkçası orada bu komut ile sorunları vardır ve ben böyle sürekli kontrol ve kaynakların atık olarak bu sorunları çözmek istedik.

Scenario: I twitgoo kullandık OAuth yöntemi uygulamaya çalışıyorum. Siz "oturum" tıklayın ve twitter oturum için daha sonra bir pencere açılır. Eğer başarılı olursa, twitter bir çağrı geri URL'ye yönlendirir (I setleri oturum bilgi sanırım ki) ve pencere kapatılır. Bu yapıldıktan sonra mesaj twitter nakledilir. Bunu başarmak için çalışıyorum ve ben neredeyse orada değilim ama benim yukarıdaki script emin değilim.

Ben bu script not so wasteful yapımında herhangi bir yardım takdir ediyorum ve eğer bir better implementation, bunu duymak isterim.

Tüm teşekkürler

Update

Seni arasında daha verimli olduğunu düşünüyorum iki iyi seçenek vermek edilmiştir:

1) Yoklama sunucu yerine while döngüsünün JS kullanarak her birkaç saniyede bir CPU döngülerini kadar yeme

2) ise döngü tutun ama artık http istekleri boşa olacaktır anlam kontrol düzeyinde "kadar kolay"

5 Cevap

Bu bir PHP komut dosyası? Durumunu değiştirebilir herhangi bir durum ilk etapta bir sayfa yenileme / yeni anket, yani restart of the script daha $_SESSION['screen_name'] başka var mı?

$_SESSION değişken istek bağlıdır. Script tarafından değiştirildi sürece, komut dosyası çalışırken değiştirmek için gitmiyor. Zaman aşımı vurmak kadar tüm bu script dönüş true koşul gerçekleştiğinde, ya da döngü şeklinde olduğunu gelmez. Durum ilk denemede doğru ya ya asla olmayacak.

Ne yazık ki, burada oluşturduğunuz tüm sonsuz bir döngü. $_SESSION['screen_name'] ile ilk defa ayarlı değilse, hiç set olacak, asla. Eğer bir PHP komut dosyası yüklendikten sonra, ortam değişkenleri değişmez. Başka bir oturum çerezi almak asla, ne de komut dosyası içinde açıkça bunu, ya da komut biter ve başka bir istek yapmak sürece vb $ _GET, $ _POST, $ _SESSION, herhangi bir hiç, modifiye edilecek.

Burada benim önerim bu gibi bir şey olacaktır:

if(isset($_SESSION['screen_name'])){
    return true;
    break;
}
else {
  //output JSON encoded error message
}

Eğer gerekli oturum değişkeni ayarlanmamış zaman komut çıkmak ve geri tarayıcıya bir yanıt göndermek, sonra tarayıcı ne karar verebilirsiniz. Belki başka bir istek yapmak, belki belki bir oturum açma iletişim yüklemek, on saniye bekleyin.

Burada gerçekten aptalca bir şey söyleyerek olabilir, ama sadece while döngüsü yaptırmayı ve javascript kadar yoklama bırakarak daha iyi olmaz mıydı?

memcache sonucunuzu saklayın, daha sonra değişken için memcache kontrol yineleme arasındaki usleep ile while döngüsü () kullanın.

Bu, aslında bunun yerine zincir sonuç için bekleyen XMLHttpRequest'ler bir grup olan uzun bir anket yapmanızı sağlayacaktır.

Buna ne dersiniz:

screen_name_check.php

<?php session_start();
if (isset($_SESSION['screen_name']))
    return "1";
return "0";
?>

sayfa.html

<script type="text/javascript">
    check_screen_name_interval = window.setIterval(function(){
    	// AJAX call screen_name_check.php
    	if (data=="1") {
		window.clearInterval(check_screen_name_interval);
		// do whatever JS needs with that session set
		// or AJAX call a different PHP page like screen_name_is_set.php
    	}
    }, 2000);
</script>