2009-03-27 36 views
5

Tôi đang phát triển một số tập lệnh CGI và tôi đang cố gắng tìm giải pháp để giảm "thời gian bắt đầu" được tạo khi tôi nhập nhiều mô-đun với "sử dụng".Làm cách nào để giảm thời gian khởi động kịch bản Perl CGI?

Cập nhật:

Các giải pháp được cung cấp là tốt đẹp, nhưng kịch bản tôi đang chạy cả trong giao diện điều khiển và chế độ CGI kiểm tra nếu một số biến môi trường HTTP tiêu biểu có mặt làm việc.

Trong "chế độ điều khiển", chúng kết xuất dữ liệu "bình thường" và trong "chế độ html", chúng thực hiện một số thay thế thời gian thực và gửi các tiêu đề HTTP khác cho ứng dụng khách.

Tôi muốn cải thiện thời gian khởi động trong cả hai trường hợp.

+0

bạn có đang tạo quy trình mới cho từng yêu cầu không? –

+0

có, nhưng đó không phải chính xác vấn đề chính của tôi, vì một số script chạy cả trong giao diện điều khiển và chế độ CGI ^^ – mndg

Trả lời

9
  • Hãy chắc chắn rằng điều này thực sự là nút cổ chai của bạn
  • Chỉ module nhập khẩu bạn cần
  • Hãy chắc chắn rằng bạn không cần phải tìm kiếm một nơi zillion để tìm thấy chúng
  • Xem xét việc trình với khởi động tốn kém chạy nóng (ví dụ như một daemon) và sử dụng các script CGI trọng lượng nhẹ hơn để bắt đầu chúng
  • Nhìn vào các máy gia tốc khác nhau hơn là thực hiện CGI đầy đủ từ một vỏ (phụ thuộc vào những gì bạn đang sử dụng để phục vụ các trang).
10

Làm thế nào để sử dụng mod_perl để chạy tập lệnh của bạn?

12

Cân nhắc sử dụng CGI::Fast để bắt đầu một quy trình perl để xử lý nhiều yêu cầu. Nó đã cho tôi rất ít nỗ lực để thay đổi một số kịch bản CGI lớn của tôi sang CGI :: Fast. Không giống như mod_perl, rất dễ chạy CGI :: Nhanh trên các trang lưu trữ vì bạn có thể khởi động lại tập lệnh của mình mà không cần khởi động lại Apache (ít nhất đó là điều mà con hoster của tôi đã nói với tôi khi tôi yêu cầu mod_perl).

+2

+1 # cũng tốt để lưu ý, FCGI không phải là máy chủ thực hiện ràng buộc, làm cho nó ồ ạt hơn nhiều di động. –

+0

Âm thanh đẹp và nếu các tập lệnh chạy trong chế độ bảng điều khiển? thêm mẹo? thx :) – mndg

+0

Có thể khởi động lại chương trình của bạn mà không cần khởi động lại mod_perl. Nhưng FastCGI thì đơn giản hơn. –

4

Bạn luôn có thể thử các less pragma:

use less 'starttime'; 

Tất nhiên, đó là hệ thống phụ thuộc *. Đặt cược tốt nhất của bạn là sử dụng mod_perl hoặc một trong các mô-đun FastCGI: CGI::Fast, FCGI, etc.

Nếu cần nhanh chóng từ dòng lệnh, bạn có thể chuyển sang cấu trúc máy khách/máy chủ (tất cả là FastCGI).

* cảnh báo không có hệ thống nào hiện đang triển khai tùy chọn thời gian bắt đầu cho ít pragma hơn.

+0

wops, có vẻ như không phải là rất xách tay ^^ – mndg

2

Vâng, những người khác đã đề xuất rằng CGI có thể là vấn đề của bạn ở đây, vì vậy tôi sẽ xem xét rằng bạn không thể xóa CGI khỏi ảnh.

Bạn có thể muốn xem xét this old article. Rõ ràng một nguồn thời gian khởi động chậm là một @INC rất lớn để củng cố mọi thứ trong một PERL5LIB ngắn dường như giúp đỡ rất nhiều (đó có vẻ là một giả định công bằng, nhưng tôi chưa bao giờ thử nó).

Ngoài ra (hoặc bổ sung), nếu bạn không nhớ trả một số giá tại thời gian chạy, bạn có thể sử dụng Class::Autouse

Thưởng thức!

1

Hãy thử sử dụng SpeedyCGI hoặc Perl liên tục.

Cả hai thực hiện gần như cùng một ý tưởng: Thay vì trình thông dịch Perl, trình bao bọc phân tích chương trình và giữ nó trong bộ nhớ, do đó tiết kiệm thời gian cần thiết để khởi tạo trình thông dịch và phân tích cú pháp trên mọi lần chạy.

Điều này sẽ hoạt động tốt với thiết lập môi trường kép mà bạn mô tả trong trường hợp này có thể xảy ra/có thể không xảy ra khi sử dụng CGI :: Fast hoặc mod_perl.

EDIT Nếu điều này giúp, được. Nếu không, bạn sẽ phải đo nơi tập lệnh của bạn dành thời gian chạy.

Các vấn đề liên quan