我有一个用户可以发布链接的网站。用户填写包含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';
}
});
提前致谢!
提升:我希望用户提交一个链接并将用户重定向到链接页,同时生成该链接的缩略图。我不想向用户显示缩略图。
答案 0 :(得分:3)
AJAX请求似乎失败了,因为当您离开时,用户请求将被中止。因此,save_image.php
的执行被中断。
您可以使用PHP的ignore_user_abort
强制PHP进程在后台继续。把它放在save_image.php
的顶部:
<?php
ignore_user_abort(true);
// ... save image, etc.
?>
为此,您必须向客户端发送(和flush)一些输出:
在尝试向客户端发送信息之前,PHP不会检测到用户已中止连接。仅使用echo语句并不能保证信息的发送,请参阅flush()。
任何输出都应该有效(例如“OK”)。考虑到您正在使用框架,这可能是一个挑战,但这不应该是不可能的。这可能有效:Flushing with CodeIgniter
您可以阅读有关PHP连接处理here的更多信息。
答案 1 :(得分:1)
强制用户首先填写网址然后填写标题,当用户转到标题字段开始抓取数据时,直到完成标题并按下sumbit您将获得一些时间并使进程显然更快。
答案 2 :(得分:0)
如果您不需要返回数据,为什么要使用XHR?只需让您的表单提交links.php
的链接,然后将图片保存在那里!
答案 3 :(得分: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成功函数。
希望这会对你有所帮助