gpt4 book ai didi

javascript - 通过ajax发送数组

转载 作者:行者123 更新时间:2023-11-28 07:54:01 25 4
gpt4 key购买 nike

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

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

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

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

编辑1:

    <?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 解释为新请求,现有脚本不会等待它响应)。

最佳答案

我会将 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 中,您希望返回一个 json 对象,其属性“offset”包含您要处理的下一个元素 block 。当 xml 文件完成后,将 offset 设置为 0。

上面的代码足以让您入门。您还需要在 success 函数中进行某种错误检查,并向用户发出进度通知(例如“38,000 行中的 3,600 行正在处理”?)。

关于javascript - 通过ajax发送数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26361829/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com