2012-06-29 15 views
5

Uyku zaman aşımı veya bunun gibi şeyler için sayılırsa, bu normal sorulardan biri değildir. Tamam, sorun şu: PHP için max_execution_time değerini 15 saniyeye ayarlıyorum ve ideal olarak bu ayarlanan limitin üstündeyken zaman aşımına uğruyor, ama değil. Apache, php.ini dosyasına yapılan değişiklikten sonra yeniden başlatıldı ve bir ini_get ('max_execution_time') tamamlandı. Bazen betik 200 saniyeye kadar çılgınca çalışır. Her hangi bir veritabanı iletişimim yok. Tüm betik, unix dosya sistemindeki dosyaları arıyor ve bazı durumlarda başka bir JSP sayfasına yönlendiriyor. Komutta hiç uyku yok(). Ben set senaryonun başlangıcındaPHP max_execution_time zaman aşımına uğramıyor

:

$_mtime = microtime(); 
$_mtime = explode(" ",$_mtime); 
$_mtime = $_mtime[1] + $_mtime[0]; 
$_gStartTime = $_mtime; 

ve bitiş zamanı ($ _ gEndTime) benzer şekilde hesaplanır

böyle PHP script toplam yürütme süresini hesaplamak.
toplam sefer kaydettiğimizi bir kapatma fonksiyonu hesaplanır:

register_shutdown_function('shutdown'); 
............. 
function shutdown() 
{ 
    .............. 
    .............. 
    $_total_time = $_gEndTime - $_gStartTime; 
    .............. 
    switch (connection_status()) 
    { 
    case CONNECTION_NORMAL: 
     .... 
     break; 
     .... 
    case CONNECTION_TIMEOUT: 
     .... 
     break; 
     ...... 
    } 
} 

Not: Ben $ _SERVER kullanamazsınız [ 'REQUEST_TIME'] benim PHP sürümü uyumsuz olduğundan. Bu berbat - biliyorum.

1) Eh, benim ilk soru besbelli neden benim PHP komut dosyası bile ayarlanan zaman aşımı limitinden sonra infaz edilir?
2) Apache, 300 saniyelik zaman aşımı yönergesine sahiptir, ancak PHP ikili Apache yapılandırmasını okumaz ve bu bir sorun olmamalıdır.
3) PHP'nin bir uyku moduna girmesinin bir olasılığı var mı?
4) Uygulama zamanını yanlış olarak mı hesaplıyorum? Bunu yapmanın daha iyi bir yolu var mı?


Bu noktada stumped. PHP Sihirbazları - lütfen yardım edin.

Düzenleme: Sadece akım işlemlerinin birkaç günlükleri ile sebep olmadığını öğrendim. Aktarım işlemi yapılmadığında bile, gecikme komut dosyasında rastgele belirgindir. İçerik geçişi sadece sebebi olabilir. Ama hala net bir cevabım yok. Ben Real max_execution_time for PHP on linux yukarı baktım ama emin olmak istiyorum emin değilim. Başka önerileriniz var mı?

+0

Dosya sistemi işlemlerinin de zaman sınırı hesaplamalarında sayılmadığına inanıyorum. – lonesomeday

+1

Biliyorsunuz, 'float'ı hemen geri almak için' microtime (true) 'kullanabilirsiniz ... – deceze

+0

@lonesomeday: Bundan emin misiniz? –

cevap

7

max_execution_time sadece sınırları komut yürütme zamanı kendini - cpu süresi, senaryonun. OS içeriği başka bir sürece geçtiyse ve orada biraz zaman geçirdiyse, aynı zamanda sayılmayacaktır. Yani gerçek dünya saatini ölçmek ve 30 saniye sonra bir mola beklemek, herhangi bir zaman için geçerli olmayacaktır. Ve tabii ki, herhangi system, exec veya ağ süreleri de

+2

Gerçekten de .. DB sorguları veya veri akışlarını beklerken bile, – Johan

+0

denkleminin dışına çıkmış, db maddelerini belirtmeyi unutmuş;) teşekkür ederim! – poncha

+0

Herhangi bir sistemim yok, exec çağrıları var ama herhangi bir dış kod çağırmıyorum. Dosya sistemi işlemleri max_execution_time sınırı içinde sayılıyor mu? Say, bir fopen() –

0

Eğer (yorum göre) belli bir süre geçtikten sonra zaman aşımına gerekiyorsa neden jist olsun

$startscript = microtime(); 

//do some stuff 

if (microtime() - $startscript > 1500) 
{ 
    dotimeout(); 
} 


    // do more stuff 

if (microtime() - $startscript > 1500) 
{ 
    dotimeout(); 
} 

    // do more stuff 

if (microtime() - $startscript > 1500) 
{ 
    dotimeout(); 
} 

demiyorlar göz ardı eder. Çok hoş değil ama işe yarayabilir.

+0

Bu, gecikmelerin nerede gerçekleşeceğini bilmek istediğimde işe yarayabilir. Ama benim durumumda, gecikmeler rastgele. Örneğin, örneğin: ilk kontrol geçilirse ve microtime() - $ startcript, <1500 olan ve ikinci kontrol çağrılmadan hemen önce gerçekleşirse, yine aynı hikaye olur. Yine de teşekkürler...! –

İlgili konular