2011-01-12 29 views
8

Tôi đã tạo một bảng cơ sở dữ liệu Email-Queue. Tôi sẽ chèn tất cả các email mà ứng dụng PHP của tôi cần gửi vào bảng này.Làm thế nào để chạy Cronjobs thường xuyên hơn một lần mỗi phút?

Một tập lệnh PHP khác sau đó sẽ tìm tất cả email chưa gửi và gửi chúng.

Tôi chạy tập lệnh này bằng cronjobs. Thật không may, cronjobs chỉ có thể chạy tối đa một lần mỗi phút. Vì vậy, trong trường hợp xấu nhất, người dùng phải chờ một phút cho đến khi Email của anh ấy thực sự được gửi đi.

Ý tưởng hiện tại của tôi cho giải pháp thay thế là gọi tập lệnh với tham số ngủ bổ sung và nhân đôi cronjob.

Ví dụ:

* * * * * curl emails.php?sleep=0 >/dev/null 2>&1 
* * * * * curl emails.php?sleep=10 >/dev/null 2>&1 
* * * * * curl emails.php?sleep=20 >/dev/null 2>&1 
* * * * * curl emails.php?sleep=30 >/dev/null 2>&1 
* * * * * curl emails.php?sleep=40 >/dev/null 2>&1 
* * * * * curl emails.php?sleep=50 >/dev/null 2>&1 

Trong ví dụ trên kịch bản sẽ chạy mỗi 10 giây. Dòng đầu tiên của tập lệnh email.php sẽ là:

sleep($_REQUEST['sleep']); 
+1

Có thể có nhiều người hiểu biết hơn về superuser.stackexchange.com. – EboMike

+1

bạn muốn có một daemon php, không phải là một script cron. –

Trả lời

9

Để bắt đầu, tôi khuyên bạn nên sử dụng phiên bản dòng lệnh của PHP thay vì sử dụng lệnh curl để gọi tập lệnh. Sau đó bạn có thể tạo một kịch bản PHP với một vòng đời hợp lý không bị ràng buộc bởi phải xuất ra một phản hồi trong một khoảng thời gian nhất định.

Như vậy, bạn có thể chỉ cần ngủ/kiểm tra email/truyền/ngủ, v.v. trong tập lệnh PHP thay vì sử dụng cron một cách không cần thiết. Ngoài ra, tôi sẽ cẩn thận để đảm bảo rằng nhiều tập lệnh PHP không hoạt động trên bảng cơ sở dữ liệu cùng một lúc, bằng cách sử dụng một tệp pid hoặc phương pháp thiết lập cơ sở dữ liệu (nếu một tệp/cài đặt đã tồn tại/là thiết lập, hủy bỏ quá trình xử lý) hoặc bằng cách định thời gian công việc cron một cách hợp lý và hạn chế thời gian xử lý tối đa của tập lệnh bằng cách kiểm tra xem nó đã chạy bao lâu trước khi bắt đầu phần "kiểm tra email" của chu kỳ.

8

Việc này phải được thực hiện ở cấp tập lệnh.

// cron.php running every 10 seconds 
// you need to setup this cron run every minute using `crontab` of cPanel etc 
<?php 

$expireTime = time() + 60; 
while (time() < $expireTime) { 
    // my php logic here 

    sleep(10); 
    // sleep for 10 seconds 
    // you may change the sleep time to change frequency 
} 
1

Nếu bạn thực hiện việc này sau mỗi 10 giây, cron không phải là công cụ phù hợp cho công việc. Những gì bạn cần là một kịch bản chạy liên tục như được hiển thị bởi Ish.

Bạn có thể đăng ký tập lệnh dưới dạng dịch vụ bằng cách đặt tập lệnh khởi động/dừng theo /etc/init.d và bật nó.

Hoặc nếu bạn chỉ có tài khoản người dùng, bạn có thể chạy nó trong phiên màn hình. Sau đó, bạn thậm chí có thể xem đầu ra để chẩn đoán lỗi.

14

Đây là một tập lệnh bash đơn giản mà tôi đã viết có thể được sử dụng với crontab để chạy thường xuyên hơn 1 phút.

bạn có thể lưu nó như là ~/bin/runEvery.sh và sau đó trong crontab viết một cái gì đó như thế này để chạy otherScript.sh mỗi 5 giây:

*/1 * * * * ~/bin/runEvery.sh 5 otherScript.sh

Đây là kịch bản:

#!/bin/bash 

inputPeriod=$1 
runCommand=$2 
RUN_TIME=60 
error="no" 

if [ 'x'"$runCommand" != 'x' ] 
then 
    if [ 'x'$inputPeriod != 'x' ] 
    then 
     loops=$(($RUN_TIME/$inputPeriod)) 
     if [ $loops -eq 0 ] 
     then 
      loops=1 
     fi 

     for i in $(eval echo {1..$loops}) 
     do 
      $runCommand 
      sleep $inputPeriod 
     done 

    else 
     error="yes" 
    fi 
else 
    error="yes" 
fi 

if [ $error = "yes" ] 
then 
    echo "runEvery - runs a command every X seconds for a minute" 
    echo "Usage: runEvery.sh <# in seconds < 60> <command to run>" 
fi 
Các vấn đề liên quan