PHP:504网关超时错误?
我知道这个问题已经被问过好几次了,但我正在寻找我问题的另一个答案 基本上,我有一个MYSQL数据库,其中有10000多条iPhone设备ID记录,用于推送通知 现在,我需要运行一个连接到Apple APNS服务器的PHP文件,以便向MYSQL数据库中的这10000条记录发送推送通知 当我运行我的php页面时,过了一段时间我得到一个超时错误 在我的研究中,我遇到了一些解决方案,但大多数都需要在服务器上的etc文件夹中编辑一些内容 我的问题是:PHP:504网关超时错误?,php,mysql,Php,Mysql,我知道这个问题已经被问过好几次了,但我正在寻找我问题的另一个答案 基本上,我有一个MYSQL数据库,其中有10000多条iPhone设备ID记录,用于推送通知 现在,我需要运行一个连接到Apple APNS服务器的PHP文件,以便向MYSQL数据库中的这10000条记录发送推送通知 当我运行我的php页面时,过了一段时间我得到一个超时错误 在我的研究中,我遇到了一些解决方案,但大多数都需要在服务器上的etc文件夹中编辑一些内容 我的问题是: 有没有办法从MYSQL数据库中选择30条记录,然后停止
有没有办法从MYSQL数据库中选择30条记录,然后停止,再选择另外30条,然后停止,再选择另外30条,依此类推,直到who记录被发送到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中的最大执行时间 用于增加执行时间限制 但是,如果您的PHP在安全模式下运行,则此函数无效 分工合作 方法取决于如何调用此PHP文件,如果它是cron作业,则可以持久化推送通知的最后一个索引,然后多次调用cron作业 提高性能 推送服务应该有一个批量方法,您可以在一个http请求中发送多个通知。HTTP请求是这里的瓶颈,而不是数据库 每个请求都有自己的延迟,若数据库中有10k行,那个么将有10k个请求。如果请求需要10毫秒(非常短的时间),则执行脚本需要100秒 如果以批量方法发送通知,每个请求接受100个通知,运行时间为50ms,则只需100个请求,执行时间仅为5秒
通过这种方式,您可以使用
LIMIT
和OFFSET
拆分mysql查询,因此您只需在发送请求之前在内存中加载所需内容。是,您需要一次发送100-100或500-500的推送通知,因为可能是您的服务器对于一次10000个记录进程来说不够强大,而其他原因是您的执行时间可能是30秒或类似的时间,所以脚本会在特定时间内运行,并在该时间后给出超时
$message = "Welcome";
for($i=10000 ;$i>0;$i-$limit){
//your code here
sleep(2);
}
您可以将当前数据库位置存储在file@bishop标页码“select让我们假设MYSQL数据库中有30条记录,然后停止,再选择另外30条,然后停止,再选择另外30条,依此类推”:这与分页的模式相同。@bishop,不,不是这样。分页不会停止。。。它会一次抓取所有记录,但它会将记录分解成10、20、,30等等…这不是应该是$i=100吗?用户有10000行,这取决于db行数。行数根据问题中提供的代码中提供的代码是动态的。事实上根本没有行数。我知道最终用户也是一名程序员,所以他/她知道需要在这里输入什么$i={count}它的硬代码值或动态查询,所以我认为没有必要在这里讨论计数值