2012-06-29 23 views
6

Tôi bắt đầu sử dụng CakePHP (1.2) vài tháng trước để thêm các tính năng nhỏ vào ứng dụng của công ty và tôi không quá quen thuộc với nó.Công việc cúp CakePHP để gọi hành động của bộ điều khiển

Chúng tôi thử nghiệm cục bộ trên máy chủ phát triển trước khi hợp nhất với máy chủ sản xuất.

Tôi muốn một hành động điều khiển được gọi mỗi giờ với những gì tôi cho là cách tốt nhất để làm điều này thông qua các nghiên cứu của tôi, một công việc cron.


Cố gắng 1

Sau khi đọc những,

http://bakery.cakephp.org/articles/mathew_attlee/2006/12/05/calling-controller-actions-from-cron-and-the-command-line

http://book.cakephp.org/1.2/en/view/110/Creating-Shells-Tasks

tôi có thể thực hiện một cái gì đó mà không có lỗi, nhưng hành động không được thực thi.

Dựa trên những ví dụ, tôi đã thêm một file có tên cron_dispatcher.php trong thư mục ứng dụng của tôi (không phải app/webroot) và sau đó đã lệnh này từ dir ứng dụng

php cron_dispatcher.php/controller/action/param

Vẫn không có gì xảy ra nhưng nó hoạt động hoàn hảo khi tôi gọi nó thông qua url.


Cố gắng 2

tôi đã cố gắng tạo ra một vỏ (email.php) mà sẽ gọi hành động trong/app/nhà cung cấp/vỏ /.

<?php 

class EmailShell extends Shell { 

    public function main() { 
     $this->out('Test'); 
    } 

} 
?> 

này kết quả đầu ra thành công thử nghiệm trong giao diện điều khiển sử dụng email

bánh chính

nhưng sau đó tôi không thể tìm thấy làm thế nào để gọi hành động của bộ điều khiển. Tôi đã thử

$ this-> requestAction ('/ controller/action');

Tôi cũng đã cố thực hiện cuộc gọi từ một chức năng khác với hàm chính trong trình bao.

Tôi đã cố gắng để bao gồm bộ điều khiển trong $ sử dụng biến như tôi làm với một mô hình nhưng điều đó không làm việc (và nó không có ý nghĩa I think)

Tôi không nghĩ rằng việc tạo ra một nhiệm vụ là giải pháp hoặc là tôi không muốn lặp lại các chức năng sendEmails do đó tại sao tôi đang tìm kiếm một cách để chỉ cần gọi hành động của bộ điều khiển từ một vỏ hoặc bất cứ điều gì!

Có lẽ một số lý thuyết tôi đang mất tích, nhờ


Giải pháp

tôi chuyển một số phương pháp từ bộ điều khiển đến một mô hình và tôi đã có thể gọi cho họ từ một vỏ.

App::import('Component', 'Email'); 

class SendMemosShell extends Shell { 

    var $uses = array(
     'Memo', 
    ); 

    public function main() { 

    } 

    public function sendEmails() { 
     $this->Email =& new EmailComponent(null); 
     $memoList = $this->Memo->getMemos(); 
     //... 
    } 
} 

Liên kết này giúp http://book.cakephp.org/2.0/en/console-and-shells/cron-jobs.html


chỉnh sửa: làm rõ một số thông tin và bổ sung các giải pháp

Trả lời

3

Nó là một vấn đề khá phổ biến trên thực tế, chạy vào nó cũng có.

Bộ điều khiển đang quyết định cách xử lý yêu cầu và bắt đầu tác vụ đó. Trong trường hợp này, không cần một bộ điều khiển vì bạn có một nhiệm vụ trình bao, nhiệm vụ đã rõ ràng.

Biết rằng, không cần thiết phải gọi phương thức điều khiển.

Vì vậy, hãy suy nghĩ lại các tùy chọn của bạn và có điều này là một tùy chọn khá khó khăn. Ví dụ bạn có thể quyết định gửi e-mail là một bước logic nghiệp vụ nên nó phải nằm trong mô hình. Một lựa chọn khác là tách nó hoàn toàn (đó là điều chúng tôi thích nhất).

Trong trường hợp đó, bạn sẽ phải tạo hàng đợi nơi bạn đặt tất cả các e-mail để gửi. Đó là một thiết kế tốt kể từ khi bạn biết số lượng logic trong bộ điều khiển đi xuống và nó được tách ra. Bằng cách đó bạn sẽ nhận được một dịch vụ e-mail.

Ví dụ: bạn có thể yêu cầu dịch vụ gửi thư "người dùng mới". Sau đó, bạn thêm đối tượng User vào nó và nó sẽ tự xử lý. Bằng cách đó bạn thậm chí có thể mở rộng kể từ khi dịch vụ của bạn có thể được ví dụ bên ngoài, bạn có thể mở rộng nhiều máy chủ trên dịch vụ vv

Edit:

câu hỏi tốt.

