2012-09-04 59 views
0

我有一个php脚本,它负责从我的iPhone应用程序读取一些请求参数。一旦我做了一些操作,我将它们保存在数据库中,并需要使用Apple APNS发送一些推送通知消息。所以目前它在代码中完成了这样的工作。在后台运行php代码块

<?php 
    $param1 = $_POST['param1']; 
    $param2 = $_POST['param2']; 

    //saving part here 

    //push notifications 
    $pushService = new PushService(); 
    $pushService -> init(); 
    $pushService -> push($param1, $param2); 

    //json response 
    echo json_encode(array($success, $dbsavedid); 
?> 

问题发生在推动部分。现在,这个推送通知代码块需要很长时间才能执行,因为该表的数据量很大。因此,iPhone应用程序等待太久才能执行(以获得对iPhone的成功响应)。

因此,有什么办法可以使这个推动部分异步,并使用回声给iPhone端发送响应,而不是使用单独的脚本进行推送通知?另外请注意,我需要从保存的记录以及iPhone端获取一些数据。所以我需要输出到iPhone端。

+0

我们在该表中讨论了多少记录?如果它不是数百万和数百万,那么你可能会遇到一些严重的模式设计问题。 什么是“漫长的时间”?我们是在谈论几十秒,还是根据您的需求,超过500毫秒被认为是很长的? –

+0

这需要时间,因为连接到APNS并发送通知需要时间。大约有100-1000条记录,现在需要5-10分钟才能得到响应。它起初工作完美,但随着记录数量的增加,它降低了速度。 http://developer.apple.com/library/mac/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/ApplePushService/ApplePushService.html – Dilshan

+1

5-10分钟????我认为在后台运行该代码隐藏了真正的问题:错误的代码/数据结构。当然,你可以在后台运行代码,并且它会工作得很好,直到你将服务器上的这样一个负载整个东西刚刚崩溃的那一刻...... –

回答

0

造成这种情况的原因实际是,我的服务器提供商已阻止端口2195和由Apple APNS端口2196。我相信,一旦你允许,这将是固定的,应该像早些时候一样工作。

1

例如,您可以强制PHP通过使用flush()函数发送响应。 (也可能有其他的可能性) 所以当你的数据库操作完成时(这些应该是非常快的,如果你有100-1000条记录),并且在调用flush ()函数。你的客户应该马上得到答复。

另请参阅关于flush()本身的链接,因为您的环境中可能有其他参数会阻止您的响应尽快到达客户端。 http://php.net/manual/en/function.flush.php

<?php 
$param1 = $_POST['param1']; 
$param2 = $_POST['param2']; 

//saving part here 

//json response 
echo json_encode(array($success, $dbsavedid); 

//response should be sent right away, no need for wait on the pushservice operations 
flush(); 

//push notifications 
$pushService = new PushService(); 
$pushService -> init(); 
$pushService -> push($param1, $param2); 

?>

+0

我确实尝试了在保存部分之后立即使用ob_flush()和flush(),并在此之后添加了json响应。因此它假设打印输出并开始推送通知。但它不适合我。它假设为浏览器工作,但不适合我的场景。这就是为什么我特别添加基于iPhone的这个问题。可能是因为iPhone保持与服务器的持续交互并等待服务器完成它。 – Dilshan

+1

Yepp,应该可以在客户端或服务器端配置它以在发生刷新后接收响应。你在客户端使用NSURLConnection还是其他的东西? –

+0

我正在使用ASIHttpRequest。这是3年前开发的一款旧应用。 – Dilshan