2010-08-08 45 views
20

Câu hỏi đặt ra loại nói lên tất cả - là có một chức năng mà không giống như các Javascript chức năng setTimeout() cho PHP? Tôi đã tìm kiếm php.net và tôi không thể tìm thấy bất kỳ ...Có một chức năng tương tự như setTimeout() (JavaScript) cho PHP không?

+0

@KennyTM - Tại sao nó quan trọng ...? – Alexander

+1

@TheLife để mọi người có thể tìm ra giải pháp thực tế cho vấn đề của OP? :) –

Trả lời

8

Không có cách nào trì hoãn việc thực thi một phần mã trong tập lệnh hiện tại. Nó sẽ không có ý nghĩa nhiều, hoặc, như là việc xử lý một kịch bản PHP diễn ra hoàn toàn trên phía máy chủ và bạn sẽ chỉ trì hoãn việc thực hiện tổng thể của kịch bản. Có sleep() nhưng điều đó sẽ chỉ đơn giản là tạm dừng quá trình trong một thời gian nhất định.

Bạn có thể, tất nhiên, lập lịch một tập lệnh PHP để chạy tại một thời điểm cụ thể bằng cách sử dụng các công việc cron và tương tự.

+0

Có một chút khó giải thích - điều tôi muốn chính xác là tạm dừng tập lệnh :) Về cơ bản, điều tôi muốn làm là "đùa" một trong những người bạn của tôi. Tôi đã thực hiện một đầu vào mà bạn gõ vào tên của bạn và khi bạn gửi một phòng chat được mô phỏng và để làm cho nó thực tế hơn tôi muốn các tin nhắn từ người lạ, bạn của tôi là "nói chuyện với", để xuất hiện từng người một nếu bạn biết ý của tôi là gì :) – Latze

+6

Sự kiện theo thời gian không có ý nghĩa bởi vì tập lệnh chạy ở phía máy chủ? Tôi không đi theo lý lẽ. Chắc chắn chúng ít hữu ích hơn trong PHP do không có sự đồng thời, nhưng có giá trị trong việc có một kịch bản thực hiện điều gì đó sau một khoảng thời gian cụ thể hoặc vào một thời điểm nhất định. – Artefacto

+2

@Latze nghe có vẻ giống như điều bạn muốn làm khi sử dụng JavaScript ở phía máy khách, phải không? –

9

Có chức năng sleep, tạm dừng tập lệnh trong một khoảng thời gian xác định.

Xem thêm usleep, time_nanosleeptime_sleep_until.

+0

nó sẽ vẫn là tốt đẹp để mô phỏng loại mã trong php: http://hastebin.com/rujakezuco.lisp. giấc ngủ đang chặn, thời gian chờ không được. – Dmitry

10

PHP không phải là sự kiện điều khiển, do đó, một setTimeout không có ý nghĩa nhiều. Bạn chắc chắn có thể bắt chước nó và trên thực tế, ai đó đã viết một số Timer class mà bạn có thể sử dụng. Nhưng tôi sẽ cẩn thận trước khi bạn bắt đầu lập trình theo cách này ở phía máy chủ trong PHP.

+1

Nhưng php có các công cụ để làm cho kịch bản cụ thể của bạn được điều khiển sự kiện. ví dụ như chạy php thông qua giao diện điều khiển, bạn có thể muốn lên lịch nhiều sự kiện tại các thời điểm khác nhau, tại thời điểm này nó làm cho cảm giác hoàn hảo để có thời gian chờ. – Dmitry

2

Trừ khi bạn đang sử dụng AJAX để có yêu cầu live, PHP sẽ không phải là ngôn ngữ ưu tiên cho vấn đề này. Tập lệnh PHP không hang và chờ phản hồi khác. Chúng không liên tục. Javascript sẽ được yêu cầu.

