2017-09-04 2 views
0

Ich weiß, dass diese Frage mehrmals gestellt wurde, aber ich suche nach einer anderen Antwort auf mein Problem.PHP: 504 Gateway Timeout Fehler?

Grundsätzlich habe ich eine MYSQL-Datenbank mit über 10000 Datensätze von iPhone-Geräte-ID für Push-Benachrichtigungen darin.

Jetzt muss ich eine PHP-Datei ausführen, die eine Verbindung mit dem Apple APNS-Server herstellt, um Push-Benachrichtigungen an diese 10000 Datensätze in meiner MYSQL-Datenbank zu senden.

Wenn ich meine PHP-Seite laufen, nach einer gewissen Zeit erhalte ich einen Fehler timed out ...

in meiner Forschung, die ich über ein paar Lösungen kam aber die meisten erfordern ein paar Sachen in etc Ordner auf dem Server zu bearbeiten.

Meine Frage ist:

es irgendeine Art und Weise kann 30 Datensätze aus MYSQL-Datenbank auszuwählen sagt, dann stoppen und dann weitere 30 wählen und dann stoppen und dann 30 andere und so weiter und so fort, bis die, die aufzeichnet wurden die PNs gesendet?

Dies ist mein aktueller Code:

$message = "Welcome"; 

$sqld = "SELECT * FROM pushUsers ORDER BY id DESC"; 
$queryd = mysqli_query($db_conx, $sqld); 
$productCountd = mysqli_num_rows($queryd); // count the output amount 
if ($productCountd > 0) { 
    //while($rowd = mysqli_fetch_array($queryd, MYSQLI_ASSOC)){ 
     while($rowd = mysqli_fetch_assoc($queryd)){ 
      $deviceID = $rowd["deviceNo"]; 
      $deviceType = $rowd["deviceType"]; 

      if($deviceType == 'iPhone' || $deviceType == 'iPad'){ 

///////////////SEND PUSH NOTU8FOCATION FOR iOS////////////////////// 

       // Put your device token here (without spaces): 

    $deviceToken = ''. $deviceID.''; 


    // Put your private key's passphrase here: 
    $passphrase = '123456'; 

    //////////////////////////////////////////////////////////////////////////////// 

    $ctx = stream_context_create(); 
    stream_context_set_option($ctx, 'ssl', 'local_cert', 'apple_push_notification_production.pem'); 
    stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase); 

    // Open a connection to the APNS server 
    //****IMPORTANT**** LIVE APNS URL: 

    //ssl://gateway.sandbox.push.apple.com:2195 


    $fp = stream_socket_client(
     'ssl://gateway.push.apple.com:2195', $err, 
     $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); 

    if (!$fp) 
     exit("Failed to connect: $err $errstr" . PHP_EOL); 

    echo 'Connected to APNS' . PHP_EOL; 

    // Create the payload body 
    $body['aps'] = array(
     'alert' => ''.$message.'', 
     'sound' => 'default', 
     'link_url' => 'http://xxxx.xom', 
     'category' => 'APP', 
     'badge' => '1', 
    ); 

    // Encode the payload as JSON 
    $payload = json_encode($body); 

    // Build the binary notification 
    $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload; 

    // Send it to the server 
    $result = fwrite($fp, $msg, strlen($msg)); 

    if (!$result) 
     echo 'Message not delivered' . PHP_EOL; 
    else 
     echo 'Message successfully delivered' . PHP_EOL; 

    // Close the connection to the server 
    fclose($fp); 

    ///////////////END SEND PUSH NOTU8FOCATION FOR iOS////////////////////// 

} 


    } 
} else { 
} 

Jede mögliche Hilfe würde geschätzt.

Vielen Dank im Voraus.

+0

Mögliches Duplikat [Paginierung mit MySQL LIMIT, OFFSET] (https://stackoverflow.com/questions/20364349/pagination-using-mysql-limit-offset) – bishop

+0

Sie aktuelle Datenbank Position in einer Datei speichern –

+1

@Bischof, Paginierung?!? –

Antwort

0

Es gibt einige Möglichkeiten, Ihr Problem zu lösen.

Ich kann Ihnen nicht helfen, Code zu schreiben, stattdessen werde ich einige konzeptionelle Tipps schreiben.

ändern maximale Ausführungszeit in PHP

Verwenden set_time_limit() zur Ausführungszeit erhöhen.

Aber, wenn Ihr PHP in safe_mode läuft, hat diese Funktion keine Wirkung.

Split Ihren Job

Die Art und Weise, es zu tun hängt davon ab, wie Sie diese PHP-Datei aufrufen, wenn es ein Cron-Job ist, können Sie den letzten Index bestehen, dass Sie die Meldung gedrückt, dann rufen Sie die cron-Job mehrere Male .

verbessern die Leistung

Der Push-Dienst mit einem Schütt Verfahren haben sollte, wo Sie viele Mitteilungen in einer HTTP-Anforderung senden. Die HTTP-Anfrage ist hier der Flaschenhals, nicht die Datenbank.

Jede Anfrage hat ihre eigene Verzögerung, wenn Sie 10k Zeilen in der Datenbank haben, wird es 10k Anfragen geben. Wenn die Anforderung 10 ms dauert (eine sehr niedrige Zeit), benötigen Sie 100 Sekunden, um Ihr Skript auszuführen.

Wenn Sie Ihre Benachrichtigungen in einer Massenmethode senden, die 100 Benachrichtigungen pro Anfrage akzeptiert und 50 ms zur Ausführung benötigt, benötigen Sie nur 100 Anfragen und benötigen nur 5 Sekunden, um sie auszuführen.

Auf diese Weise können Sie Ihre MySQL-Abfrage mit LIMIT und OFFSET, so dass Sie nur Last im Speicher aufgespalten, was Sie vor dem Senden der Anfrage benötigen.

0

Ja, Sie müssen Push-Benachrichtigung in 100-100 oder 500-500 auf einmal senden, weil Ihr Server nicht zu stark für 10.000 Datensatzprozess auf einmal sein kann und anderer Grund ist, dass Ihre Ausführungszeit 30 Sekunden sein kann oder so etwas, so läuft ein Skript für eine bestimmte Zeit und danach gibt es eine Zeitüberschreitung.

$message = "Welcome"; 
for($i=10000 ;$i>0;$i-$limit){ 
//your code here 
sleep(2); 
} 
+0

Ist das nicht $ i = 100? – user2056633

+0

Benutzer haben 10.000 Zeilen und hängen von der Db-Zeilenanzahl ab –

+0

Die Zeilenanzahl ist dynamisch basierend auf dem Code, der in dem in der Frage angegebenen Code bereitgestellt wird. – user2056633

Verwandte Themen