2017-03-23 2 views
1

Ich habe das folgende Skript, das alle 60 Sekunden. Alles funktioniert gut, aber nach zwei oder drei Stunden hört das Skript auf. Ich habe keine Idee warum.PHP While Schleife stoppt nach zwei Stunden

<?php 

// The worker will execute every X seconds: 
$seconds = 60; 

// We work out the micro seconds ready to be used by the 'usleep' function. 
$micro = $seconds * 1000000; 

while(true){ 

    try { 
     $url = 'URL'; 
     $fields = array(
      "hi"=> 1, 
      "world"=> 2, 
     ); 
     //url-ify the data for the POST 
     foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; } 
     $fields_string = rtrim($fields_string,'&'); 

     $ch = curl_init(); 
     curl_setopt($ch,CURLOPT_URL,$url); 
     curl_setopt($ch,CURLOPT_POST,count($fields)); 
     curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string); 
     curl_exec($ch); 

    } catch (Exception $e) { 
     $myFile = "/usr/share/test/filephp.txt"; 
     $fh = fopen($myFile, 'a') or die("Can't open file"); 
     $stringData = "File updated at: " . time(). "\n"; 
     fwrite($fh, $stringData); 
     fclose($fh); 
    } 




    // Now before we 'cycle' again, we'll sleep for a bit... 
    usleep($micro); 
} 

Das PHP-Script wird mit diesem Befehl ausgeführt:

sudo -u root php -f /usr/share/test/test.php & 

Irgendwelche Ideen?

+0

Wo Sie den obigen Code ausgeführt wird? – learner

+2

PHP wird die Ausführung nach einer bestimmten Zeit stoppen, es sei denn, Sie führen es als Daemon –

+2

Es ist wahrscheinlich wegen der Einstellung max_execution_time. Aber warum machst du es nicht einfach als Cron-Job statt als Endlosschleife? – Barmar

Antwort

1

Sie könnten es in ein Bash-Skript umbrechen und die while-Schleife ganz entfernen.

Script "Wrapper":

#!/bin/bash 

SECONDS=60 
while [ 1 ]; do 
    php -f /usr/share/test/test.php 
    sleep $SECONDS 
done 

Dann rufen Sie einfach das Skript:

sudo -u root wrapper & 
+0

Danke, das wird ewig funktionieren? Ist das stabil? –

+0

Es ist so stabil wie es nur geht. Möglicherweise müssen Sie "nohup" verwenden, damit es nicht auflegt, wenn die Benutzersitzung beendet wird. –

+0

Es funktioniert. Vielen Dank! Ich habe "&" kurz nach dem "done" hinzugefügt –