簡體   English   中英

PHP:504網關超時錯誤?

[英]PHP: 504 Gateway Time-out Error?

我知道這個問題已經問過幾次了,但是我正在尋找我的問題的另一個答案。

基本上,我有一個MYSQL數據庫,其中有10000多個iPhone的設備ID記錄,用於其中的推送通知。

現在,我需要運行一個將連接到Apple APNS服務器的PHP文件,以向我的MYSQL數據庫中的這10000條記錄發送推送通知。

當我運行我的PHP頁面時,過了一會兒我收到了超時錯誤...

在我的研究中,我遇到了一些解決方案,但是最需要編輯服務器上etc文件夾中的某些內容。

我的問題是:

有什么方法可以讓我們從MYSQL數據庫中選擇30條記錄,然后停止然后選擇另外30條,然后停止然后再選擇30條,依此類推,直到誰的記錄已發送給PN。

這是我當前的代碼:

$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 {
}

任何幫助,將不勝感激。

提前致謝。

有幾種方法可以解決您的問題。

我無法幫助您編寫代碼,相反,我會寫一些概念性提示。

在PHP中更改最大執行時間

使用set_time_limit()增加執行時間限制。

但是,如果您的PHP以safe_mode運行,則此功能無效。

分工

完成此操作的方式取決於您如何調用此PHP文件,如果它是cron作業,則可以保留上次推送通知的最后一個索引,然后多次調用cron作業。

改善表現

推送服務應具有批量方法,您可以在其中通過一個http請求發送許多通知。 HTTP請求是這里的瓶頸,而不是數據庫。

每個請求都有自己的延遲,如果數據庫中有1萬行,則將有1萬個請求。 如果請求花費10毫秒(非常短的時間),則將花費100秒執行腳本。

如果您以批量方式發送通知,每個請求接受100條通知並花費50毫秒來運行,則您將僅需要100個請求,並且只需5秒鍾即可執行該請求。

這樣做,您可以使用LIMITOFFSET拆分mysql查詢,因此您僅在發送請求之前將所需的內容加載到內存中。

是的,您需要一次以100-100或500-500發送推送通知,因為這可能會使您的服務器無法一次完成10,000個記錄過程,而其他原因可能是您的執行時間為30秒或類似時間因此,腳本會運行特定的時間,然后超時。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM