PHP'nin işlevi zaman zaman sıçrama ()

9 Cevap php

PHP'nin zaman () fonksiyonu zaman damgası kullanılarak, ben tarih ile kullanıcıya () için geçerli saati gösterir.

Format: H: i => 13:57

Ama bazen zaman içinde atılımlar var gibi görünüyor. Ben sayfayı ziyaret benim windows saatinin 13:40 gösteriyordu. XX: Ama et 14 dedi. Artık tam zamanı bilmiyorum.

Başka bir örnek: Bir kullanıcı sayfayı erişilen "çevrimiçi?" 00:16. Bir kullanıcı onun son eylemi 00:39 olduğu için zaman ile yer aldı. Son hareket zamanı her sayfa yük veritabanına yazılır. Yani () fonksiyonu zaman 00:16 geri 00:39 vermiş olmalı ve yanlış değer veritabanına yazılmış olmalı.

Bu nasıl olabilirdi?

Yardımlarınız için çok teşekkür ederim :)

Edit #1 Ben bu sorun için önemli olan kısımlarına kodumu azaltılmış ettik:

Ben tarih ile kullanıcıya zaman göstermek nerede serverData.php içinde) ($ tStamp = süre ile yeni bir değişkene damgası kaydetmek ve bu dosya index.php dahildir ('dmY, H: i', $ tStamp) . Değişken $ tStamp başka doğrultusunda değişiklik değil.

Edit #2 web sitemdeki kullanıcılar sayfa çok kısa bir an için 00:39 gösterdi 2010-01-21 00:16 üzerinde yanlış bir zaman fark ettim. Ben günlük dosyalarının içine bir göz yaşadım ve bu sefer çetere eksik tam bir saat var:

127.0.0.1 - [20/Jan/2010: 23:34:53 +0100] ...

127.0.0.1 - [20/Jan/2010: 23:34:55 +0100] ...

127.0.0.1 - [21/Jan/2010: 00:38:41 +0100] ...

127.0.0.1 - [21/Jan/2010: 00:38:41 +0100] ...

Benim hoster 2010-01-20 0:00-06:00 için bakım çalışmaları açıkladı. Eğer bakım erkene olduğunu düşünüyor musunuz? Bu bakım çalışmaları, bu süre içinde bir sonraki gün yapıldı durum olabilir mi? Böyle bir çalışma zaman yanlış yapabilir?

Edit #3 Son olarak, zaman konusu dönemde benim sahibesi :) gelen bir cevabı var, sunucu çöktü. Ve çünkü izle / saat durdu. Bu kadar basit ama ben bir sunucu çökmesi düşünmüyordu. Çok hepinize teşekkür ederiz!

9 Cevap

Bu soru ve yorum sizin yanıtların tüm okumak zorunda, ben bu PHP bir hata olma şansı oldukça sonsuz olduğunu söyleyebiliriz. PHP'nin time() anakart üzerindeki donanım saati doğrudan çeker OS, doğrudan çeker. Eğer barındırma paylaşılan konum bu yana, bu bir sorun olacak kadar sık ​​oluyor ise içine bakmak için barındırma sormak zorunda gidiyoruz. Bu donanım saatine kısa bir çeşit olabilir, sahtekar bir NTP sunucusu veya süreç olabilir - sunucu günlükleri veya bilgisayarınıza fiziksel erişimi erişimi olmadan, ben biliyorum şahsen yapabileceğiniz bir sürü şey yok.

Gerçekten uzaklarda seçenek olarak, karşı işaretlendiğinde geçici sistem zaman değişiyor kötü ntp yer var olabilir. Bu doğru bir sunucuya bir sonraki güncelleme geri doğru saate ayarlanmış olacaktır. Ben bir sistem zaman bu kadar sürüklenme olasılığı olacağını sanmıyorum.

() server zaman senin değil döndüren o zaman hatırlıyorum. Farklı bir değer döndürür Eğer sunucu saati pc zaman farklı olduğu anlamına gelir.

Örnekler için en olası görünüyor bu önümüzdeki başka bir zaman dilimi-bir saat için ayarlanmış bir sunucu tarafından bileşik bir önbelleğe alma sorunu olabilir.

Sunucu önbellek (squid, vb) varsa, Turn off the browser's cache, ve de bu kapatın ve deney yeniden deneyin.

Bu, ya da bir sunucu çiftliği bir yanlış ayarlanmış zaman bir düğüm veya iki sahiptir ya.

Sen date_default_timezone_set () fonksiyonu ile php.ini veya zamanında sunucunuzun saat dilimini yapılandırabilirsiniz.

Kodunuzda bir hata muhtemelen vardır. Eğer bazı kod yapıştırın.

Aksi takdirde basit bir kod tabanı sorunu azaltmak birkaç test sayfaları oluşturmak ve sadece zaman fonksiyonlarını test edin. Bu, herhangi bir olası sorunları açıklığa kavuşturmak ve izole yardımcı olacaktır. Ne demek istediğimi anlıyor musun?

Ben apache günlük, hatta daha iyisi ile komut çıktı karşılaştırmak için önereceğini - Ayrıca talep olduğunda zaman değerini yazsan bir günlük oluşturun. Bu, aşağıdaki ihtimalini dışlamak için:

Bazı sağlayıcılar sitesine doğrudan sizden içerik sunmak, ama başka umut birileri yerine, önbelleğe de aynı sayfa için isteyeceğini ve daha sonra dışarıdan bant genişliği kaydedebilirsiniz yok önbelleğe ağları var. Bu ağda bazı aksaklık varsa Yani sayfanın bir yanlış sürümü almak olabilir.

Bu kod bir sorun olma olasılığını ortadan kaldırır ve muhtemelen sunucu aleme php alemin dışına alır - apache log veya syslog ile karşılaştırarak diğer code kodu olarak zaman aynı fikri varsa görmenize yardımcı olacaktır. Eğer öyleyse, ben ntp içine yakından bakmak istiyorum - ben o zaman uğraşmak gerekiyordu biliyorum sadece cini var.

(@ Wallyk tarafından önerilen) bir sunucu çiftliği üzerinde bir yanlış ayarlanmış zaman bir haydut düğüm kesinlikle bunu yapabilir - ve bu bir NTP sorunu olmaktan çok daha makul.

İsteğiniz tarafından hizmet verilen düğüm tanımlamanın bir yolu olup olmadığını görmek.

Bir HTML açıklama içinde php_uname () veya gethostname() dahil olmak üzere zaman yanlıştır sayfanın kaynağını inceleyerek deneyin. Bu might Sorun belirli bir düğüm ile ilişkili olup olmadığını belirlemek için yeterli bilgi verir.

Ya şimdiki zaman (birlikte işlev çağrısının sonuçlarını yazdıran bir sayfa) oluşturmak ve bir anormallik gözlenir kadar bu sayfa birden çok kez alır bir senaryo yazmak. (Açıkçası önbelleğe sayfasını önlemek için dikkatli olacak ve İlk kendinize bu php_uname () veya gethostname (temin ederim) farklı istekleri farklı düğümler tarafından ele ediliyordu olmadığını belirlemek için yeterli bilgi verdi)

Yöntem PHP ile sunucunuzun zaman almak ve GMT zaman onu dönüştürme ve zaman dilimi olduğu için zaman dönüşüm ofset böylece ekleme, istemci tarafında javascript enjekte etmektir. See this for more info.