等待完成 PHP 处理的最佳方法

Best approach to waiting for completed PHP processing

本文关键字:最佳 方法 处理 PHP 等待      更新时间:2023-09-26

我对网络编程很陌生,所以请耐心等待。

我创建了一个将表单数据提交到 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 调用中引用的"fetch"函数的代码如下所示:

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();
    }
}

我在这里要做的是执行一次外部网站处理/操作,同时等待处理完成。"fetch"功能检查我的输出文件是否已创建。如果有,则处理结束。

这是解决此问题的合理编程方法吗?有没有更好的替代方案?

我将非常感谢您能提供的任何见解。我真的很想学习正确的做事方式。

我试着对HTTP请求进行一个简单的解释......

首先,您将后端代码放在Web服务器上,在用php编写的情况下。此脚本不执行任何其他操作,然后处理您发送给它的数据,并可能发布(回显(失败,或者将其处理成功发送回前端客户端。在您的情况下,仅此而已。

在前端方面,无论您使用哪种语言或设备,它几乎都是相同的过程。

你在异步任务中调用HTTP POST或GET请求,在你的例子中,jQuery通过调用它的$.ajax函数来为你做这件事。

同样在该请求中,您定义了一个回调函数,该函数将在异步处理完成后自动调用。 jQuery也为你做了这件事,它是$.ajax之后的.done((函数。

为了指示加载,最好的方法是在 $.ajax 代码行之前显示您的加载图像......并在 .done(( 函数中隐藏或删除它...要指示加载已完成...

仅此而已。