2012-04-19 21 views
5

Tôi đang gặp khó khăn trong việc thiết lập công việc Cron để chạy mỗi ngày một lần vào một thời điểm nhất định. Đây là những gì tôi có trong cấu hình mô-đun của tôi:Cron của Magento có thiếu sót về cơ bản không?

<crontab> 
    <jobs> 
     <sorting_flushcache> 
      <schedule><cron_expr>0 16 * * *</cron_expr></schedule> 
      <run><model>sorting/observer::flushProductCacheCron</model></run> 
     </sorting_flushcache> 
    </jobs> 
</crontab> 

Từ những gì tôi biết về công việc cron, mà nên chạy lúc 5 giờ chiều dựa trên múi giờ địa phương của tôi. Tuy nhiên, nó KHÔNG BAO GIỜ hoạt động. Thay vào đó, nếu tôi đặt cron_expr thành * 16 * * *, nó sẽ lên lịch mỗi phút cho toàn bộ giờ (như bạn mong đợi).

Tôi truy tìm thông qua mã và tôi nghĩ rằng tôi đã tìm thấy sự cố nhưng tôi không biết đủ về lịch biểu cron và cách thực hiện thực sự là vì vậy tôi hy vọng ai đó có thể giúp tôi hiểu điều gì sai và cách để công việc của tôi hoạt động.

Mage_Cron_Model_Schedule là bộ não của con thú. Khi đoạn mã cron.php được gọi bởi lịch biểu crontab của máy chủ, nó gửi đi một sự kiện mà lớp này bắt và thực hiện công việc của nó. Trong số những thứ khác nó kéo trong cấu hình và cố gắng lên lịch cho các công việc cron sắp tới. Bên trong public function trySchedule($time) nó gọi là matchCronExpression, chuyển cho nó phần biểu thức cron được đề cập cùng với giá trị của thời gian hiện tại tương ứng với phần biểu thức cron đó. Ví dụ: nó so sánh phần đầu tiên của cron_expr (số phút một phần) vào phút của dấu thời gian hiện tại. Vào cuối của matchCronExpression chức năng nó sẽ trả về một giá trị boolean như vậy:

return ($num>=$from) && ($num<=$to) && ($num%$mod===0); 

Trong trường hợp của tôi, tôi cron_expr0 16 * * *. Vì tôi không có bất kỳ phạm vi nào hoặc */5 loại nội dung cho phần của tôi phút, nó so sánh giá trị chính xác mà tôi đã đặt dựa trên giá trị chính xác của dấu thời gian hiện tại. Điều này có nghĩa là nó sẽ CHỈ trả về true nếu nó xảy ra để chạy kịch bản cron vào đúng phút mà công việc này nên được lên lịch.

Một lần nữa, tôi không phải là một chuyên gia cron nhưng điều này dường như không phù hợp với tôi. Làm thế nào, sau đó, là một trong những nghĩa vụ phải lên lịch một công việc để chạy một lần một ngày nếu bạn không thể dự đoán chính xác phút mà lịch trình cron sẽ chạy kịch bản? Tôi thực sự hy vọng tôi đang thiếu một cái gì đó ... bất cứ ai có thể giúp đỡ?

- CRON CONFIG INFO -

generate schedules every: 5 
schedule ahead for: 10 
missed if not run within: 20 
success history lifetime: 60 
failure history lifetime: 600 
+0

Múi giờ máy chủ, không phải múi giờ địa phương của bạn. – hakre

+0

Dù sao, đó không phải là vấn đề. Như tôi đã đề cập trong bài viết của tôi, nếu tôi thay đổi nó thành '* 16 * * *' nó hoạt động .... vì vậy nó không phải là ngữ nghĩa trong đó múi giờ tôi đã nói tôi dựa trên nó. Tôi chỉ đơn giản là không làm việc. – BrianVPS

+0

Có vẻ như bị hỏng. Nhưng những gì tôi đọc, chất lượng mã của magneto không tốt. có lẽ chỉ là một cái gì đó shitbacked với nhau để đẩy phát hành và làm cho nó trông sexy để được bán nhanh chóng. – hakre

Trả lời

3

Tôi có thể tìm thấy một "giải pháp" đối với vấn đề này, nhưng tôi không chắc chắn tác động có thể điều này có thể có. Hy vọng rằng một người khác có thể kêu vang để xác nhận hoặc cung cấp một câu trả lời tốt hơn.

tôi đã thay đổi Cron Config của tôi trong Magento như sau:

generate schedules every: 1 
schedule ahead for: 5 
missed if not run within: 20 
history cleanup every: 30 
success history lifetime: 60 
failure history lifetime: 600 

Điều này dường như đã làm các trick. Nó bây giờ tạo ra lịch trình mỗi phút để nó không bỏ lỡ cửa sổ để lên lịch cho sự kiện một lần một ngày của tôi.

Bất kỳ suy nghĩ nào về điều này? Tôi lo ngại rằng nó quá nhiều cho hệ thống để tạo ra cron lịch trình mỗi phút. Nó sẽ có thể xử lý nó, nhưng tôi sẽ phải làm thử nghiệm để xác nhận.

Bất kỳ ai khác có trải nghiệm tương tự? Bạn đã giải quyết nó như thế nào?

+0

Vâng, điều này có các mục để bắt đầu hiển thị trong bảng cron_schedule nhưng nó không chạy đúng mã của tôi. Phương thức trong mô hình của tôi được gọi là cron là ** flushProductCacheCron **. Sau khi nó chạy, tôi kiểm tra DB và nó đã cập nhật bảng của tôi để phản ánh rằng nó đã xử lý các mục cần xử lý nhưng nó không bao giờ thực sự xóa bộ đệm ẩn. Có những hạn chế trong những gì mã có thể được chạy bởi một công việc cron? Để kiểm tra, tôi thiết lập bộ điều khiển giao diện người dùng để gọi cùng một phương thức được gọi là cron. Khi tôi tải lên URL đó, nó hoạt động chính xác. Chỉ cron có vấn đề. Những gì đang xảy ra ở đây? – BrianVPS

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