Các bước thực hiện:

  1. Tập trung các "gửi e-mail" quá trình đầu tiên. Vì vậy, chọn một vị trí để đặt nó. Bạn có thể quyết định: Thêm để gửi e-mail đến hàng đợi hoặc gọi trực tiếp dịch vụ. Ví dụ bạn có thể thêm nhiệm vụ shell để gửi e-mail.

  2. Gọi trình bao: Bây giờ bạn có vấn đề gọi trình bao. Nói chung bạn không muốn. Tại sao không? Bởi vì một shell (một nhiệm vụ) có thể chạy trong một thời gian dài. Vì vậy, đó là lý do tại sao chúng tôi sử dụng hàng đợi ở giữa. Vì vậy, bạn có thể yêu cầu hàng đợi hoặc để cho thông báo hàng đợi bạn rằng một cái gì đó được thực hiện. Ví dụ, suy nghĩ về một máy chủ mail mà là xuống. Bạn phải thử lại vv Điều đó không nên có trong một yêu cầu web bởi vì người dùng đang chờ phản hồi.

  3. Bước thứ ba là gọi trình bao từ cron của bạn, bây giờ thật dễ dàng vì bạn đã ở trên dòng lệnh để bạn có thể sử dụng các cuộc gọi chuẩn.

Nhưng dù sao, có các tùy chọn thực hiện cuộc gọi trực tiếp từ bộ điều khiển nhưng bạn không nên thực hiện.Bài viết này cung cấp cho một số hiểu biết rất thú vị: CakePHP: Run shell job from controller

Sửa 31/08/'13: Xem hệ thống các sự kiện của CakePHP cũng cho một số ví dụ: http://book.cakephp.org/2.0/en/core-libraries/events.html

+0

Tôi cũng cần có thể gọi hành động này theo cách thủ công (bằng cách nhấp vào nút trong chế độ xem chẳng hạn). Bạn có đề nghị tôi tạo một nhiệm vụ thay vì một hành động điều khiển và gọi thay thế này (tự động với một công việc cron và tự bấm vào)? Là một cái gì đó vỏ bạn gọi hoàn toàn tách ra từ logic hoặc bạn đã nói về hàng đợi? Đôi khi tôi cần phải gửi nhiều email cùng một lúc (khi nó được kiểm tra tự động) nhưng nó không nên xảy ra quá thường xuyên vì vậy tôi tự hỏi nếu hàng đợi là một chút quá phức tạp cho nhu cầu của tôi! Cảm ơn câu trả lời của bạn – Catherine

+0

Đã trả lời chúng, nói chung bạn nên nghĩ về kích thước của ứng dụng và thiết kế của ứng dụng. Cách tôi trả lời câu hỏi của bạn là một trong những cách nó nên được thực hiện. Không có nghĩa đó là cách tốt cho kinh doanh. Nếu bạn chỉ gửi thư đôi khi nó không phải là giá trị có thể để tạo ra một thiết lập đầy đủ và phức tạp hơn cho nó. –

+1

Xin chào một lần nữa, cảm ơn câu trả lời chi tiết của bạn. Chúng tôi đồng ý rằng không cần gửi email theo cách thủ công nên tôi đã tạo một trình bao gửi email. Nó cũng buộc tôi phải di chuyển nhiều phương pháp từ bộ điều khiển sang mô hình phù hợp hơn nếu tôi hiểu rõ. Sau đó tôi làm theo quy trình này để thiết lập công việc cron: http://book.cakephp.org/2.0/en/console-and-shells/cron-jobs.html Tôi quyết định không sử dụng hàng đợi mặc dù điều này có vẻ thú vị vì nó không đáng giá trong trường hợp này! – Catherine

0

Tùy thuộc vào những gì cần phải được thực hiện, tôi thường giữ những phương pháp trong hành động điều khiển của tôi. Ở đầu hành động, tôi kiểm tra $ _SERVER ['REMOTE_ADDR'] == $ _SERVER ['SERVER_ADDR'] để chỉ đảm bảo trang web có thể gọi hành động. Sau đó, trong cron tôi sẽ curl hoặc wget địa chỉ này.

Nó có những lợi ích - dễ dàng chạy cục bộ hơn trong quá trình phát triển (chỉ cần nhập url trong trình duyệt của bạn), cộng với một số khác biệt giữa phiên bản chạy php và phiên bản apache, cũng như biến yêu cầu (ví dụ: bánh không thể có được tên miền trang web/địa chỉ thông qua cli như bạn có thể chạy như mô-đun apache, do đó, liên kết tuyệt đối đến trang web bằng cách sử dụng trợ giúp html không hoạt động).

+0

Tôi đã cố gắng chỉ để wget địa chỉ và nó dường như không thực hiện hành động theo cách tôi muốn, tôi có thể đã làm nó sai. Đã không cố gắng để đặt nó trong crontab mặc dù, đoán tôi nên thử nghiệm nhiều hơn về điều đó trong tương lai. Cảm ơn và xin lỗi tôi không thể đánh giá bạn tôi vẫn còn mới vào trang web. – Catherine

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