[英]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 {
}
任何幫助,將不勝感激。
提前致謝。
有幾種方法可以解決您的問題。
我無法幫助您編寫代碼,相反,我會寫一些概念性提示。
使用set_time_limit()
增加執行時間限制。
但是,如果您的PHP以safe_mode運行,則此功能無效。
完成此操作的方式取決於您如何調用此PHP文件,如果它是cron作業,則可以保留上次推送通知的最后一個索引,然后多次調用cron作業。
推送服務應具有批量方法,您可以在其中通過一個http請求發送許多通知。 HTTP請求是這里的瓶頸,而不是數據庫。
每個請求都有自己的延遲,如果數據庫中有1萬行,則將有1萬個請求。 如果請求花費10毫秒(非常短的時間),則將花費100秒執行腳本。
如果您以批量方式發送通知,每個請求接受100條通知並花費50毫秒來運行,則您將僅需要100個請求,並且只需5秒鍾即可執行該請求。
這樣做,您可以使用LIMIT
和OFFSET
拆分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.