如何编写异步Web服务在后台运行php

时间:2011-09-02 06:38:31

标签: php web-services asynchronous symfony1 background-process

我正在使用需要在后台运行的php编写后台处理Web服务,即使用户关闭浏览器有没有办法用php做到这一点?

更多信息

是的,我正在使用symfony / php处理大型网络项目(工资单)。当工资单用户到达时,它需要在每个月处理,然后单击流程按钮。那么工资单应该在没有apache服务器超时的情况下处理。为此,我希望能够在后台运行异步Web服务。

2 个答案:

答案 0 :(得分:6)

评论员说,你应该使用CRON job,因为它最适合这类问题。但是,您需要通过单击用户来启动作业。这是我使用的:

  1. 单击用户,在某个表中创建一行,或创建一个文件 使用所需参数来执行任务。基本上它说到了 CRON'嘿,你需要启动任务'。
  2. 设置CRON作业以每分钟照看该行/文件,并且 如果找到行/文件,则启动任务。 之前删除文件 启动任务,或者可能发生相似的任务。
  3. 如果您需要在完成工资单时告诉您的用户,请执行 任务创建另一行/文件以显示CRON结束,并使用 javascript每30秒/ 1分钟刷新一次用户页面,并停止播放 找到新行/文件时自动刷新,并显示 适当的输出/通知信息。

答案 1 :(得分:2)

看看this article。根据您正在做的事情,这可能比CRON工作要好得多,更具体地说,如果您想立即采取行动 。 CRON作业限制为最多运行,每分钟一次,通过这种方法,您可以立即开始在后台处理请求。

// this script can run forever
set_time_limit(0);
 
// tell the client the request has finished processing
header('Location: index.php');  // redirect (optional)
header('Status: 200');          // status code
header('Connection: close');    // disconnect
 
// clear ob stack 
@ob_end_clean();
 
// continue processing once client disconnects
ignore_user_abort();
 
ob_start();
/* ------------------------------------------*/
/* this is where regular request code goes.. */
 
/* end where regular request code runs..     */
/* ------------------------------------------*/
$iSize = ob_get_length();
header("Content-Length: $iSize");
 
// if the session needs to be closed, persist it
// before closing the connection to avoid race
// conditions in the case of a redirect above
session_write_close();
 
// send the response payload to the client
@ob_end_flush();
flush();
 
/* -------------------------------------------*/
/* code here runs after the client disconnect */