我有一个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解释为新请求并且现有脚本不会等待它响应。
答案 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);
}
});