gpt4 book ai didi

PHP:504 网关超时错误?

转载 作者:行者123 更新时间:2023-11-29 18:27:28 25 4
gpt4 key购买 nike

我知道这个问题已被问过多次,但我正在寻找问题的另一个答案。

基本上,我有一个 MYSQL 数据库,其中包含超过 10000 条用于推送通知的 iPhone 设备 ID 记录。

现在,我需要运行一个 PHP 文件,该文件将连接到 Apple APNS 服务器,以向 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 运行在安全模式下,则此函数无效。

分工工作

具体的实现方式取决于你如何调用这个 PHP 文件,如果它是一个 cron 作业,你可以保留你推送通知的最后一个索引,然后多次调用 cron 作业。

提高性能

推送服务应该有一个批量方法,您可以在单个 http 请求中发送许多通知。 HTTP 请求是这里的瓶颈,而不是数据库。

每个请求都有自己的延迟,如果数据库中有 10k 行,就会有 10k 请求。如果请求需要 10 毫秒(非常短的时间),那么您将需要 100 秒来执行脚本。

如果您以批量方法发送通知,每个请求接受 100 个通知并需要 50 毫秒运行,那么您将只需要 100 个请求,并且只需 5 秒即可执行。

通过这种方式,您可以使用 LIMITOFFSET 拆分 mysql 查询,这样您就可以在发送请求之前仅将需要的内容加载到内存中。

关于PHP:504 网关超时错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46041404/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com