Этот вопрос связан с вопросом, который я задавал ранее, см. здесь .
В качестве способа реализации сегментированных ответов AJAX я создал код, который делает это:
Клиент сначала вызывает скрипт, который инициализирует процесс. На стороне сервера код startScript.cgi начинает генерировать данные, и при этом он группирует ответы в порции и записывает их в отдельные файлы, проиндексированные последовательно (chunk1.txt, chunk2.txt и т. Д.). Сразу после того, как startScript.cgi запускает этот процесс, клиентская сторона начинает второй ajax-запрос, отправляемый на collectOutput.cgi, с параметром? Index = 0.
collectOutput.cgi видит запрос, затем просматривает 'chunk'. $ Index. '. Txt' и затем возвращает данные. Клиент выводит это в html, а затем начинает второй ajax-запрос к collectOutput.cgi с параметром? Index = 1 и т. Д. Это продолжается до тех пор, пока не будут сообщены все данные из startScript.cgi.
Если collectOutput.cgi не может найти «chunk $ index.txt», он входит в этот цикл:
until(-e "$directory/chunk$index.txt")
{
#nothing
}
open $fh, "<$directory/chunk$index.txt" || warn "File not found. blah blah";
#Read file and print, etc...
Обратите внимание, что startScript.cgi запускает код, выполнение которого может занять много времени, поэтому необходимо одновременно передавать более старый вывод из файла startScript.cgi, поскольку он генерирует новый вывод.
Проблема в этом заключается в том, что производительность страдает, и вывод может занять некоторое время, несмотря на то, что он был создан давно. Я предполагаю, что это происходит из-за очень медленного доступа к жесткому диску по сравнению с операциями с процессором в startScript.cgi, так что collectOutput.cgi часто ожидает записи нового чанка, или клиент часто ожидает чтения collectOutput.cgi файлы и т. д. Хотя могут быть и другие проблемы.
Есть ли у кого-нибудь идеи или предложения по решению этой проблемы? Или, если у кого-то есть другой подход к этой проблеме, это было бы здорово.
Кстати, startScript.cgi может быть вызван только один раз, он запускает системную задачу большой задачи (с такими системными выходами, как exec, system или backticks), которая продолжает выполняться и не может быть сегментирована.