2010-02-05 35 views
6

Tôi hiện có index.php khá phức tạp và tôi chỉ muốn chạy nó một lần mỗi giờ. cách tốt nhất để đạt được điều này là gì? Một số ý tưởng tôi đã cóCách tốt nhất để thực hiện bộ nhớ đệm đầu ra phía máy chủ trong PHP là gì?

  • Đặt nó trong APC với apc_store($page, 60*60*) - Tôi cảm thấy đây không phải là những gì APC là cho và có lẽ sẽ được làm điều gì xấu để các phần khác của trang web của tôi
  • Lưu sản lượng để một hệ thống tập tin ở đâu đó - Sau đó, apache cần quyền truy cập ghi ở đâu đó có thể là một nỗi đau
  • Bằng cách nào đó thiết lập apache để làm bộ nhớ đệm cho tôi - Điều này có thể?
+1

Tôi đã nhìn thấy APC được sử dụng chính xác cho điều đó, tôi không nghĩ rằng nó xấu. – Piskvor

Trả lời

1

Tôi đã thay đổi một chút về câu trả lời của Rowlf và jamietelin.

Tạo 3 tệp:

chỉ mục.html

<meta http-equiv="refresh" content="0;url=/index_update.php" /> 

index.php

<?php // do all your normal stuff ?> 

index_update.php

<?php 

$file = "index.html"; 
$time = 60 * 10 - (time() - filemtime($file)); 

# this is on the first install 
if (filemtime($file) != filectime($file)) 
    $time = 0; 

if ($time > 0) { 
    die("Data was already updated in the 10 minutes. Please wait another " . ($time) . " seconds."); 
} 

ob_start(); 
require "index.php"; 
$data = ob_get_contents(); 

$fp = fopen($file, "w"); 
fwrite($fp, $data); 
fclose($fp); 

header("Location: /"); 

Và sau đó một cronjob:

*/15 * * * * curl http://example.com/index_update.php 

Vì vậy, nếu ai đó tình cờ xuất hiện trên trang sau khi đẩy sản xuất, họ sẽ chỉ minh bạch tạo index.html mới cho bạn, nếu không, cronjob của bạn sẽ thực hiện mỗi 15 phút một lần.

Chỉ cần đảm bảo index.html có thể ghi bởi máy chủ apache của bạn. Nếu điều đó nghe có vẻ đáng sợ, thì chỉ cần chạy cronjob của bạn php index_update.php là một người dùng khác có ghi quyền riêng tư cho index.html. Bạn sẽ không có quyền truy cập vào tất cả các môi trường apache mặc dù.

Hy vọng điều này sẽ giúp, nhận xét được hoan nghênh.

0

Bạn thực sự cần có một cái nhìn tại Memcached (hỗ trợ tuyệt vời php.)

Một lựa chọn tốt là để thiết lập một Squid Cache Server.

+0

cả hai đều cần thêm một phụ thuộc. Đối với trường hợp sử dụng này, tôi không biết nếu đó là bảo hành ... –

1

Việc cung cấp các trang tĩnh luôn là cách tối ưu nhất. Vì vậy, hãy sử dụng Cron ví dụ, hoặc bất kỳ dịch vụ lịch biểu nào khác mà bạn chọn, để tạo ra một phiên bản tĩnh của chỉ mục của bạn một lần mỗi giờ và ghi nó vào một tệp, ví dụ index.html. Bạn thậm chí có thể tạo ra nó dưới dạng .php nếu bạn vẫn cần một số phần động trên chỉ mục.

Tôi có thể nói đây là cách tốt nhất tuyệt đối. Tất nhiên đó là một số cơn đau nhỏ để xử lý các thiết lập chmod cho tập tin, nhưng nó không phải là lớn của một vấn đề.

0

Lưu trang vào tệp tĩnh và sử dụng các quy tắc .htaccess để phân phối trang tĩnh.

Tôi không chắc chắn về các chi tiết chính xác, nhưng tôi nghĩ rằng người viết mã và tăng cường cho drupal làm điều này.

3
  1. Khi khách truy cập truy cập trang của bạn, tạo nội dung, gửi nội dung đến người dùng và lưu tệp tĩnh ở đâu đó trên đĩa.
  2. Khi khách truy cập tiếp theo đến, trước tiên hãy tìm tệp đã lưu và nếu tệp tồn tại, hãy phân phát thay vì thực thi tất cả mã trong tệp index.php của bạn. Một ví dụ cơ bản sẽ là

    if (file_exists($cacheFileName)) 
    { 
        require $cacheFileName; 
        exit; 
    } 
    
    // here goes the rest of your index.php code 
    //.. 
    
    // assuming your output is buffered and is contained in $output: 
    echo $output; 
    
    $cacheFileName = '/path/to/your/file.inc'; 
    file_put_contents($cacheFileName, $output); 
    
  3. Thiết lập một công việc định kỳ sẽ xóa tập tin bộ nhớ cache đã lưu của bạn từ đĩa mỗi giờ hoặc thường xuyên như bạn cần tới. Ngoài ra, trong index.php của bạn, trên mỗi trang hit kiểm tra bao lâu trước khi các tập tin được lưu trữ được tạo ra và tạo ra một tập tin bộ nhớ cache mới nếu nó được khoảng lâu hơn bạn muốn nó. Một công việc cron là dễ dàng hơn để thiết lập mặc dù.

Để trả lời câu hỏi triết học sâu, hãy lưu đầu ra được tạo ra vào đĩa trong các tệp riêng biệt có lẽ là cách tốt nhất nếu bạn không muốn dựa vào giải pháp bộ nhớ đệm của bên thứ ba. APC là tốt cho bộ nhớ đệm mã sẽ tái tạo trang khi cần thiết, và memcached chắc chắn là overkill nếu chúng ta đang nói về một ứng dụng nhỏ (ish).

+0

Cảm ơn bạn. Tại sao lưu trữ trên đĩa tốt hơn APC? –

+0

Tôi sẽ không nói cái nào tốt hơn cái kia, tôi sẽ sử dụng chúng cho các mục đích khác nhau. APC tốt khi bạn có một ứng dụng phức tạp và bạn cần: 1) tăng tốc độ PHP; 2) bộ nhớ cache một số giá trị người dùng đắt tiền để tạo. Chẳng hạn như, tôi không biết, danh sách tất cả các tệp có sẵn trên hệ thống cho hàm __autoload() hoặc bất kỳ biến nào khác chiếm các tài nguyên quan trọng để xây dựng và không phải do người dùng cụ thể, do đó bạn có thể lưu trữ nó một cách an toàn. Tôi sẽ không chuck tạo ra đầu ra trang trong APC, nó không phải là những gì nó cho. – Rowlf

+0

Cảm ơn bạn. Nhược điểm chính xác của việc đưa nó vào APC là gì? Tôi không phải fiddle với quyền truy cập tập tin và sẽ không có bất cứ điều gì lộn xộn lên đĩa của tôi (chỉ trong bộ nhớ lưu trữ). –

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