2010-08-03 2 views
1

Этот вопрос связан с вопросом, который я задал ранее, см. here.Еще вопрос о сегментации Ответы AJAX

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

Клиент первым вызывает скрипт, который инициализирует процесс. На стороне сервера код startScript.cgi начинает генерировать данные, и в этом случае он группирует ответы в куски и записывает их в отдельные файлы, индексированные последовательно (chunk1.txt chunk2.txt и т. Д.). Сразу же после запуска процесса startScript.cgi клиентская сторона начинает второй запрос ajax, отправленный команде gatherOutput.cgi с параметром? Index = 0.

buildOutput.cgi видит запрос, а затем ищет «chunk». $ Index. '. Txt', а затем возвращает данные. Клиент выводит это на html, а затем начинает второй запрос ajax для gatherOutput.cgi с параметром? Index = 1 и т. Д. Это продолжается до тех пор, пока не будут отправлены все данные из startScript.cgi.

Если gatherOutput.cgi не может найти «кусок $ 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... 

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

Проблема заключается в том, что производительность страдает, а выход займет некоторое время, несмотря на то, что был давно создан. Я предполагаю, что это связано с тем, что доступ к жесткому диску очень медленный по сравнению с операциями ЦП в startScript.cgi, поэтому gatherOutput.cgi часто ожидает записи нового фрагмента, или клиент часто ждет, когда gatherOutput.cgi читает файлы и т. д. Хотя могут быть и другие проблемы.

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

К слову, startScript.cgi может быть вызван только один раз, он запускает большую задачу системы задач (с системными escape-файлами, такими как exec, system или backticks), которые продолжают работать и не могут быть сегментированы.

ответ

2

Ваш файл gatherOutput.cgi не должен попадать в цикл, когда файл не существует. Вместо этого верните статус в свой запрос AJAX, чтобы файл еще не существовал, а затем он ждет (используя setInterval или setTimeout) и повторите попытку через столько секунд.

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

+0

Хорошо, я реализую это и вижу, насколько это повышает производительность. Спасибо! Любые дальнейшие предложения по-прежнему ценятся. –

Смежные вопросы