Возобновляемый вывод для длительных скриптов - PullRequest
0 голосов
/ 07 октября 2010

сценарий

<?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) или чего-либо еще. Прежде чем кто-то это скажет, я прочитал Лучший способ управления долгоиграющим PHP-скриптом? , который может быть возможной копией, но не отвечает на мой вопрос. Мой вопрос не завершает всю работу, но отображает результаты, как это делается.

(Пожалуйста, разберитесь с тегами для меня)

Ответы [ 2 ]

1 голос
/ 08 октября 2010

Когда я смотрю на что-то подобное, мне нравится думать об этом так: вы не извлекаете сотню пользователей, вы извлекаете одного произвольного пользователя сто раз. Я хотел бы разбить извлечение данных, которые вы просматриваете (отступая от рассматриваемого примера), на простую функцию, затем вызвать эту функцию через Javascript (независимо от того, выполняет ли JS это сам или если у вас есть JS). вызовите страницу PHP, которая возвращает результаты, зависит от вас), а затем обновите результаты на странице по мере их поступления.

Таким образом, вам не нужно устанавливать большой тайм-аут, и вы можете обновлять страницу по мере распространения результатов, вместо того, чтобы пытаться делать все это одним большим куском.

1 голос
/ 08 октября 2010

Если образец действительно то, что вы делаете, как насчет сбора данных и их локального хранения?Это бы сильно ускорило ситуацию.Вы можете периодически собирать урожай, но если данные не очень чувствительны ко времени, это, вероятно, не то, что вы хотите делать при каждой загрузке страницы.

В качестве альтернативы, я бы серьезно подумал о переносе некоторой логики на клиента.Вот два подхода:

1) Есть процесс php, который принимает параметр get для начала записи.Делайте ajax-вызовы этому процессу, каждый из которых захватывает следующий набор записей и добавляет результат в dom.(Один из хороших способов сделать это - JQuery.) В зависимости от ваших потребностей и того, что показывает тестирование, у вас может быть обратный вызов для каждого запуска get при следующем запросе get, или вы можете запускать несколько get одновременно.

2) Пропустить php полностью и делать все с помощью javascript в браузере.В конце концов, вы просто загружаете и анализируете html (хотя вам, возможно, придется столкнуться с некоторыми междоменными проблемами).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...