2017-09-04 86 views
0

我知道这个问题已被多次询问,但我正在寻找另一个解决我的问题的答案。PHP:504网关超时错误?

基本上,我有超过10000条记录iPhone的设备ID的在它推送通知MySQL数据库。

现在,我需要运行将连接到苹果服务器APNS在我的MYSQL数据库发送推送通知这些10000条记录的PHP文件。

当我运行我的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 { 
} 

任何帮助,将不胜感激。

在此先感谢。

+0

的可能的复制[分页使用MySQL LIMIT,OFFSET(https://stackoverflow.com/questions/20364349/pagination-using-mysql-limit-offset) – bishop

+0

你可以存储在一个文件中当前数据库的位置 –

+1

@bishop,分页?!? –

回答

0

有几种方法可以解决您的问题。

我不能帮你写代码,而不是我会写一些概念上的提示。在PHP

使用set_time_limit()

变化最大的执行时间,以增加执行时间限制。

但是,如果你的PHP在safe_mode设置运行时,此功能没有任何影响。

分割你的工作

做到这一点取决于你如何调用这个PHP文件,如果它是一个cron作业,你能坚持,你推通知的最后一个索引的方式,然后调用cron作业多次。

提高性能

推送服务应该有一个大容量的方法,在那里你在一个HTTP请求发送多少条通知。 HTTP请求是这里的瓶颈,而不是数据库。

每个请求有它自己的延迟,如果在数据库中有10K行,将有1万个请求。如果请求需要10ms(非常短的时间),则需要100秒才能执行脚本。

如果您在接受每个请求100点的通知,并采取50ms的运行批量方法发送您的通知,您将只需要100个请求,并且将只需要5秒执行。

这样做的方式,你可以用LIMITOFFSET分割你的MySQL查询,所以你只能在你发送请求之前所需要的内存负载。

0

是的,您需要立即发送100-100或500-500的推送通知,因为可能您的服务器不会对一万个记录过程立即产生太大的影响,其他原因可能是您的执行时间为30秒或类似的东西,所以脚本运行特定时间,然后超时。

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

是不是应该是$我= 100? – user2056633

+0

用户有10,000行,取决于数据库行数 –

+0

根据问题中提供的代码中提供的代码,行数是动态的。 – user2056633