长时间运行脚本的可突发输出

时间:2010-10-07 17:02:52

标签: language-agnostic timeout

脚本

<?php
include('time.php'); //time script
echo "First 100 users of SO<br/>";
for($i=0; $i<100;$i++){
$contents=file_get_contents("https://stackoverflow.com/privileges/user/".$i);
preg_match('!<div class="summarycount al">(.+?)</div>!', $contents, $matches);
$rep = $matches[1];
echo "<br/>".$i.") ".$rep."<br/>";

include('timetaken.php'); //script which outputs time difference
}
?>

输出

First 100 users of SO

0) 0
2.3584280014038
1) 14,436
4.469074010849
2) 875
10.651238918304
3) 2,431
12.991086959839
4) 8,611
15.451638936996
5) 14,988
17.535580873489
6) 0
19.686461925507
7) 0
21.796992063522
8) 218
23.931365013123
9) 2,569
26.419286966324
10) 101
28.540382862091
11) 232
30.755586862564
12) 0
32.960548877716
13) 33,898
35.163224935532
14) 0
37.280658006668
15) 6,388
39.425274848938
16) 143
41.541421890259
17) 14,366
43.655340909958
18) 0
45.771246910095
19) 99
47.882269859314
20) 4,204
49.993322849274
21) 0
52.108762979507
22) 1,517
54.221307039261
23) 411
56.345490932465
24) 103
58.892389059067
Fatal error: Maximum execution time of 60 seconds exceeded in C:\test.php on line 5

此脚本出现问题: 1.页面超时后加载60秒

我知道我可以添加

set_time_limit(500);

代码并获得前100个声誉,但这会在120秒之后导致页面加载。

如何使用PHP或使用任何其他语言(python,java)或其他任何方式收集数据,我可以如何快速获得结果。 在有人说出来之前,我已经阅读了Best way to manage long-running php script?,这可能是重复的,但是没有回答我的问题。 我的问题不是完成整个作业,而是显示结果。

(请为我处理标签)

2 个答案:

答案 0 :(得分:1)

如果样本确实是您正在做的事情,那么如何收集数据并将其存储在本地?这会加快速度。您可以定期重新收获,但除非数据真的对时间敏感,否则这可能不是您想要在每次页面加载时执行的操作。

或者,我会认真考虑将一些逻辑转移到客户端。这有两种方法:

1)有一个php进程,它以记录的get参数开始。对每个进程进行ajax调用,抓取下一组记录,并将结果添加到dom中。 (JQuery是这样做的一种好方法。)根据您的需求和测试显示的内容,您可以在每次获取启动时获得下一个获取请求的回调,或者您可以一次启动多个获取。

2)完全跳过php,并在浏览器中使用javascript完成所有操作。毕竟,您只是加载和解析html(尽管您可能需要处理一些跨域问题)。

答案 1 :(得分:1)

当看到这样的东西时,我喜欢这样想:你没有检索一百个用户,你正在检索一个任意用户一百次。我希望打破你正在查看的数据的检索(从有问题的例子中走出来)到一个简单的函数,然后通过Javascript调用该函数(无论JS是自己做的,还是你有JS)调用一个PHP页面,返回结果取决于你),然后在页面进入时更新结果。

通过这种方式,您不需要设置超时,并且可以在结果传播时更新页面,而不是尝试在一个大块中完成所有操作。