PHP sistem çağrıları ile, set_time_limit çalışmıyor komut dosyası için zaman aşımı ayarlamak

4 Cevap php

Ben foreach ile bir dizinin her bir elemanını kullanarak wget isteği çalışan bir komut satırı PHP komut dosyası var. Ben örneğin son 15 saniye giderse komut öldürmek için bir zaman aşımı ayarlamak mümkün olmak istiyorum bu yüzden bu wget istek bazen uzun zaman alabilir. Ben PHP safemode devre ve erken komut set_time_limit (15) çalıştı, ancak sonsuza kadar devam eder var. Set_time_limit () (sistem saygı değil) çağırır, çünkü bu işaret için Dor Update: Thanks.

Yani yürütmenin 15 saniye sonra komut öldürmek için başka yollar bulmaya çalışıyordu. Ancak, ben (döngü işe yaramadı iken do) bu aynı zamanda bir wget istek ortasında iken bir script çalışıyor olmuştur süresini kontrol etmek mümkün olmadığından emin değilim. Belki bir zamanlayıcı ile bir süreç çatal ve zaman bir miktar sonra üst öldürmek için hazır mı?

Herhangi bir ipucu için teşekkürler!

Update: Below is my relevant code. $url is passed from the command-line and is an array of multiple URLs (sorry for not posting this initially):

foreach( $url as $key => $value){
    $wget = "wget -r -H -nd -l 999 $value";
    system($wget);
    }

4 Cevap

"- Zaman aşımı" ve time () bir kombinasyonunu kullanabilirsiniz. Eğer toplam ne kadar zaman bulmaktan başlamak ve alt - script çalışır gibi zaman aşımı.

Örneğin:

$endtime = time()+15;
foreach( $url as $key => $value){
  $timeleft = $endtime - time();
  if($timeleft > 0) {
    $wget = "wget -t 1 --timeout $timeleft $otherwgetflags $value";
    print "running $wget<br>";
    system($wget);
  } else {
    print("timed out!");
    exit(0);
  }
}

Not: Eğer-t kullanmak istemiyorsanız, wget her bekleme, 20 kez dener - zaman aşımı saniye.

İşte (Josh'un önerisi @) proc_open / proc_terminate kullanarak bazı örnek kod:

$descriptorspec = array(
   0 => array("pipe", "r"),
   1 => array("pipe", "w"),
   2 => array("pipe", "w")
);
$pipes = array();

$endtime = time()+15;
foreach( $url as $key => $value){
  $wget = "wget $otherwgetflags $value";
  print "running $wget\n";
  $process = proc_open($wget, $descriptorspec, $pipes);
  if (is_resource($process)) {
    do {
      $timeleft = $endtime - time();
      $read = array($pipes[1]);
      stream_select($read, $write = NULL, $exeptions = NULL, $timeleft, NULL);
      if(!empty($read)) {
        $stdout = fread($pipes[1], 8192);
        print("wget said--$stdout--\n");
      }
    } while(!feof($pipes[1]) && $timeleft > 0);
    if($timeleft <= 0) {
      print("timed out\n");
      proc_terminate($process);
      exit(0);
    }
  } else {
    print("proc_open failed\n");
  }
}

set_time_limit() ek olarak wget komut satırı argümanı --timeout kullanmayı deneyin.

Akılda tutulması set_time_limit(15) restarts the timeout counter from zero (böylece amaç için) bir döngü içinde demiyorlar

dan man wget,

- Timeout = saniye

Set the network timeout to seconds seconds. This is equivalent to specifying --dns-timeout, --connect-timeout, and --read-timeout, all at the same time.

When interacting with the network, Wget can check for timeout and abort the operation if it takes too long. This prevents anomalies like hanging reads and infinite connects. The only timeout enabled by default is a 900-second read timeout. Setting a timeout to 0 disables it altogether. Unless you know what you are doing, it is best not to change the default time-out settings.

All timeout-related options accept decimal values, as well as subsecond values. For example, 0.1 seconds is a legal (though unwise) choice of timeout. Subsecond timeouts are useful for checking server response times or for testing network latency.

EDIT: Tamam. Ben şimdi ne yaptığınızı görüyorum. Ne muhtemelen yapmalıyım kullanımı proc_open yerine system arasında ve süresini kontrol etmek için time() işlevini kullanın, proc_terminate çağırıyor ise wget çok uzun tskes.

You can direct the output of the wget program to a file, which then returns immediately.
Also see:

Note: The set_time_limit() function and the configuration directive max_execution_time only affect the execution time of the script itself. 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.

Kaynak: set_time_limit() @ php.net