Как я могу непрерывно сообщать пользователю прогресса от Perl сценарий CGI?

Использовали этот отрывок некоторое время, кредитом является prism-perfect.net. Не использует теги H хотя

<div id="tags">
    <div class="title">Popular Searches</div>
    <?php
        // Snippet taken from [prism-perfect.net]

        include "/path/to/public_html/search/settings/database.php";
        include "/path/to/public_html/search/settings/conf.php";

        $query = "SELECT query AS tag, COUNT(*) AS quantity
        FROM sphider_query_log
        WHERE results > 0
        GROUP BY query
        ORDER BY query ASC
        LIMIT 10";

        $result = mysql_query($query) or die(mysql_error());

        while ($row = mysql_fetch_array($result)) {

            $tags[$row['tag']] = $row['quantity'];
        }

        // change these font sizes if you will
        $max_size = 30; // max font size in %
        $min_size = 11; // min font size in %

        // get the largest and smallest array values
        $max_qty = max(array_values($tags));
        $min_qty = min(array_values($tags));

        // find the range of values
        $spread = $max_qty - $min_qty;
        if (0 == $spread) { // we don't want to divide by zero
            $spread = 1;
        }

        // determine the font-size increment
        // this is the increase per tag quantity (times used)
        $step = ($max_size - $min_size)/($spread);

        // loop through our tag array
        foreach ($tags as $key => $value) {

            // calculate CSS font-size
            // find the $value in excess of $min_qty
            // multiply by the font-size increment ($size)
            // and add the $min_size set above
            $size = $min_size + (($value - $min_qty) * $step);
            // uncomment if you want sizes in whole %:
            // $size = ceil($size);

            // you'll need to put the link destination in place of the /search/search.php...
            // (assuming your tag links to some sort of details page)
            echo '<a href="/search/search.php?query='.$key.'&search=1" style="font-size: '.$size.'px"';
            // perhaps adjust this title attribute for the things that are tagged
            echo ' title="'.$value.' things tagged with '.$key.'"';
            echo '>'.$key.'</a> ';
            // notice the space at the end of the link
        }
    ?>
</div>
5
задан brian d foy 1 November 2009 в 15:13
поделиться

5 ответов

Randal Schwartz показывает лучший способ Наблюдение за долгими процессами через CGI .

Тем не менее, ложь о типе контента не поможет. Следующий скрипт делает именно то, что вы, кажется, хотите, чтобы он делал в Windows XP с Apache 2.2 (в том смысле, что для появления последней строки вывода требуется десять секунд):

#!/usr/bin/perl

use strict;
use warnings;

use CGI qw(:cgi);

print header('text/plain');

$| = 1;

print "Job started\n";

for ( 1 .. 10 ) {
    print "$_\n";
    sleep 1;
}

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

5
ответ дан 18 December 2019 в 14:48
поделиться

Предполагая, что вы используете версию Apache новее 1.3, это должно сработать. в противном случае вам придется преобразовать ваш скрипт в CGI NPH (без анализируемых заголовков), то есть его имя файла должно иметь префикс nph- , и он должен выводить полные заголовки HTTP, например

HTTP/1.1 200 OK\n
Content-type: text/html\n\n

см. (несколько устаревший) Часто задаваемые вопросы об Apache для получения дополнительной информации

2
ответ дан 18 December 2019 в 14:48
поделиться

To see if your script is working, try using a command line tool to avoid any confusion with your browser. curl, for example, will output as soon as it receives data.

If what you are doing is for an important purpose, I wouldn't use your current approach, though. If the script takes a long time to run, fork it off into the background (info here) and update a file or database with progress. You can then use an auto-refreshing (JavaScript or META-REFRESH) iFrame to display the progress. You could also use AJAX, but that is a bit more involved.

2
ответ дан 18 December 2019 в 14:48
поделиться

Делает ли он то, что вы ожидаете, когда вы устанавливаете тип содержимого как text / plain? Возможно, синтаксический анализ HTML в вашем браузере вызывает задержку вывода, поскольку вы фактически не выводите действительный HTML? (без тегов или )

0
ответ дан 18 December 2019 в 14:48
поделиться

То, что вы хотите достичь, возможно - браузеры обычно отображают то, что было получено до сих пор, даже если это не полный документ, при условии, что имеется достаточная разметка, чтобы иметь возможность отображать что-либо вообще. Однако мне интересно, почему вы используете \ r \ n для некоторых выходных данных и только \ n для других - вы должны быть последовательны и использовать \ n во всем . Кроме того, вы указываете тип содержимого text / html, но не предоставляете никаких заголовков html ( ) перед вашим содержимым.

Однако «современный» способ сделать это - немедленно вернуть вывод страницы, но оставить часть, которую вы хотите обновить позже, как пустой элемент

.
4
ответ дан 18 December 2019 в 14:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: