2010-04-19 38 views
0

我有一個相當耗費資源的perl cgi腳本(需要大約2秒才能完成)。只要最多隻有4個或5個人在同一時間運行,這就沒有問題,通常情況就是這樣。如何強制mod_perl只允許每個連接一個進程?

問題是,當用戶單擊調用此腳本的鏈接時,會產生一個新的進程來處理該連接請求,因此如果用戶多次單擊(如果他們不耐煩),服務器會因運行的新進程和大部分都是多餘的。

如何確保每個主機只運行此過程的一個實例?

這是一個老系統,我維護它使用舊的框架的前端,我想避免使用JavaScript來禁用客戶端按鈕,如果可能的話。將它轉換爲fast-cgi perl也是不可能的,因爲這是一箇舊系統,並且將fast-cgi添加到apache可能會破壞很多其他事情。

回答

1

您想使用文件鎖定。閱讀FCNTL模塊上的文件和羊羣功能:http://perldoc.perl.org/functions/flock.html

編輯迴應評論:

#!/usr/bin/perl 

use strict; 
use warnings; 

use Fcntl qw(:flock); 

local *FH; 
my $opened_file = open(FH,'>/tmp/example_file.lck'); 
if ($opened_file) { 
    print "Lock file was opened successfully\n"; 
    if (flock(FH, &LOCK_EX | &LOCK_NB)) { 
     &do_stuff(); 
    } else { 
     print "Failed to get lock (another process is running)\n"; 
    } 
} else { 
    print "Failed to open lock file: $!\n"; 
} 
close(FH); 

sub do_stuff { 
    print "Locked!\n"; 
    sleep 30; # Pretending to be busy for a long time 
} 
+2

你是如何建議這樣做:

使用鎖文件的例子? – ysth 2010-04-19 00:39:19

+0

仍然沒有做到我想要的,但它確實回答了原來的問題,所以我會接受它 – 2010-04-25 06:32:17

相關問題