我目前开始处理已经完成的脚本。它运作得很好,但它需要太长时间,我相信我知道原因,但我没有成功改进它。
案例如下,该脚本读取一个XML文件,其中包含大量有关温度的信息,所有这些信息都在xml内的各种<Previsao>
标记内。
$l = 3;
$q = $CON->Query("SELECT
cod_cidade,
cidade,
cidcompleta
FROM
listabrasil
WHERE
cidade LIKE '%Aj%'
ORDER BY
cidade ASC");
while ($x = $CON->Fetch ($q))
{
$XML = simplexml_load_file('http://ws.somarmeteorologia.com.br/previsao.php?Cidade='.$x['cidade'].'&DiasPrevisao=15');
print $x['cidade']."\n";
foreach ($XML->Previsao as $P)
{
$Previsao[$x['cidade']]['data'][] = (string)$P->Data;
$Previsao[$x['cidade']]['tmin'][] = (float) $P->Tmin;
$Previsao[$x['cidade']]['tmax'][] = (float) $P->Tmax;
$Previsao[$x['cidade']]['prec'][] = (float) $P->Prec;
$Previsao[$x['cidade']]['velvento'][] = (float) $P->VelVento;
$Previsao[$x['cidade']]['dirvento'][] = (string)$P->DirVento;
}
}
foreach ($Previsao as $Cid => $Dados)
{
$col = 1;
for($dias = 0; $dias < 15 ; $dias++)
{
$PlanilhaBloomberg->setCellValue($colunas[$col+0].'2', $Dados['data'][$dias]);
$PlanilhaBloomberg->setCellValue($colunas[$col+0].$l, $Dados['tmin'][$dias].'C');
$PlanilhaBloomberg->setCellValue($colunas[$col+1].$l, $Dados['tmax'][$dias].'C');
$PlanilhaBloomberg->setCellValue($colunas[$col+2].$l, $Dados['prec'][$dias].'mm');
$PlanilhaBloomberg->setCellValue($colunas[$col+3].$l, $Dados['velvento'][$dias].'km/h');
$PlanilhaBloomberg->setCellValue($colunas[$col+4].$l, $Dados['dirvento'][$dias]);
print $Dados['data'][$dias]."\n";
print $Dados['tmin'][$dias]."\n";
print $Dados['tmax'][$dias]."\n";
print $Dados['prec'][$dias]."\n";
print $Dados['velcento'][$dias]."\n";
print $Dados['dirvento'][$dias]."\n";
$col = $col + 5;
}
$l++;
}
不要担心setCellValue,它只是来自PHPExcel库。因此,从我可以收集到的内容来看,由于它从XML收集的大量数据显然需要花费很长时间才能执行,而且因为它不断填充多维数组$ Previsao ..我希望实现的目标(没有成功,我可以添加)是直接填充setCellValue,而不需要多维数组。你们认为它是否可能,如果是的话,会减少脚本的exec_time吗?
先谢谢大家的帮助,如果这个问题过于集中,也请原谅我,不确定这是否会引起问题。
答案 0 :(得分:0)
PHPExcel通常需要很长时间来设置CeCellValues。它们可能是更好地解决代码的最佳解决方案,但我不认为它会在运行时产生过大的差异。在保存文件之前尝试setPreCalculateFormulas(False),以便PHPExcel不会在保存时计算值。这可能会节省一些时间。第二,假设$ PlanilhaBloomberg是$ object-&gt; getActiveSheet(),你可以这样称呼它
SELECT CONCAT(first_name,middle_name,last_name),COUNT(*)-1 AS duplicatedusernameid
FROM users HAVING COUNT(*) > 1
这可能会有所帮助。
答案 1 :(得分:0)
你正在迭代数据库结果,为每个数据库结果迭代xml,以便在内存中构建一个大数组;然后迭代该数组以构建Excel工作表....当然应该可以避免构建大数组;数组的内存很昂贵,并且为该数组分配内存也花费了大量的时间开销。
应该可以直接从XML循环填充Excel,避免整个数组构建(这节省了内存和内存分配时间)并保存了整个循环。
实际上只是确定哪个单元格需要从哪个XML值填充;但我无法设想阵列结构可以解决这个问题