ajax调用如何在长时间执行PHP期间检索部分结果

大家好.

我有一个页面通过AJAX调用脚本,该脚本调用prestashop Web服务,并且必须一次插入多个项目.我的问题是,脚本在大多数情况下似乎都“冻结”,然后在2或3分钟后开始打印结果,并从结尾开始继续.我想做的是每次插入项目时从脚本中检索某些内容,而不是“缓冲”数百个结果,然后一次查看所有结果.

这是我正在使用的代码(去除不必要的部分).

<?PHP
function PS_new_product(all product attributes) {
    global $webService;

    try {

        $opt = array('resource' => 'products');
        $opt['postXml'] = $xml -> asXML();
        $xml = $webService -> add($opt); //this should return each product state (if it's inserted or not)
        return true;
    } catch (PrestaShopWebserviceException $ex) {

        return false;
    }

}

function inserisciProdottiRAW(){
    set_time_limit(30); 

    $sql_prodotti = "SELECT everything i need to import";

    if ($prodotti = MysqL_query($sql_prodotti)) {

        while ($row = MysqL_fetch_assoc($prodotti)){

            $webService = new PrestaShopWebservice(PS_SHOP_PATH, PS_WS_AUTH_KEY, DEBUG);
            $opt = array('resource' => 'products');
            $opt['filter[reference]'] ="[".$row["modello"]."]";     
            $xml = $webService->get($opt);
            $prodotto = $xml->children()->children();

            if ($prodotto->product[@id] == ""){
            PS_new_product(/*all product attributes*/)
            }
        }   
    }

echo "ok";
}

inserisciProdottiRAW();
?>

我想要一些我可以在它称为的页面中捕捉到的信息,例如,它在某个时间到达了哪些物品…这可能吗?还是我必须实现某种方法,以便每隔30毫秒就对插入数据库中的项目进行计数?

解决方法:

如果您需要一种快速且肮脏的解决方案-只需在每次插入后添加回显,并确保它包含换行符并且其大小足以刷新PHP / apache中的缓存(4KB即可).例如,使用此方法

function logProgress($message)
{
    echo($messsage);
    for ($i=0; $i<4096; $i++)
    {
        echo(" ");
    }
    echo("\n");
}

如果使用gzip,那么这还不够,还需要使用其他随机的空白字符.

如果要向某些用户显示进度,则可以在后台运行插入脚本,将状态保存在某些数据库表中,然后从其他脚本轮询它.

可以使用fork功能(卷曲)来运行后台作业,或者如果您需要好的作业管理器,请尝试gearman.

另请注意,如果您使用会话,则不能同时运行2个脚本-一个将等待另一个脚本完成.如果您知道将不再在脚本中使用会话,则可以调用session_close()摆脱此锁定问题.

相关文章

IE6是一个非常老旧的网页浏览器,虽然现在很少人再使用它,但...
PHP中的count()函数是用来计算数组或容器中元素的个数。这个...
使用 AJAX(Asynchronous JavaScript and XML)技术可以在不...
Ajax(Asynchronous JavaScript and XML)是一种用于改进网页...
本文将介绍如何通过AJAX下载Excel文件流。通过AJAX,我们可以...
Ajax是一种用于客户端和服务器之间的异步通信技术。通过Ajax...