等待完成PHP处理的最佳方法
问题描述:
我是网络编程的新手,所以请耐心等待。等待完成PHP处理的最佳方法
我创建了一个提交表单数据到PHP exec()函数的网页。该功能从网站请求数据(一次或多次),以各种方式处理数据,并将其粘贴到我的Web服务器上的文件中。在处理时,网页上会出现一个加载器.gif文件。我已经创建了一段JavaScript代码来处理进程等待期,但我不确定我是否正确地做了这件事。该脚本如下:
<script>
window.set = 0;
window.uid = '';
document.forms[0].onsubmit = function(e)
{
console.log($(this).serialize());
e.preventDefault();
e.stopPropagation();
// Display "Waiting" .gif during processing
$('#loader').show();
// Perform data submission once (when window.set = 0). After that,
// keep waiting for output and manifest file to be created. Call
// "fetch" function repeatedly to test for completion. When completed,
// call clearInterval to stop processing.
window.int_ = setInterval(function()
{
$.ajax({
"url": "./",
"type": "POST",
"data": !window.set ?$("#form").serialize() : { 'fetch': 1, 'uid': window.uid }}).done(function(data)
{
var d = data = JSON.parse(data);
if (!window.set)
{
window.uid = d.uid;
window.set = 1;
return;
}
if (data.status === 'ok')
{
document.location.replace(data.href);
data.manifest = data.manifest.replace(/\./g, ".<br />");
$('#manifest').show();
$('#manifest').html("<b>Results from run:</b> <br />" + data.manifest);
$('#loader').hide();
window.set = 0;
window.uid = '';
clearInterval(window.int_);
}
else
{
// waiting
}
});
}, 100);
}
</script>
在第一个AJAX调用所引用的“获取”功能的代码如下:
if ($_POST['fetch'])
{
$uid = $_POST['uid'];
/* check for availability*/
if (is_file(realpath("./$uid")))
{
$f = file_get_contents($uid);
$m = file_get_contents("./$uid.manifest");
}
else
{
$f = "";
}
if ($f != "")
{
echo json_encode(array("status" => "ok", "href" => $f, "manifest" => $m));
die();
}
else
{
echo json_encode(array("status" => "err", "href" => $f));
die();
}
}
我想在这里做的是对外部网站处理/操作一次,等待处理完成。 “获取”函数检查是否已创建我的输出文件。如果有,处理结束。
这是一个程序化的方法来解决这个问题吗?有替代品会好得多吗?
我将不胜感激任何洞察力,你可以提供。我真的很想学习正确的做事方式。
答
我尽量让HTTP请求的简单解释...
起初,你有一个Web服务器的后端代码,你的情况用PHP编写的。这个脚本不会执行其他任何操作,然后处理发送给它的数据,并可能发布(回显)失败,或将其处理成功返回到前端客户端。在你的情况下,这一切。
在前端方面它几乎相同的程序,无论您采取的语言或设备。
您在异步任务中调用HTTP POST或GET请求,在您的情况下,jQuery通过将它的$ .ajax函数调用到您的php来为您执行此操作。
同样在那个请求中,你定义了一个回调函数,在异步处理完成后,它将被自动调用。 jQuery也为你做了这个,它的.done()函数就在$ .ajax之后。
为了指示载荷,最好的办法是显示您加载图片的代码$就前行权......而隐藏或删除其中,.done()函数中...为了表示加载完成...
就是这样。
10FPS太多了,下降到3或4.或者只是睡眠()+在PHP循环等待,直到它没有完成轮询。 – dandavis 2014-12-06 23:41:03