0

我有一个用户可以发布链接的网站。用户填写包含 2 个字段的表单:

  • 标题
  • 网址

当用户单击“提交”时,我有一个爬虫,它会查找所提供链接的图像并制作缩略图。

问题是爬虫通常需要大约 5-10 秒才能完成加载和裁剪拇指。

我以为我可以像这样进行ajax调用。如您所见,当用户首先提交链接时,我们会查看其是否有效(第一次 ajax 调用),然后如果成功,我们会进行另一个 ajax 调用以尝试查找并保存此链接的图像。

我的想法是在将用户移动到 links.php 页面时这样做,但是,我发现如果我这样做,AJAX 调用会中断并且函数save_image.php不会运行。

我可以做些什么来避免让我的用户等待这个save_image.php过程?我需要运行这个过程,但我不需要返回任何数据。

$.ajax({
                    url: 'publish/submit_link.php',
                    type: 'POST',
                    dataType: 'JSON',
                    data: {
                        link            : link,
                        title           : title,
                    },
                    success: function (data) {
                        if (data) 
                        {
                            $.ajax({
                                url: 'publish/save_image.php',                                      type: 'POST',
                                data: {
                                        id              : data.id,
                                        type            : data.type,
                                    url             : url,
                                        csrf_test_name  : csrf
                                }
                            });
                        }

                        //THIS NEXT LINE BREAKS SECOND AJAX CALL
                        window.location = 'links.php';

                    }   
});

提前致谢!

总结:我希望用户在生成该链接的缩略图时提交链接并将用户重定向到链接页面。我不想向用户显示缩略图。

4

4 回答 4

3

AJAX 请求似乎失败了,因为当您离开时,用户请求被中止。因此,执行save_image.php被中断。

您可以使用 PHPignore_user_abort来强制 PHP 进程在后台继续。把它放在顶部save_image.php

<?php
    ignore_user_abort(true);

    // ... save image, etc.
?>

为此,您必须向客户端发送(并刷新)一些输出:

在尝试向客户端发送信息之前,PHP 不会检测到用户已中止连接。简单地使用 echo 语句并不能保证发送信息,请参阅flush()

任何输出都应该有效(例如“OK”)。考虑到您使用的是框架,这可能有点挑战,但这不应该是不可能的。这可能有效:使用 CodeIgniter 冲洗

您可以在此处阅读有关 PHP 连接处理的更多信息。

于 2012-08-18T12:00:37.140 回答
1

强制用户先填写 url,然后填写标题,当用户转到标题字段时开始抓取数据,直到完成标题并按 sumbit,您将获得一些时间并使过程明显更快。

于 2012-08-18T11:55:07.907 回答
0

如果您不需要返回的数据,为什么还要使用 XHR?只需让您的表单提交链接links.php并将图像保存在那里!

于 2012-08-18T11:43:55.243 回答
0

要了解您的问题,我们需要了解 javascript 的工作原理

你的代码如下

$.ajax({
                    url: 'publish/submit_link.php',
                    type: 'POST',
                    dataType: 'JSON',
                    data: {
                        link            : link,
                        title           : title,
                    },
                    success: function (data) {
                        if (data) 
                        {
                            $.ajax({
                                url: 'publish/save_image.php',                                      type: 'POST',
                                data: {
                                        id              : data.id,
                                        type            : data.type,
                                    url             : url,
                                        csrf_test_name  : csrf
                                }
                            });
                        }

                        //THIS NEXT LINE BREAKS SECOND AJAX CALL
                        window.location = 'links.php';

                    }   
});

从上面我可以说,只要发出 ajax 请求,java 脚本就会执行第二行,而不管响应如何。

我们可以举以下例子

$.ajax({
                    url: 'publish/submit_link.php',
                    type: 'POST',
                    dataType: 'JSON',
                    data: {
                        link            : link,
                        title           : title,
                    },
                    success: function (data) 
                    {
                         console.log(data);
                    }
});

for(var i = 0; i < 15000000; i++)
{
      console.log(i);
}

您可能会看到如下输出

1
2
3
.
.
.
1000
data//response of ajax
.
.
14999999

所以为了避免你可以使用jQuery.when()我们的 ajax 成功函数。

希望这会帮助你

于 2012-08-20T05:24:07.953 回答