2013-09-26 157 views
1

我正在使用Apache和cgi腳本實現RESTful API,並且性能至關重要。我需要以最有效的方式將數據傳輸到cgi腳本。這意味着最少數量的臨時文件或RAM緩衝。理想情況下,我會從IP數據包進入1MB RAM緩衝區,然後到達目的地。搜索網絡和這個博客,關於轉移效率的信息很少。cgi文件上傳優化

Mod_perl經常被提及,我理解其中的效率,因爲perl解釋器已經在Apache中進行了優化。但是,哪裏可以獲得有關緩存POST請求到cgi腳本的詳細信息?

這裏是我有一個具體的問題:如果我使用curl POST的形式,只是一個文件上傳,那麼CGI腳本沒有從stdin中獲取任何數據。我從文件中獲取數據很好,但它不是通過STDIN,而是通過url_param。我知道我正在做POST,因爲$ ENV將它作爲POST。那麼爲什麼我沒有看到STDIN數據?

第二個問題是,如果任何人對不同傳輸類型的性能研究誰知道呢?

+0

我沒有確切的答案。但是,將AD 2013用於性能至關重要的RESTFul API似乎並不實際。如果您喜歡Perl中,你可以使用一些微架構,如[舞者](https://metacpan.org/module/Dancer)或[Mojolicious(https://metacpan.org/module/Mojolicious),有已經完成了很多工作,以獲得RESTful服務。如果你仍然需要CGI腳本的幫助,你可以分享一些示例代碼來處理。 –

+0

我沒看Mojolicious,我會繼續保持這一點。我擔心採用整個框架。我也在一個安全的環境中工作,並且比整個框架更容易獲得perl軟件包的批准。在框架中隱藏東西更容易。我已經進一步工作,所以我會發布一些代碼。 – tradetree

回答

1

對於效率芻議你可以使用的Apache2 ::上傳。它與Apache mod_perl緊密結合,並使用C庫(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