我编写了一个自动化脚本来解析本地的XML文件,从XML中提取一些网址,然后下载网址指向的文件并存储数据(所有jpg' s)。每次后续迭代都需要越来越长的时间。最终,脚本挂起,没有任何反应。哦,内存使用似乎保持不变。 XML解析工作正常,所以请不要过多地讨论它。如果我在脚本完全停止的游戏中启动脚本,则会在一秒钟内将文件保存到磁盘,因为这是脚本执行的第一次保存。是什么造成的?这是代码:
<?php
$xml = simplexml_load_file('./playfin.xml', null, LIBXML_NOCDATA);
echo("Getting urls from the XML...\n");
$data = array();
foreach($xml->game as $game) {
$smlBox = $game->small_boxshot_image->url;
$lrgBox = $game->large_boxshot_image->url;
foreach($game->screenshots->screenshot_image as $image) {
$scrShots[] = array(
'smlScr' => (string)$image->small_screenshot_image->url,
'lrgScr' => (string)$image->large_screenshot_image->url
);
}
$data[] = array(
'id' => (int)$game->game_id,
'smlBox' => (string)$smlBox,
'lrgBox' => (string)$lrgBox,
'scrShots' => $scrShots
);
}
echo("Done pulling urls from XML...\n");
echo("Storing picture data to disk...\n");
$start = time();
$total = 0;
$now = 0;
for($i = 0; $i < count($data); $i++) {
$total += $now;
$now = time() - $start - $total;
echo("Writing game id: ".$data[$i]['id'].
." to disk at time=".(string)$now." seconds.\n");
echo("Memory usage: ".(string)memory_get_usage(true)."\n\n");
$smlBoxStr = '%s_49_60.jpg';
$lrgBoxStr = '%s_160_189.jpg';
$smlScrStr = '%s_115_86_%d.jpg';
$lrgScrStr = '%s_300_300_%d.jpg';
writeData($data[$i]['smlBox'], sprintf($smlBoxStr, $data[$i]['id']), 'boxshot');
writeData($data[$i]['lrgBox'], sprintf($lrgBoxStr, $data[$i]['id']), 'boxshot');
for($j = 0; $j < count($data[$i]['scrShots']); $j++) {
writeData(
$data[$i]['scrShots'][$j]['smlScr'],
sprintf($smlScrStr, $data[$i]['id'], $j),
'screenshot'
);
writeData(
$data[$i]['scrShots'][$j]['lrgScr'],
sprintf($lrgScrStr, $data[$i]['id'], $j),
'screenshot'
);
}
}
echo("Done storing!\n");
echo("Done!\n");
function writeData($url, $file, $type) {
$headers = get_headers($url, 1);
$awayPic = fopen($url, 'rb');
$localPic = fopen("./$type/$file", 'wb');
while($picData = fread($awayPic, (int)$headers['Content-Length'])) {
fwrite($localPic, $picData);
}
fclose($awayPic);
fclose($localPic);
}
?>
这里是生成的日志文件:
从XML获取网址...从XML中提取网址...存储 图片数据到磁盘...在时间= 0时将游戏ID:671850写入磁盘 秒。内存使用情况:77856768
在时间= 0秒时将游戏ID:730950写入磁盘。内存使用情况: 77856768
在时间= 1秒时将游戏ID:621650写入磁盘。内存使用情况: 77856768
在时间= 1秒时将游戏ID:687250写入磁盘。内存使用情况: 77856768
在时间= 7秒时将游戏ID:633950写入磁盘。内存使用情况: 77856768
在时间= 2秒时将游戏ID:633850写入磁盘。内存使用情况: 77856768
在时间= 2秒时将游戏ID:720950写入磁盘。内存使用情况: 77856768
在时间= 3秒时将游戏ID:572250写入磁盘。内存使用情况: 77856768
在时间= 3秒时将游戏ID:674950写入磁盘。内存使用情况: 77856768
在时间= 3秒时将游戏ID:731450写入磁盘。内存使用情况: 77856768
在时间= 4秒时将游戏ID:656350写入磁盘。内存使用情况: 77856768
在时间= 4秒时将游戏ID:653550写入磁盘。内存使用情况: 77856768
在时间= 4秒时将游戏ID:585550写入磁盘。内存使用情况: 77856768
在时间= 5秒时将游戏ID:736750写入磁盘。内存使用情况: 77856768
在时间= 5秒时将游戏ID:671350写入磁盘。内存使用情况: 77856768
在时间= 5秒时将游戏ID:696250写入磁盘。内存使用情况: 77856768
在时间= 6秒时将游戏ID:645550写入磁盘。内存使用情况: 77856768
在时间= 6秒时将游戏ID:625650写入磁盘。内存使用情况: 77856768
在时间= 6秒时将游戏ID:696850写入磁盘。内存使用情况: 77856768
在时间= 7秒时将游戏ID:709550写入磁盘。内存使用情况: 77856768
在时间= 7秒时将游戏ID:575750写入磁盘。内存使用情况: 77856768
在时间= 7秒时将游戏ID:651950写入磁盘。内存使用情况: 77856768
在时间= 8秒时将游戏ID:685350写入磁盘。内存使用情况: 77856768
在时间= 9秒时将游戏ID:724150写入磁盘。内存使用情况: 77856768
在时间= 8秒时将游戏ID:522250写入磁盘。内存使用情况: 77856768
在时间= 10秒时将游戏ID:610350写入磁盘。内存使用情况: 77856768
在时间= 9秒时将游戏ID:645050写入磁盘。内存使用情况: 77856768
在时间= 9秒时将游戏ID:716950写入磁盘。内存使用情况: 77856768
在时间= 10秒时将游戏ID:672750写入磁盘。内存使用情况: 77856768
在时间= 11秒时将游戏ID:568650写入磁盘。内存使用情况: 77856768
在时间= 11秒时将游戏ID:668650写入磁盘。内存使用情况: 77856768
在时间= 11秒时将游戏ID:417950写入磁盘。内存使用情况: 77856768
在时间= 13秒时将游戏ID:497950写入磁盘。内存使用情况: 77856768
在时间= 12秒时将游戏ID:567950写入磁盘。内存使用情况: 77856768
在时间= 13秒时将游戏ID:692350写入磁盘。内存使用情况: 77856768
在时间= 13秒时将游戏ID:450950写入磁盘。内存使用情况: 77856768
在时间= 14秒时将游戏ID:452750写入磁盘。内存使用情况: 77856768
在时间= 14秒时将游戏ID:666450写入磁盘。内存使用情况: 77856768
在时间= 15秒时将游戏ID:754550写入磁盘。内存使用情况: 77856768
在时间= 15秒时将游戏ID:659050写入磁盘。内存使用情况: 77856768
在时间= 15秒时将游戏ID:712350写入磁盘。内存使用情况: 77856768
在时间= 16秒时将游戏ID:719250写入磁盘。内存使用情况: 77856768
在时间= 15秒时将游戏ID:529250写入磁盘。内存使用情况: 77856768
在时间= 17秒时将游戏ID:685150写入磁盘。内存使用情况: 77856768
在时间= 17秒时将游戏ID:736450写入磁盘。内存使用情况: 77856768
在时间= 17秒时将游戏ID:252750写入磁盘。内存使用情况: 77856768
在时间= 17秒时将游戏ID:719150写入磁盘。内存使用情况: 77856768
在时间= 18秒时将游戏ID:461150写入磁盘。内存使用情况: 77856768
在时间= 18秒时将游戏ID:699450写入磁盘。内存使用情况: 77856768
在时间= 18秒时将游戏ID:523550写入磁盘。内存使用情况: 77856768
在时间= 20秒时将游戏ID:451050写入磁盘。内存使用情况: 77856768
在时间= 19秒时将游戏ID:768350写入磁盘。内存使用情况: 77856768
在时间= 20秒时将游戏ID:724650写入磁盘。内存使用情况: 77856768
在时间= 21秒时将游戏ID:676550写入磁盘。内存使用情况: 77856768
在时间= 21秒时将游戏ID:730850写入磁盘。内存使用情况: 77856768
在时间= 22秒时将游戏ID:558250写入磁盘。内存使用情况: 77856768
在时间= 22秒时将游戏ID:674750写入磁盘。内存使用情况: 77856768
在时间= 22秒时将游戏ID:695450写入磁盘。内存使用情况: 77856768
在时间= 22秒时将游戏ID:682950写入磁盘。内存使用情况: 77856768
在时间= 24秒时将游戏ID:706450写入磁盘。内存使用情况: 77856768
在时间= 24秒时将游戏ID:546450写入磁盘。内存使用情况: 77856768
在时间= 24秒时将游戏ID:575350写入磁盘。内存使用情况: 77856768
在时间= 25秒时将游戏ID:616550写入磁盘。内存使用情况: 77856768
在时间= 26秒时将游戏ID:648250写入磁盘。内存使用情况: 77856768
在时间= 25秒时将游戏ID:763750写入磁盘。内存使用情况: 77856768
在时间= 26秒时将游戏ID:613850写入磁盘。内存使用情况: 77856768
在时间= 25秒时将游戏ID:645450写入磁盘。内存使用情况: 77856768
在时间= 33秒时将游戏ID:695950写入磁盘。内存使用情况: 77856768
在时间= 27秒时将游戏ID:661050写入磁盘。内存使用情况: 77856768
在时间= 27秒时将游戏ID:461050写入磁盘。内存使用情况: 77856768
在时间= 29秒时将游戏ID:693150写入磁盘。内存使用情况: 77856768
谢谢!
答案 0 :(得分:3)
问题是在解析XML时你没有在外循环中清除$scrShots
。因此,每次迭代不仅包含当前游戏的屏幕截图,还包括所有之前的游戏。 (这样,你从第一个游戏下载图像,然后从第一个游戏加上第二个游戏中的图像,然后是第一个加第二个加第三个等等,这当然需要更长更长的时间。)
在添加下一轮之前尝试清除数组:
$scrShots = array();
foreach($game->screenshots->screenshot_image as $image) {
$scrShots[] = array(
...
答案 1 :(得分:0)
除了沃尔夫冈发现的问题(主要问题),你错误地计算时间(小问题)。
Writing game id: 687250 to disk at time=1 seconds. Memory usage: 77856768
Writing game id: 633950 to disk at time=7 seconds. Memory usage: 77856768
Writing game id: 633850 to disk at time=2 seconds. Memory usage: 77856768
让我们假设$ start从1000开始,每次迭代需要1秒
for($i = 0; $i < count($data); $i++) {
$total += $now;
$now = time() - $start - $total;
然后,这将是你在循环的每次迭代后的值
1: $total: 0, $now: 1000 - 1000 - 0 = 0
2: $total: 0, $now: 1001 - 1000 - 0 = 1
3: $total: 1, $now: 1002 - 1000 - 1 = 1
4: $total: 1, $now: 1003 - 1000 - 1 = 2
5: $total: 2, $now: 1004 - 1000 - 2 = 2
6: $total: 2, $now: 1005 - 1000 - 2 = 3
7: $total: 3, $now: 1006 - 1000 - 3 = 3
7: $total: 3, $now: 1007 - 1000 - 3 = 4
这绝对不是你想要的。不知道为什么你现在用$计算你的$。 :)
这就是你想要的。
for($i = 0; $i < count($data); $i++) {
$now = time() - $start;
...
}
$total = $now - $start;