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

标签 php jquery ajax

大家好。

我有一个通过 AJAX 调用脚本的页面,该脚本调用 prestashop 网络服务并且必须一次插入多个项目。我的问题是脚本大部分时间似乎“卡住”,然后在 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();
?>

我想要一些我可以在我调用它的页面中捕捉到的东西,例如它在特定时间到达了哪些项目......这可能吗?或者我必须实现一些东西来计算每... mh ... 30 秒插入数据库中的项目?

最佳答案

如果您需要一个快速而肮脏的解决方案 - 只需在每次插入后包含一个 echo 并确保它包含新行并且足够大以刷新 php/apache 中的缓存(4KB 应该可以做到)。例如使用此方法:

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

如果您使用 gzip,那么它还不够,还可以使用其他随机空白字符。

如果你想向某些用户显示进度,那么你可以在后台运行你的插入脚本,将状态保存在一些数据库表中并从不同的脚本中轮询它。

运行后台作业可以使用 fork 完成功能, curl 或者如果你需要好的工作经理,试试gearman .

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

关于php - ajax 调用如何在使用 PHP 长时间执行期间检索部分结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22179138/

相关文章:

javascript - 如何防止 jQuery 函数将元素一直向左移动?

javascript - jquery点击问题

javascript - Firefox 未在 "Network"选项卡中显示来自内容脚本的 AJAX 请求

jquery - 数据库更新后立即更新 UI 的最佳方法是什么(ASP.NET 和 JQuery)

jquery - 如何编写此 JSON 的实用程序以根据传递的名称返回值

javascript - 如何为动态网站编写用户脚本

PHP mysql 多重内连接

php - 我们可以在 PHP 的一行中执行多个 explode 语句吗?

php - 如何摆脱 PHP 通知 : Undefined index: HTTPS in X on line 123

php - Magento 1.14 中的 Paypal GetExpressCheckoutDetails 响应中缺少 SHIPTONAME 数组元素