2010-03-04 32 views
12

Tôi có hai lý do để sử dụng chức năng ngủ: đầu tiên, để tự động gửi email xác nhận tới khách hàng 20 phút sau khi họ liên hệ với chúng tôi. Tôi không muốn sử dụng công việc cron vì tôi muốn chính xác 20 phút (và tôi bị bệnh của máy chủ web gửi email cho tôi biết rằng họ đã bắt đầu một công việc cron ..... một email mới sau mỗi 20 phút!)Chức năng ngủ sử dụng tài nguyên máy chủ?

Lý do thứ hai: Tôi đã nghe nói về những người gửi email hàng loạt bằng chức năng ngủ. Vì máy chủ của tôi sẽ chỉ cho phép 100 email một giờ, tôi muốn sử dụng chức năng ngủ để có tập lệnh ngủ trong một giờ sau đó tiếp tục tại nơi nó được chọn.

Câu hỏi của tôi là: nó có sử dụng tài nguyên máy chủ không? Nó sẽ làm chậm mọi thứ xuống? Có vấn đề gì khác khi sử dụng chức năng ngủ không? Cảm ơn trước!

Trả lời

13

Trong khi quá trình sleep nhập nó sẽ không tiêu tốn thời gian CPU, nhưng quá trình 'bộ làm việc vẫn yêu cầu bộ nhớ vật lý và/hoặc pagefile để hỗ trợ quá trình đó. Nói cách khác, quá trình thông dịch PHP cần phải tiếp tục chạy. Vì vậy, miễn là máy chủ của bạn có đủ RAM này không phải là một vấn đề mặc dù.

+0

Vì vậy, nếu dịch vụ lưu trữ của tôi có uy tín (ví dụ: godaddy), tôi có thể sẽ không phải lo lắng về các vấn đề về RAM không? Cảm ơn bạn đã giúp đỡ! – Dustin

+9

Bạn không nên sử dụng chức năng ngủ trong tập lệnh PHP serverside của mình. Bạn đang lãng phí một luồng máy chủ web trong khi đang ngủ. Ngoài ra, nếu bạn ngủ quá lâu, máy chủ sẽ giết quá trình của bạn khi bị kẹt hoặc trình duyệt của người dùng sẽ hết thời gian chờ đợi và bỏ cuộc. Cách thích hợp để làm điều đó, hoặc là với cronjob hoặc với quy trình độc lập. – Vlad

+4

Bạn cũng sẽ tự mở rộng cho một cuộc tấn công DoS tầm thường. Một số kẻ giật có thể đăng ký một vài trăm tài khoản trong suốt một phút, và chủ đề apache ngủ sẽ ăn hết tất cả bộ nhớ của bạn. –

8

Thời gian gửi email khá khác nhau, vì vậy bạn sẽ không nhận được email đến hộp thư đến của ai đó trong vòng 20 phút, bất kể bạn làm gì.

Tôi sử dụng tập lệnh nền dài chạy - được khởi chạy từ CLI, thay vì apache - để xử lý việc gửi email. Ứng dụng của tôi đưa các email vào một bảng xếp hàng, mà kịch bản mailer thăm dò mỗi 15 giây. Nó nằm giữa các cuộc thăm dò ý kiến. Bằng cách này, tôi chỉ có một kịch bản cố gắng kết nối với máy chủ SMTP và ngủ.

Phần đó của ứng dụng đã chạy thành công mà không có vấn đề lớn nào trong 2 năm qua. Sự phiền toái duy nhất là giữ cho tập lệnh chạy - nếu nó không hoạt động vì bất kỳ lý do nào, thư sẽ không xuất hiện cho đến khi bạn đưa nó trở lại. Nhưng trường hợp xấu nhất, bạn chỉ có thể khởi động lại nó qua cron định kỳ, ví dụ: hằng ngày.

Nếu tôi giải quyết được sự cố của bạn, tôi chỉ cần đặt cột "Thời gian gửi" trên bảng xếp hàng và cập nhật 20 phút cho các email này. Người gửi bưu điện sau đó sẽ SELECT * FROM mail_queue WHERE send_time <= NOW()

Cách khác, bạn có thể sử dụng một jobqueue thực như beanstalkd. Tôi đã chọn bảng xếp hàng chỉ để giữ cho ứng dụng của tôi ngăn xếp đơn giản.

-1
sleep(); 

Có, chế độ ngủ sử dụng tài nguyên máy chủ.

Có, nó làm chậm mọi thứ xuống theo thời gian bạn đặt trong chế độ ngủ (...).

Có bất kỳ vấn đề nào khác khi sử dụng "ngủ".

ai đó trong this page nói

Ghi ngủ đó() có nghĩa là "Hãy PHP thời gian để làm một số công cụ khác". Điều đó có nghĩa là sleep() có thể bị gián đoạn bởi tín hiệu. Điều đó rất quan trọng nếu bạn làm việc với pcntl_signal() và bạn bè.

-1

Thay vì máy chủ SLEEP, tức làsleep(3);

tôi đã sử dụng "client-side" ngủ sử dụng Javascript:

if (empty($_COOKIE['my_Timer'])) {die('<script>window.setTimeout(\'window.location="'.$_SERVER['REQUEST_URI'].'"; \',3000);</script>');} 
setcookie('my_Timer', "blabla", time()+999999, '/'); 
0

biết đó là một chủ đề rất cũ nhưng một số người có thể đi qua, vì vậy đây là một gợi ý.

này sẽ chỉ hoạt động nếu:

  • Bạn đang trên máy chủ Linux
  • Bạn có thể chạy lệnh (như exec, một số chia sẻ lưu trữ sẽ không cho phép điều đó)

Thay vì ngủ trong một thời gian dài, mà tôi nghĩ rằng đó là một thực tế xấu (đối với kịch bản này), bạn có thể xem xét các at lệnh cho việc này.

Trong khi công việc cron là lý tưởng cho các công cụ lặp đi lặp lại nếu bạn chỉ muốn chạy lệnh một lần tại một thời điểm nhất định trong tương lai, at là người bạn tốt nhất của bạn.

Đây là cách tôi lên lịch gửi email trong khoảng thời gian X sau khi người dùng tương tác với trang web.

Ví dụ:

$wait_time=time()+mt_rand(3600,36000); 
//wait a random amount of time between 1 and 10 hours 
//$wait_time=time()+1200 -if you want 20 minutes exactly. 
$cmd_string=escapeshellcmd('php /path/to/script.php '.$par1.' '.$par2.' "'.$par3.'" '.$parX); 
exec("echo -e '$cmd_string' | at ".date("Hi M d",$wait_time)); 

Thần bạn tạo một script.php mà xử lý tất cả các thông số thông qua và làm bất cứ điều gì bạn muốn làm.

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