2013-09-26 2 views
1

Я использую RESTful API с использованием скриптов Apache и cgi, а производительность критически важна. Мне нужно перенести данные в скрипт cgi наиболее эффективным способом. Это означает наименьшее количество временных файлов или буферизацию ОЗУ. В идеале я бы пошел из IP-пакетов в буфер 1 МБ RAM один раз, а затем в пункт назначения. Поиск в Интернете и в этом блоге очень мало информации об эффективности трансферов.оптимизация загрузки файлов cgi

Mod_perl часто упоминается, и я понимаю эффективность там, поскольку интерпретатор perl оптимизирован в Apache. Но где вы можете получить подробную информацию о буферизации для запросов POST к скрипту cgi?

Вот конкретный вопрос, который у меня есть: если я использую curl для POST формы, которая просто загружает файл, то cgi-скрипт не получает никаких данных из STDIN. Я получаю данные из файла просто отлично, но это не через STDIN, а через url_param. Я знаю, что я выполняю POST, потому что $ ENV имеет это как POST. Так почему я не вижу данные STDIN?

Второй вопрос: может ли кто-нибудь узнать о выполнении различных типов переноса?

+0

У меня нет точных ответов. Но использование сценариев CGI AD 2013 для обеспечения критического RESTFul API не кажется практичным. Когда вы предпочитаете Perl, вы можете использовать некоторую микроструктуру, например [Dancer] (https://metacpan.org/module/Dancer) или [Mojolicious] (https://metacpan.org/module/Mojolicious), там уже сделано много работы, чтобы получить услуги RESTful. Если вам по-прежнему нужна помощь в скриптах CGI, вы можете поделиться некоторым примером кода для работы. –

+0

Я смотрел на Mojolicious, и я продолжу держать это в уме. Я был обеспокоен принятием всей структуры. Я также работаю в безопасной среде, и получить одобрение для пакетов perl проще, чем целая структура. Легче скрыть вещи в рамках. Я работал над этим, поэтому я разместил код. – tradetree

ответ

1

Для эффективности вы можете использовать Apache2 :: Upload. Он тесно связан с apache mod_perl и использует C libs (xs) для ускорения работы.

Это не тестируется, а что-то вроде этого:

use Apache2::Upload; 
open(my $out_fh,'>',outfile) or die $!; 
binmode($out_fh); 

my $req = Apache2::Request->new($r); 
my $upload = $req->upload("foo"); 
my $bb = $upload->bb(); 
my $contents = '';my $length = '2048';my $offset = 0; 
while ($bb->READ($contents, $length, $offset)){ 
    $offset += $length+1; 
} 
print $out_fh $contents; 
+0

Это очень полезно, поскольку я не знал об этом модуле. У меня есть одна версия, работающая с CGI.pm, но как только я получу это твердое, я попробую этот модуль и посмотрю, какая из них лучше работает. – tradetree

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