总结:
Móc trước bộ điều khiển có được thực thi trong quá trình lưu vào bộ nhớ đệm không? Có bất kỳ điểm móc nào có thể được thực thi không? (Trước hệ thống?)
Tôi cần nhấn mạnh một điều là Hook không ảnh hưởng tới nội dung gửi tới trình duyệt. Đây không phải là một vấn đề.
Phiên bản chi tiết:
Tôi đang dự định triển khai một số chức năng loại thống kê trong dự án tôi đang xây dựng bằng PHP và CodeIgniter.
Dự án được đề cập là một CMS được xây dựng tùy chỉnh - do khoảng thời gian giữa các lần cập nhật kéo dàiTôi sử dụng bộ nhớ đệm để giúp tăng tốc thời gian tải, điều này không bắt buộc nhưng được ưu tiên hơn.. Đây dường như là một giải pháp tốt cho hầu hết các trang web tĩnh; đặc biệt khi nội dung động chủ yếu được phục vụ ở phía máy khách - tức là các yêu cầu AJAX.
Chức năng được đề xuất chủ yếu liên quan đến mộtMóc điều khiển trước , truy cập các phương thức thông qua một thư viện (chẳng hạn như thư viện tác nhân người dùng) trước khi đưa chúng vào cơ sở dữ liệu. Từ đây, bạn có thể thăm dò ý kiến, xuất thông qua JSON và hành động dựa trên nó trước khi được hiển thị bởi một thứ gì đó giống như plugin jQuery flot.
Tôi đã đọc về Bộ nhớ đệm trang web tài liệu và tài liệu về hook .Thật không may, vẫn chưa rõ liệu việc sử dụng bộ nhớ đệm có hoàn toàn vượt qua được hook hay không.
Tôi biết bộ nhớ cache_override
Nhưng điều này có nghĩa là phải triển khai cơ chế lưu vào bộ nhớ đệm của riêng bạn; đây không phải là điều tôi muốn làm!
Một cách tiếp cận khác là thu thập số liệu thống kê về phía máy khách và gửi chúng đến máy chủ thông qua AJAX nhưng điều này cũng không lý tưởng vì tôi đang cố gắng phân tách rõ ràng logic vì lý do bảo trì và thử nghiệm.
tóm lại:
- Móc trước bộ điều khiển có được thực thi trong quá trình lưu vào bộ nhớ đệm không? 没有.
- Có bất kỳ điểm móc nào có thể được thực thi không? Đúng
pre_system
thực hiện.
Nếu bộ đệm bắt đầu bằng system/core/CodeIgniter.php:189 , cái móc duy nhất có cơ hội chạy là pre_system
(hệ thống/lõi/CodeIgniter:124) .
Thật không may, tại thời điểm này bạn không nhận được nhiều tính năng của codeigniter, không có get_instance()
Và không có nó, hầu hết các thư viện cốt lõi sẽ không tải được. Nếu muốn bạn có thể xem hệ thống/lõi/Common.php
hàm được định nghĩa trong Đó là khá nhiều tất cả những gì bạn có.
Nếu bạn thực sự muốn sử dụng các lớp dựng sẵn để thực hiện công việc, bạn có thể làm việc với các đối tượng cơ sở dữ liệu và các nội dung cốt lõi khác như thế này:
- Bạn phải lấy thủ công
BASEPATH.'database/DB.php'
các tập tin ở định dạng . May mắn thay, trong lớp trình tải, nó tảiyêu cầu một lần
. Vì vậy, nó sẽ không làm hỏng trang do thiếu bộ nhớ đệm.
- Sau khi tải
Database
thư viện, gọiĐB()
Khởi tạo thông thường$this->db
sự vật. .Nếu không có tham số, nó sẽ tải cơ sở dữ liệu mặc định từ tệp cấu hình như bình thường.
- Tại thời điểm này bạn có thể
pre_system
Móc ghi các truy vấn và vì Móc có thể là đối tượng nên bạn có thể di chuyển từng mã ghi nhật ký vào đối tượng của Móc. Nếu bạn cần các thư viện khác, bạn có thể sử dụng tải_class()
Nhận phiên bản của họ. (nếu bạn không tải lớp dựng sẵn, đừng quên đặt lớp thứ ba tiền tố tham số được đặt thành một chuỗi trống).
Cuối cùng, bạn sẽ có kết quả như thế này (mã tưởng tượng):
lớp MyLoggingHook {
// được gọi từ cấu hình hook
chức năng công cộng chạy($params = array()) {
require_once(BASEPATH.'database/DB.php');
$db = DB(); // lấy một phiên bản DAO
// thông tin định tuyến luôn hữu ích cho nhật ký lượt xem trang
$RTR = Load_class('Bộ định tuyến', 'lõi');
$RTR->_set_routing();
// Bộ định tuyến cũng tải các lớp Uri và Config bên trong nên hai trường hợp sau cũng có thể thú vị:
// $RTR->uri
// $RTR->config
// tải một số thư viện hữu ích không liên quan đến CodeIgniter
$user_agent_Detector = Load_class('UserAgentDetector', 'thư viện', '');
// thực hiện một số thao tác ghi nhật ký
$db->insert('page_view_log', array('class' => $RTR->fetch_class(), 'method' => $RTR->fetch_method(), /*...*/);
}
}
Có lẽ tôi nên đề cập rằng tôi chưa bao giờ sử dụng bất cứ thứ gì như thế này trong sản xuất và có nguy cơ dựa vào chức năng có thể khác nhau tùy theo phiên bản. Nếu bạn có thể sử dụng nó mà không cần chạm vào lớp Codeigniter trong hook.
sử dụng PDOĐể truy cập cơ sở dữ liệu, hãy sử dụng get_config()
Đang tải cấu hình cơ sở dữ liệu, bạn có thể truy cập mà không cần chạm vào bất kỳ lớp nào liên quan đến codeigniter.
Tôi là một lập trình viên xuất sắc, rất giỏi!