PHP uyku (nasıl durdurabilirim) benim bütün PHP kodu etkiliyor?

6 Cevap php

Yani, benim çarşı, howlingdoggames.com. Ben bu kötüye azaltmak için, şimdi, size bir oyun ile bir sayfasını ziyaret her zaman bir noktaya veren bir puan sistemi var, ben, gecikme çeşit yapmak istiyorum bu yüzden onun sadece 45 saniye sonra verilir. İşte ben çalıştığım buydu.

...

     if ($_SESSION['lastgame'] != $gameid);{
      sleep(45);
$points = $points + $game_points;
      $_SESSION['lastgame'] = $gameid;
      }

   ...

Ancak, bu sadece bu siteme diğer kod sürü gibi, index.php dosyasında, çünkü 45 saniye boyunca benim bütün web durdurmak gibi görünüyor.

Yine de var mı ben kod bu biraz izole edebilir, bu yüzden sadece işlevini yapar

$points = $points + $game_points;

45 saniye bekleyin?

6 Cevap

PHP hiçbir çoklu (çoğunlukla) bulunmaktadır. Sen çeşit Unix sistemleri üzerinde bölmek süreçleri ile bunu yapabilirsiniz ama çoklu sonra ne konum değil gerçekten çünkü bu konuyla ilgisi yok. Sadece bu gibi basit mantığı istiyorum:

$now = time();
session_start();
$last = $_SESSION['lastvisit'];
if (!isset($last) || $now - $last > 45) {
  $points = $_SESSION['points'];
  if (!isset($points)) {
    $points = 0;
  }
  $_SESSION['points'] = $points + 10;
  $_SESSION['lastvisit'] = $now;
}

Eğer puan verdi son kez arasındaki artış 45 saniyeden fazla ise temelde sadece puan verir.

It is session block your script. not "There is no multithreading in PHP". session_write_close() before sleep() will solve block your whole script. but may not fit in your problem.

so you had to save the bonus using settimeout of js and AJAX.

from comment of sleep() in php.net: http://www.php.net/manual/en/function.sleep.php#96592

Geçerli oturum için uyku () gecikmeler yürütme, sadece komut dikkat edin. Ama uyku şey yapmaz iki bilgisayar bir tarayıcıdan aynı komut dosyası çağırmak aşağıdaki örnek, düşünün.

Orada PHP hiçbir çoklu, yani sleep() her zaman tüm senaryoyu engellemek için gidiyor.

Bu çözmek olmalıdır yolu son oyunun zamanı kaydetmek için, ve daha 45 saniye sonra daha sadece ödül puan durumunda.

<?php
session_start();
if (!isset($_SESSION['last_game_time'])
    || (time() - $_SESSION['last_game_time']) > 45) {

    // code to award points here

    $_SESSION['last_game_time'] = time();
}

Çerezleri (böylece hiçbir oturum veri olacak) devre dışı bırakırsanız kullanıcılar hala bu kötüye olabilir unutmayın. Yani gerçekten endişelendiren ise, onlar (bu kapak birkaç soru muhtemelen vardır) bunları özelliğini kullanmak için izin vermeden önce çerezler etkin olduğunu kontrol edin.

Hayır, doğrudan değil. Son ziyaret damgası hatırlamak gibi, farklı bir yaklaşım ve yeterli zaman miktarı bu yana geçti ise sadece puan eklemek gerekir.

Bunun yerine komut engelleme, oturumda geçerli zamandan tasarruf noktaları katmayan ve sayfa versinler. Daha sonra sayfa görünümleri size oturumda kaydedilen zaman, puan eklemek size ihtiyacınız olan her yerde saklayın ve zamanı temizlemek, daha eski 45 saniye olduğunu görürseniz.

Sen yapamazsın, ama bu kod bir javascript bir yapmak, ve AJAX kullanarak bonusu kaydedebilirsiniz.