2010-07-28 100 views
1

我有一个发送短信的PHP脚本,问题是它需要一段时间才发送每个短信。在我的网站中,该页面将等待此脚本完成运行。我如何向用户发送短信将被发送并恢复网站的正常操作。不要等待脚本完成

+0

*(相关)* http://stackoverflow.com/search?q=asynchronous+php – Gordon 2010-07-28 11:29:12

回答

2

这里唯一的问题是浏览器认为它在等待脚本的更多输出,当没有任何输出时。你可以卸载到一个单独的进程,或者使用异步Web呼叫,或者你可以简单地.....

<?php 
register_shutdown_function('when_alls_done'); 
.... // render page 
exit; 

function when_alls_done() 
{ 
    if ($_REQUEST['send_to_phone']) { 
     send_sms($_REQUEST['send_to_phone'], $_REQUEST['message']); 
    } 
} 

的网络服务器应在“退出”刷新请求,让浏览器知道响应是完整的(在此之前,PHP代码中的显式刷新将不会刷新Web服务器缓冲区,也不会导致输出被另一个块进行块编码)。

C.

0

取而代之或者在那里发送短信,然后您可以将它存储在某个地方(例如数据库)。然后,您可以构建额外的脚本(以PHP或其他任何您想要的方式)轮询数据库以查找SMS以发送和分派它们。根据您的操作系统,您可以通过cron或计划任务每​​隔x秒或几分钟运行一次。通过这种方式,您可以将耗时的任务从其页面上及时与用户进行通信。

0

如果你是LAMP

  1. 写未决短信cron作业,将查询队列(数据库),并送他们。
  2. 在您的脚本中将SMS添加到队列中。
  3. 在另一页显示他的短信的用户状态。
  4. 使用Ajax,您可以在后台查询最近发送的SMS的状态。只要你看到发送通知用户。
2

将消息放入数据库的队列中。然后在后台运行一个脚本作为cron作业来处理队列。

+1

原则上其良好的的想法,但在实践中使用cron作业将信息出队将不能很好地扩展并且会导致额外的功能性问题。一个更好的解决方案将是一个专用的守护进程 - 以前我曾使用BSD lpd来管理一个带有自定义“打印机驱动程序”的SMS队列 - 但其他地方使用异步请求来处理这个问题 – symcbean 2010-07-28 11:35:31

0

要做到这一点,你可以使用ajax。 在一些按钮上按只需发送一个ajax请求到PHP文件铸造发送短信。并在屏幕上发出通知,如“发送短信!!!”并在ajax行动的响应改变'发送短信','成功!!!'...

为使用ajax你可以使用jquery .. 如果你不知道jquery评论我的视频教程...我有一些jQuery的初学者视频教程....

有一个愉快的一天!!!!!

+0

但在发送时确保ignore_user_abort()脚本如果你去这条路线 – symcbean 2010-07-28 11:36:14

0

这很容易,当你知道如何:

<?php 
    echo 'A sms will be sent!'; 

    fastcgi_finish_request(); 

// Put all your time consuming code here! 

?>