2012-09-02 23 views
5

Về cơ bản, tôi muốn gửi một tiêu đề X-Sendfile đến trình duyệt để gửi một tệp, nhưng tôi không muốn gọi điều này nếu X-Sendfile không có sẵn hoặc được cài đặt trên máy chủ. Làm thế nào tôi có thể kiểm tra này trong PHP ?? Hoặc nếu điều này là không thể kiểm tra trong PHP, hơn làm thế nào để kiểm tra xem nó được cài đặt PERIOD? Tôi muốn kiểm tra sự tồn tại của X-Sendfile trong PHP, vì nó sẽ dễ dàng hơn cho tôi, vì đây là một phần của gói sẽ chạy trên các trang web và máy chủ khác ... Có lẽ nếu tôi chỉ sử dụng nó với chức năng PHP header, nó sẽ trả về một cái gì đó nếu không được cài đặt?PHP - Cách tìm hiểu xem X-Sendfile có sẵn và cài đặt không?

Thanks guys :)

Trả lời

6

Apache Module mod_xsendfile quá trình các tiêu đề

Để kiểm tra xem các module Apache mod_xsendfile có sẵn và cài đặt trên máy chủ, bạn có thể sử dụng chức năng apache_get_modules().

Bạn không thể chỉ đặt tiêu đề và kiểm tra xem mô-đun có được cài đặt hay không.

+0

Lưu "cảm ơn" của bạn cho người khác. Tôi rất vui vì đã giúp bạn. – verisimilitude

+3

Đừng quên: các mô-đun có thể được nạp (được liệt kê trong apache_get_modules(), nhưng có thể không được On (nó thậm chí bị vô hiệu hóa theo mặc định) .Bạn không thể kiểm tra điều này với PHP – marcovtwout

1

Để có được một danh sách các module apache và xem nếu x-sendfile nằm trong danh sách bạn có thể sử dụng http://php.net/manual/en/function.apache-get-modules.php Nếu nó không được cài đặt, tiêu đề x-sendfile sẽ nhận được đến trình duyệt nếu nó được cài đặt, các mô-đun sẽ lọc ra tiêu đề.

0

Hãy thử điều này:

if (in_array('mod_xsendfile', apache_get_modules())) { 
     header("X-Sendfile: $file"); 
    } else { 
     error_log("Warning! mod-xsendfile is NOT INSTALLED - sending file the old fashion way....."); 
     header('Content-Length: ' . filesize($file)); 
     print file_get_contents($file); 
    } 
+0

tại sao bạn không chỉ sử dụng readfile trong " cách thời trang cũ "? –

+2

xsendfile sẽ thoát PHP và phát hành bộ nhớ, và cho phép apache để gửi tập tin bằng cách sử dụng DMA/phần cứng tăng tốc. Nếu bạn sử dụng readfile bạn đang đi qua các dữ liệu thông qua nhiều bộ đệm và nhân đôi nó trong bộ nhớ (PHP đọc tập tin vào bộ nhớ -> bộ đệm đầu ra php -> bộ đệm đầu ra apache -> bộ đệm mạng) tất cả được thực hiện trong bộ xử lý như trái ngược với sendfile (apache yêu cầu Harddrive tải tệp trực tiếp vào bộ nhớ bằng DMA, apache yêu cầu thẻ mạng gửi dữ liệu bằng cách đọc trực tiếp từ bộ nhớ, bộ vi xử lý là miễn phí để làm những việc khác thay vì bản sao bộ nhớ không cần thiết) – RobertMaysJr

+0

Tôi đã không tranh luận về giá trị của xsendfile, nhưng in trong "cách thời trang cũ". thậm chí echo nhanh hơn in và readfile thứ hai là nhanh hơn cả hai, đặc biệt là nếu bạn phải file_get_contents một cái gì đó trước khi lặp lại nó. –

0

Đây không phải là chính xác. Nếu XSendFile không được đặt thành Bật cho vị trí có liên quan nhưng mô-đun được tải, nó sẽ giả định sai, rằng việc sử dụng xsendfile có sẵn, mặc dù không.

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