Ngay cả đối với trò đùa, một hàm AJAX javascript được ghép nối với tập lệnh PHP để phân tích cú pháp đầu vào và phản hồi tương ứng sẽ chính xác những gì bạn cần. Bạn thậm chí có thể ghép nối điều này với hàm sleep trong php để làm cho nó thực tế hơn. Hơn nữa, tôi sẽ chuẩn bị một loạt các câu lệnh khác nhau cho máy chủ để phân tích cú pháp, bạn có thể đi xa đến mức cần thiết cho thời gian cần thiết cho mỗi câu lệnh là sleep. Ví dụ:

MYSQL DATABASE VÍ DỤ:

| ID | SLEEP | STATEMENT             | 
| 1 | 3 | Hello              | 
| 2 | 10 | I have been alright, nothing new.       | 
| 3 | 20 | This is a really long message that takes 20 seconds to type | 

Vì vậy, bạn có thể phân tích nó như sau:

$query = mysql_query("SELECT * FROM `responses` WHERE `id`='3'"); 
$array = mysql_fetch_array($query); 
sleep((int)$array['sleep']); //convert sleep time to integer, sleep. 
die($array['statement']);  //print the statement back to AJAX function 
1

nếu bạn cần phải thực hiện một hành động sau khi bạn thực hiện một số mã php bạn có thể làm điều đó với một tiếng vang

echo "Success.... <script>setTimeout(function(){alert('Hello')}, 3000);</script>"; 

vì vậy sau một thời gian trong ứng dụng (trình duyệt) bạn có thể làm điều gì đó khác, như chuyển hướng đến một tập lệnh php khác ví dụ hoặc echo một cảnh báo

1

http://php.net/manual/en/class.evtimer.php có lẽ là những gì bạn đang tìm kiếm, bạn có thể có chức năng được gọi trong khoảng thời gian định sẵn, tương tự như setInterval trong javascript. nó là một phần mở rộng pecl, nếu bạn có whm/cpanel bạn có thể dễ dàng cài đặt nó thông qua trang cài đặt phần mềm/mở rộng pecl.

tôi đã không nhận thấy câu hỏi này là từ năm 2010 và lớp evtimer bắt đầu được mã hóa trong 2012-2013.để cập nhật cho một câu hỏi cũ, bây giờ có một lớp có thể làm điều này tương tự như javascripts settimeout/setinterval.

6

Một vài điều tôi muốn lưu ý về giờ trong PHP:

1) Timers trong PHP có ý nghĩa khi được sử dụng trong tập lệnh chạy lâu (daemon và, có lẽ, trong kịch bản CLI). Vì vậy, nếu bạn không phát triển loại ứng dụng đó, thì bạn không cần bộ hẹn giờ.

2) Bộ hẹn giờ có thể chặn và không chặn. Nếu bạn đang sử dụng sleep() thì đó là bộ hẹn giờ chặn vì tập lệnh của bạn chỉ bị treo trong một khoảng thời gian nhất định. Đối với nhiều tác vụ chặn bộ hẹn giờ là tốt. Ví dụ, gửi số liệu thống kê cứ 10 giây một lần. Đó là ok để chặn các kịch bản:

while (true) { 
    sendStat(); 
    sleep(10); 
} 

3) giờ Non-blocking có ý nghĩa duy nhất trong các ứng dụng điều khiển sự kiện, như WebSocket-server. Trong các ứng dụng như vậy, sự kiện có thể xảy ra bất kỳ lúc nào (ví dụ: kết nối đến), vì vậy bạn không được chặn ứng dụng của mình với sleep() (hiển nhiên). Vì mục đích này, có các thư viện vòng lặp sự kiện, như reactphp/event-loop, cho phép bạn xử lý nhiều luồng theo kiểu không bị chặn và cũng có tính năng hẹn giờ/khoảng thời gian.

4) Thời gian chờ không chặn trong PHP là có thể. Có thể thực hiện bằng chức năng stream_select() với tham số thời gian chờ (xem cách nó được triển khai trong reactphp/event-loop StreamSelectLoop::run()).

5) Có phần mở rộng PHP như libevent, libev, event cho phép thực hiện tính giờ (nếu bạn muốn đi hardcore)

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