2009-07-25 36 views
7

Tôi muốn có thể cho phép người dùng xem đầu ra của tập lệnh GCI dài chạy khi được tạo ra thay vì sau khi tập lệnh hoàn tất. Tuy nhiên, ngay cả khi tôi xóa STDOUT một cách rõ ràng, máy chủ có vẻ như chờ cho tập lệnh hoàn tất trước khi gửi phản hồi cho máy khách. Đây là trên một máy chủ Linux chạy Apache 2.2.9.Làm cách nào để phân phối nội dung không bị chặn của CGI từ Apache 2?

Ví dụ python CGI:

#!/usr/bin/python 

import time 
import sys 


print "Content-type: text/plain" 
print 
for i in range(1, 10): 
     print i 
     sys.stdout.flush() 
     time.sleep(1) 

print "Done." 

ví dụ tương tự trong perl:

#!/usr/bin/perl 

print "Content-type: text/plain\n\n"; 

for ($i = 1; $i <= 10 ; $i++) { 
     print "$i\n"; 
     sleep(1); 
} 

print "Done."; 

Liên kết này nói như Apache đầu ra 1.3 CGI nên không có bộ đệm (nhưng điều này chỉ có thể áp dụng đối với Apache 1.x): http://httpd.apache.org/docs/1.3/misc/FAQ-F.html#nph-scripts

Bất kỳ ý tưởng nào?

+1

Bạn cũng có thể có khả năng được chạy vào client (trình duyệt) các vấn đề đệm -side. – Miles

Trả lời

4

Randal Schwartz của Watching long processes through CGI giải thích một (và IMHO, tốt hơn) cách khác nhau xem một quá trình chạy dài.

+0

Tôi đã kết thúc bằng cách sử dụng một phương pháp tương tự cho ứng dụng của mình nhưng tôi vẫn tò mò là tại sao phương thức gốc không hoạt động trong thiết lập của tôi. Oh well. –

1

Theo CGI::Push,

Apache web server từ phiên bản 1.3b2 trên không cần kịch bản đẩy từ máy chủ cài đặt như các kịch bản NPH: các -nph tham số để do_push() có thể được thiết lập để một giá trị sai để vô hiệu hóa các tiêu đề bổ sung cần thiết bởi tập lệnh NPH.

Bạn chỉ cần tìm tương đương do_push trong python.

Chỉnh sửa: Hãy xem CherryPy: Streaming the response body.

Khi bạn thiết lập mục config "response.stream" True (và sử dụng "năng suất") CherryPy quản lý cuộc nói chuyện giữa máy chủ HTTP và mã của bạn như thế này:

alt text http://www.cherrypy.org/attachment/wiki/ReturnVsYield/cpyield.gif?format=raw

1

Flushing STDOUT có thể giúp bạn. Ví dụ, chương trình Perl sau nên làm việc như mong đợi: Bài viết

#!/usr/bin/perl 

use strict; 
use warnings; 

local $| = 1; 

print "Content-type: text/plain\n\n"; 

for (my $i = 1 ; $i <= 10 ; $i++) { 
    print "$i\n"; 
    sleep(1); 
} 

print "Done."; 
2

Bạn phải đưa kịch bản đẩy bạn vào một thư mục đặc biệt Mà chứa .htaccess đặc biệt với environnment này thông số kỹ thuật:

Options +ExecCGI 
AddHandler cgi-script .cgi .sh .pl .py 
SetEnvIfNoCase Content-Type \ 
"^multipart/form-data;" "MODSEC_NOPOSTBUFFERING=Do not buffer file uploads" 
SetEnv no-gzip dont-vary 
+0

Upvote cho "setenv no-gzip". Cảm ơn bạn! –

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