2010-10-07 76 views
0

脚本爆裂输出长时间运行的脚本

<?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秒的时候,它timesout

我知道我可以加一个

set_time_limit(500); 

的代码,并获得第100个名誉,但是这将导致在后页面加载说120秒。

如何在短时间内获得结果,因为数据是使用PHP或使用任何其他语言(python,java)或其他任何语言收集的。 之前有人说,我已经阅读Best way to manage long-running php script?,这可能是一个可能的重复,但没有回答我的问题。 我的问题是没有完成全部作业,但因为它正在做显示结果。

(请处理标签对我来说)

回答

1

如果样品是真的,你在做什么,怎么样采集数据,并将其存储在本地?这会加速很多事情。您可以定期重新采集数据,但除非数据对时间敏感,否则这可能不是您想要在每个页面加载时执行的操作。

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

1)有一个PHP进程,它需要一个获取参数的记录开始。对这个过程进行ajax调用,每个记录抓取下一组记录,并将结果添加到dom中。 (JQuery的一个好办法做到这一点。)根据您的需求,什么测试表明,你可以有回调每个获得启动下GET请求,或者你可以推出多款可获得某一时间。 2)完全跳过PHP,并在浏览器中用JavaScript做所有事情。毕竟,你只是加载和解析HTML(虽然你可能不得不处理一些跨域问题)。

+0

样品是一个例子,我一直在寻找作为脚本被处理,而不是在它的端部来显示输出。你究竟是什么意思我的收获数据。要以这种方式查询整个SO用户列表,我必须设置一个非常大的时间限制,然后将其存储到本地数据库。无论如何要在服务器的后台执行此操作。 – abel 2010-10-08 11:10:08

+0

收获的简单版本可能会像这样。存储最后收获的ID的变量。有一个查找该变量的脚本,然后开始导入记录。对于每个导入的记录,提取并在本地存储(大概在一个分贝)你想要的信息。在退出之前(或每次完成一条记录时),更新存储的最后收集的id变量。设置脚本只能收获如此多的记录,比如5分钟。有cron定期调用脚本,直到所有记录收获。然后偶然地获得自上次收获以来创建的任何新记录。 – 2010-10-08 17:19:56

+0

只是要清楚:在Linux机器上,您使用cron来定期运行预定事件。在IIS上,您使用调度程序(我认为这就是所谓的)。无论哪种情况,这都是在服务器上运行定期发生的后台php进程的标准方式。 – 2010-10-08 17:24:32

1

当看着这样的事情时,我喜欢这样想:你没有检索到一百个用户,你只需要检索一个任意用户一百次。我想看看,打破你看(从有问题的例子踏步而去)成一个简单函数的数据的检索,然后调用通过Javascript该功能(JS是否这样做本身,或者如果你有JS调用一个PHP页面,返回结果由你决定),然后在页面上更新结果。

这样,你不需要设置一个巨大的超时时间,并且你可以更新结果会传播页面,而不是试图在一个大块中完成。