我有一个像这样工作的 PHP 程序
- 用户上传图片
- 图像已处理
- 调用其他时间密集型函数
- 上传确认发送给用户。
问题是第 2 项和第 3 项占用了大量时间 - 我怎样才能推迟这些进程以异步运行?
我想在图像上传后直接开始运行进程,但仍然继续做其他事情而不是等待。
我知道 cron,但我不想安排任务 - 我只是不想等待它完成。
我有哪些选择?
编辑
只是要清楚这个项目只是服务器端。没有javascript选项。
我有一个像这样工作的 PHP 程序
问题是第 2 项和第 3 项占用了大量时间 - 我怎样才能推迟这些进程以异步运行?
我想在图像上传后直接开始运行进程,但仍然继续做其他事情而不是等待。
我知道 cron,但我不想安排任务 - 我只是不想等待它完成。
我有哪些选择?
编辑
只是要清楚这个项目只是服务器端。没有javascript选项。
首先,我建议您重新排序任务:
上传确认发送给用户。
图像已处理
然后您有以下选项,如何推迟第 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 请求?
如果需要,将您的代码一分为二,因此耗时的逻辑位于单独的脚本中,例如timeConsumer.php
. 然后您可以使用pcntl-fork()创建一个子进程并在其中执行timeConsumer.php
。
或者,您可以使用文档中列出的exec()
任何其他可能方式。在 Unix/Linux 系统上,您可以在命令字符串的末尾添加一个,这样程序就会在后台执行。 &
您可以将上传图像的名称timeConsumer.php
作为命令行参数传递给您,然后可以通过全局变量访问$argv
。(这是一个数组)
为此,您需要使用 ajax/jquery。上传图片后调用这个。见吹。
$.ajax({
url: 'process.php',
type: 'post',
success: function(data) {
//this is triggered when 2 and 3 is done.
}
});