-1

我有一个像这样工作的 PHP 程序

  1. 用户上传图片
  2. 图像已处理
  3. 调用其他时间密集型函数
  4. 上传确认发送给用户。

问题是第 2 项和第 3 项占用了大量时间 - 我怎样才能推迟这些进程以异步运行?

我想在图像上传后直接开始运行进程,但仍然继续做其他事情而不是等待。

我知道 cron,但我不想安排任务 - 我只是不想等待它完成。

我有哪些选择?

编辑

只是要清楚这个项目只是服务器端。没有javascript选项。

4

3 回答 3

2

首先,我建议您重新排序任务:

  1. 用户上传图片
  2. 上传确认发送给用户。

  3. 图像已处理

  4. 调用其他时间密集型函数

然后您有以下选项,如何推迟第 3 和第 4 部分:

选项 1:在第 2 步向用户发送确认,使用ignore_user_abort()并继续处理图像(非最佳,因为用户仍会看到“页面加载”消息。

选项 2:IBP 式。执行步骤 1-2,然后将处理作业添加到某种数据库。在随机时间向用户显示图像。图像实际上是链接到执行ignore_user_abort()和处理您的项目队列的 php 脚本。

选项 3:与选项 2 相同,但不显示图像。相反,您必须使用 cURL 或类似方法请求拥有服务器。想法是您开始请求,不要等待它结束,只需停止主脚本执行。

选项 4:启动一个每 5-15 分钟启动一次的 cron 脚本并执行所需的任务。它还可以 24 小时在后台运行,并在检查任务之间休眠 20 秒。如果您的网站相对繁忙,此选项可能是最佳选择。

选项 5:在将任务添加到队列后,尝试执行 exec() 或 shell_exec() 之类的操作来破坏后台处理脚本。

如何做选项 2 和 3 的示例: 异步 PHP 调用? 如何在 PHP 中发出异步 GET 请求?

于 2012-10-24T09:54:06.577 回答
2

如果需要,将您的代码一分为二,因此耗时的逻辑位于单独的脚本中,例如timeConsumer.php. 然后您可以使用pcntl-fork()创建一个子进程并在其中执行timeConsumer.php

或者,您可以使用文档中列出的exec()任何其他可能方式。在 Unix/Linux 系统上,您可以在命令字符串的末尾添加一个,这样程序就会在后台执行。 &

您可以将上传图像的名称timeConsumer.php作为命令行参数传递给您,然后可以通过全局变量访问$argv。(这是一个数组)

于 2012-10-24T09:55:33.957 回答
-2

为此,您需要使用 ajax/jquery。上传图片后调用这个。见吹。

$.ajax({
     url: 'process.php',
     type: 'post',
     success: function(data) {

          //this is triggered when 2 and 3 is done.

     }


});
于 2012-10-24T09:40:37.687 回答