Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:504网关超时错误?_Php_Mysql - Fatal编程技术网

PHP:504网关超时错误?

PHP:504网关超时错误?,php,mysql,Php,Mysql,我知道这个问题已经被问过好几次了,但我正在寻找我问题的另一个答案 基本上,我有一个MYSQL数据库,其中有10000多条iPhone设备ID记录,用于推送通知 现在,我需要运行一个连接到Apple APNS服务器的PHP文件,以便向MYSQL数据库中的这10000条记录发送推送通知 当我运行我的php页面时,过了一段时间我得到一个超时错误 在我的研究中,我遇到了一些解决方案,但大多数都需要在服务器上的etc文件夹中编辑一些内容 我的问题是: 有没有办法从MYSQL数据库中选择30条记录,然后停止

我知道这个问题已经被问过好几次了,但我正在寻找我问题的另一个答案

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

现在,我需要运行一个连接到Apple APNS服务器的PHP文件,以便向MYSQL数据库中的这10000条记录发送推送通知

当我运行我的php页面时,过了一段时间我得到一个超时错误

在我的研究中,我遇到了一些解决方案,但大多数都需要在服务器上的etc文件夹中编辑一些内容

我的问题是:


有没有办法从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}它的硬代码值或动态查询,所以我认为没有必要在这里讨论计数值