Bir fonksiyonu veya komut PHP yürütme zamanı sınırlayın

5 Cevap php

Merhaba sadece bir komuta veya yalnızca bir işlev örneğin için zaman sınırı ayarlamak için bir olasılık var:

function doSomething()
{
    //..code here..

    function1();

    //.. some code here..

}

Ben sadece function1 için zaman sınırı ayarlamak istiyorum.

There exits set_time_limit but I think this sets the time limit to whole script. Anybody any Idea?

5 Cevap

set_time_limit () küresel çalıştırmak yok, ancak yerel olarak sıfırlanabilir.

Set the number of seconds a script is allowed to run. If this is reached, the script returns a fatal error. The default limit is 30 seconds or, if it exists, the max_execution_time value defined in the php.ini.

When called, set_time_limit() restarts the timeout counter from zero. In other words, if the timeout is the default 30 seconds, and 25 seconds into script execution a call such as set_time_limit(20) is made, the script will run for a total of 45 seconds before timing out.

Bunu test ettik, ama sen ayrılırken sıfırlama, yerel olarak ayarlamak mümkün olabilir

<?php
set_time_limit(0);  // global setting

function doStuff()
{
    set_time_limit(10);   // limit this function
    //  stuff
    set_time_limit(10);   // give ourselves another 10 seconds if we want
    //  stuff
    set_time_limit(0);    // the rest of the file can run forever
}

// ....
sleep(900);
// ....
doStuff();  // only has 10 secs to run
// ....
sleep(900);
// ....

set_time_limit () ... Any time spent on activity that happens outside the execution of the script such as system calls using system(), stream operations, database queries, etc. is not included when determining the maximum time that the script has been running. This is not true on Windows where the measured time is real.

Sen kod gerekir ki kendinizi zaman sınırı dolduğunda function1 dönmek istiyorum.

function doStuff($seconds)
{
    $finish=time()+$seconds;

    $done=false;
    $timeout=false;

    while (!$done && !$timeout)
    {
        //do stuff here, set $done to true if you complete

        //out of time?
        $timeout=time() >= $finish;

    }

    return $done; //let caller know if we completed
}

Tabii ki, size geçen zaman kontrol etmek ve gerekirse çıkabilirsiniz, böylece tekrarlanan olmak için ihtiyaçlarını yapmak "şeyler".

Eğer keyfi bir fonksiyonun zaman aşımı yürütülmesini istiyoruz ve kontrol size iade varsa, bu desteklenmiyor. Eğer gerçekten bunu yapmak gerekirse, ayrı bir işlem olarak mühendis. Çok uzun süreceğe benziyor, o zaman süreci kapatabilirsiniz.

Hayır, bu mümkün değil: max_execution_time sunucu yok (sonsuz döngü gibi) adamcağız betikleri zorunda kalmamak için, bir güvenlik önlemi olarak kullanılır; ama bir işlev birimi olarak çalışmak için uygun değildir.

Ve bu bir ölümcül hata ile biter gerçeği zaten kesinlikle kullanıcı için güzel değil ...

i bu mümkün olduğunu sanmıyorum, ama bunu neden yapmak istiyorsunuz? Bir komut dosyası hiç kesilirse ben bunu istiyorum istiyorum olmayabilir. Bu, daha fazla kendinizi bir koruma gibi olmalı, ama script çok zaman alırsa, size komut dosyası alır zaman vermek, ya da değişmesi gerekir (sadece sonsuz bir döngü veya saat alacak bir şey yüklemek durumunda) daha hızlı çalışır ve böylece (bazı Crons için onun ok bir zaman alabilir, ancak oldukça sık denir, normal bir komut varsayılan süre sonra fazla sürerse, bazı ciddi performans sorunlarla karşı karşıya olabilir)

Ben harici bir uygulamadan ihracat üretir shellscript çalıştırmak için exec kullanın. Komut çok uzun çalışıyorsa, max_execution_time ulaşıldığında ve kullanıcı ne olduğunu asla. Bu tür işlevi sınırlama beni sonu yakın olup olmadığını belirlemek ve bazı kullanıcı dostu bir hata göndermek yardımcı olacaktır.