通过ajax发送数组

时间:2014-10-14 13:16:41

标签: javascript php jquery ajax yii

我有一个xml文件,其中包含我想在数据库中存储或更新的信息。如果在30秒内脚本没有完成执行(更改了最长执行时间,没有帮助),我的服务器会将我重定向到上一页

我想将文件拆分成多个数组并通过ajax发送,以便在更多实例中处理,从而缩短执行时间。

该文件包含38k行,在30秒内我可以在db中添加6700个新对象或更新3800个现有对象。

有没有办法做到这一点?我对ajax很新,所以我甚至不知道从哪里开始寻找解决方案。

EDIT1:

    <?php
$time = microtime(TRUE);
$xml = simplexml_load_string(file_get_contents($feed));
$json = json_encode($xml);
$array = json_decode($json,TRUE);
$array= $array['Row'];
    set_time_limit(0); 
    ini_set('memory_limit','4000M'); 
//echo ini_get('max_execution_time');
//die();
$new = 0;
$existent = 0;
foreach($array as $produs)
{
        $prod = Products::model()->findbyattributes(array('cod'=>$produs['ProductId']));
        if(!$prod)
        {
            $prod = new Products;
            $prod->cod = $produs['ProductId'];
            $prod->price = $produs['PriceSRP'];
            $prod->name = $produs['Name'];
            $prod->furnizor= 'ABCData';
            $prod->brand = $produs['HierarchyNameLevel1'];
            //$prod->stock = $produs['Available'];
            if($produs['Available'] == "+")
                $prod->stock = 'Da';
            else
                {$prod->stock = 'Nu';}
            $prod->category = $prod->getCategory($produs['MinorGroup'], 'ABC');
            if(!$prod->category)
                continue;
            if(!$prod->save())
            {
                echo '<pre>';
                var_dump($prod->geterrors());
                echo '</pre>';
            }
            else{$new++;}
        }
        elseif($prod)
        {
            $prod->brand = $produs['HierarchyNameLevel1'];
            $prod->price = $produs['PriceSRP'];
            $prod->last_edit = date('Y-m-d H:i:s');
            if($produs['Available'] == "+")
                $prod->stock = 'Da';
            else
                {$prod->stock = 'Nu';}

            if(!$prod->save())
            {
                echo '<pre>';
                var_dump($prod->geterrors());
                echo '</pre>';
            }
            else {$existent++;}

        }
    }
    echo 'adaugat '.$new.' si updatat '.$existent.' produse in ';
    print (microtime(TRUE)-$time). ' secunde!';
    ?>

看来我的初帖可能不太清楚了。 所以这是我现有的代码。 $ feed文件中有38k项,我需要处理并添加或更新现有的数据库条目。

如果我在30秒后运行完整的38k文件,则浏览器执行apache服务器调用的history.back()。我本来希望从crond处理文件并且每秒处理例如1个条目,但这是不可能的,因为我无法访问该特定服务器上的crond。我试图手动拆分文件,它可以很好地处理~6700个新条目或3500 - 4000个现有条目(因为它必须找到它们,加载它们,更新它们并保存)

所以我最初的问题,以及我在询问是否可以通过ajax执行此操作,因此如果脚本延长30秒,服务器将无法停止执行脚本(就像我不知道的那样)甚至知道服务器是否会将ajax解释为新请求并且现有脚本不会等待它响应。

2 个答案:

答案 0 :(得分:1)

我会将xml文件保存在临时文件夹中,然后执行ajax get运行来自特定偏移的文件(例如)100条记录:

function processScript(offset) {
    $.ajax({
        type: "POST",
        url: "some.php",
        data: { offset:offset },
        dataType:'json',
        success: function(data) {
            var o = parseJSON(data);
            if(o.offset > 0) {
                processScript(o.offset);
            }
        }
    })
}
processScript(0);

some.php中,您希望返回一个带有属性&#39; offset&#39;的json对象。包含您要处理的下一个元素块。完成xml文件后,将offset设置为0。

以上代码足以让您入门。您还需要在success函数中进行某种错误处理,并向用户提供进度通知(例如,#38; 38,000行中的3,600个进程&#34;?)。

答案 1 :(得分:-1)

array = $('.def-mask :checkbox:checked').serialize();

$.ajax({

    url: 'ajax/battle.php',

    type: 'post',

    data: { playerReady: 1, attack: attack, defence: array },

    success: function(data) {

        alert(data);
    }
});

More info