【问题标题】:How to write asynchronous web service run in background php如何编写在后台运行的异步Web服务php
【发布时间】:2011-09-02 06:38:30
【问题描述】:

我准备使用 php 编写后台处理 web 服务,即使用户关闭浏览器也需要在后台运行。有没有办法使用 php 来做到这一点?

更多信息

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

【问题讨论】:

  • 是的,究竟你想做什么?
  • 您始终可以从命令行运行您的 PHP 脚本并将其安装为 cronjob - 但我同意我以前的海报,您为什么要使用 Web 服务来执行此操作? ;)
  • 创建一个 symfony 任务,在 cronjob 中每 10 分钟安排一次,并让它检查数据库以查看按钮是否被按下。这几乎是您可以做的更容易的事情。 :-)
  • 你不应该。这就是我们所说的 cronjob 的目标。 Cron 是一个守护进程,它允许在系统上独立于 Web 服务器定期运行脚本/二进制文件/任何内容。这最终被称为“后端”。如果你身边有优秀的 linux 用户或管理员,他们就会知道。查看clickmojo.com/code/cron-tutorial.html
  • 但是即使你可以直接调用它并且不应该通过任务的方式调用它,你也可以调用相同的代码,是的,如果它在自定义库中或在你的模型类中。这取决于您以及您如何编写代码。

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


【解决方案1】:

正如评论者所说,您应该使用CRON job,因为它最适合此类问题。但是,您需要在用户点击时启动您的工作。这是我会使用的:

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

【讨论】:

  • 问题是如果用户关闭浏览器会发生什么
  • 工作仍将完成,但用户将失去通知显示。这似乎是他们想要的,因为他们关闭了浏览器。
  • 我创建了 symfony 任务,然后我想从 shell_exec('/var/www/esm/symfony php symfony doNothing') 中执行它;但是apache错误说权限被拒绝。
  • 你为什么尝试通过 PHP 启动你的任务?使用 CRON 作业。
  • CRON 作业的问题是它们被限制为最多运行一次,每分钟一次,因此您无法“实时”处理事情。
【解决方案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 */

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 2018-10-18
    • 2016-03-02
    • 2020-05-01
    • 2010-09-12
    • 2014-11-20
    相关资源
    最近更新 更多