Khi bạn muốn tạm dừng thực thi trong tập lệnh của mình, có hai cách để bạn triển khai mã. Một số người [rất may là rất ít] chọn tùy chọn đầu tiên và viết mã như thế này
time[]] {
// do nothing
}
echo "Done.\n";
?>
Trong khi nó hoạt động, có hai vấn đề với nó. Đầu tiên, time[] có độ chính xác rất thấp, chỉ trả về số giây đã trôi qua, điều này khiến cho toàn bộ điều này khá mơ hồ. Thứ hai, PHP phải ngồi đó lặp đi lặp lại hàng nghìn lần trong khi chờ đợi, về cơ bản không làm gì cả. Một giải pháp tốt hơn nhiều là sử dụng một trong hai chức năng ngủ tập lệnh, sleep[] và usleep[], lấy lượng thời gian để tạm dừng thực thi làm tham số duy nhất của chúng
Sự khác biệt giữa sleep[] và usleep[] là sleep[] lấy một số giây làm tham số, trong khi usleep[] lấy một số micro giây - một phần triệu giây - làm tham số. Sử dụng một trong số chúng chính xác hơn nhiều so với vòng lặp time[] trước đó và cả hai đều có ưu điểm của chúng - sleep[] sẽ tốt hơn nếu bạn không cần độ chính xác và usleep[] sẽ tốt hơn nếu bạn cần. Đơn giản, thực sự
Kịch bản trên có thể được viết lại như thế này
Hoặc cái này
Lưu ý rằng thời gian thực thi tập lệnh tối đa mặc định là 30 giây, nhưng bạn có thể sử dụng chế độ ngủ[] và usleep[] để làm cho tập lệnh của bạn tiếp tục lâu hơn thế vì về mặt kỹ thuật, PHP không có quyền kiểm soát trong quá trình vận hành ở chế độ ngủ
Bạn muốn học PHP 7?
Hacking with PHP đã được cập nhật đầy đủ cho PHP 7 và hiện có sẵn dưới dạng PDF có thể tải xuống. Nhận hơn 1200 trang học PHP thực hành ngay hôm nay
Nếu điều này hữu ích, vui lòng dành chút thời gian để nói với những người khác về Hacking với PHP bằng cách tweet về nó
Trong hướng dẫn này, chúng tôi sẽ chỉ cho bạn cách sử dụng hàm sleep hoặc usleep trong PHP để tạm dừng tập lệnh
Khi viết các tập lệnh PHP của bạn, có thể đôi khi bạn cảm thấy muốn tạm dừng/ngủ tập lệnh
Tạm dừng thực thi tập lệnh rất hữu ích trong các tình huống khác nhau. Một ví dụ về cách sử dụng là khi thực hiện một số lượng lớn các yêu cầu mạng, bạn có thể muốn ngủ tập lệnh PHP của mình để ngăn nó tràn vào mạng
Bạn cũng có thể sử dụng nó để ngăn tập lệnh tiêu thụ một lượng tài nguyên CPU bất thường. Sử dụng chức năng ngủ giữa các tác vụ có thể ngăn những tác vụ hoàn thành nhanh nhanh chóng áp đảo CPU
Hai cách chính mà bạn có thể ngủ tập lệnh trong PHP là sử dụng “sleep[]
” hoặc “usleep[]
“. Trong các phần sau, chúng tôi sẽ đề cập đến cả hai
Một lời giải thích nhanh giữa những điều này là chức năng “sleep[]
” hoạt động trong vài giây và “usleep[]
” hoạt động trong micro giây
Hàm PHP ngủ []
Sử dụng chức năng ngủ của PHP, có thể tạm dừng việc thực thi tập lệnh trong một số giây được chỉ định
Hàm chỉ nhận một tham số duy nhất có tên là “
0“, trong đó bạn đặt thời gian ngủ tính bằng giâyDưới đây bạn có thể xem định nghĩa cho hàm sleep[]
trong PHP. Bạn có thể thấy tham số của nó được lấy dưới dạng số nguyên và nó trả về một số nguyên
sleep[int $seconds]: int
Hàm sleep[] sẽ trả về 0 [
2] khi nó ngủ thành công. Tuy nhiên, nếu ngủ tập lệnh không thành công, nó sẽ trả về giá trị Boolean
3Vì hàm này có thể trả về
2 hoặc
3, hãy đảm bảo bạn sử dụng [
6] khi kiểm tra giá trị trả về. Mặt khác, kiểu tung hứng của PHP sẽ coi 0 và false là giống nhauXin lưu ý rằng giây không thể là một phần của giây. Nếu bạn cần một phần giây, hãy sử dụng hàm
7Ví dụ sử dụng hàm sleep[] trong PHP
Bây giờ chúng ta đã biết cú pháp của hàm sleep[], hãy viết một đoạn script PHP nhanh để bạn có thể thấy nó hoạt động như thế nào
Chúng tôi sẽ sử dụng hàm echo của PHP để in thời gian hiện tại cho ví dụ này. Chúng ta có thể truy xuất thời gian hiện tại nhờ hàm
8. Sử dụng tùy chọn “
9” sẽ nhận được giờ, phút và giây hiện tạiChúng tôi bắt đầu bằng cách in chuỗi “
Time before sleep: 10:17:54
Time after sleep: 10:17:59
0“, nối thời gian hiện tại và cuối cùng, ký tự dòng mới [Time before sleep: 10:17:54
Time after sleep: 10:17:59
1]Sau đó, chúng tôi sử dụng hàm sleep[]
của PHP để sử dụng, đặt tham số duy nhất của nó thành “
Time before sleep: 10:17:54
Time after sleep: 10:17:59
3” để ngủ tập lệnh trong 5 giâyCuối cùng, để cho bạn thấy tập lệnh đã ngủ, chúng tôi in văn bản “
Time before sleep: 10:17:54
Time after sleep: 10:17:59
4“, nối thời gian hiện tại
Sau khi chạy tập lệnh này, bạn sẽ thấy kết quả tương tự như những gì chúng tôi đã hiển thị bên dưới
Với sự khác biệt về thời gian, bạn có thể thấy chức năng ngủ đã tạm dừng việc thực thi tập lệnh như thế nào
Time before sleep: 10:17:54
Time after sleep: 10:17:59
Hàm usleep[] trong PHP
Nếu bạn cần tạm dừng việc thực thi tập lệnh PHP của mình trong thời gian ngắn hơn một giây, bạn sẽ cần sử dụng hàm usleep[]
Với chức năng này, bạn có thể chỉ định số micro giây mà bạn muốn tập lệnh ở chế độ ngủ. Một micro giây là một phần triệu giây
Ví dụ: nếu bạn muốn ngủ tập lệnh PHP của mình trong một phần tư giây [
Time before sleep: 10:17:54
Time after sleep: 10:17:59
5], bạn sẽ sử dụng giá trị Time before sleep: 10:17:54
Time after sleep: 10:17:59
6Dưới đây, bạn có thể xem định nghĩa cho hàm usleep[] trong PHP. Nó có một tham số duy nhất phải luôn là số nguyên và nó trả về một số nguyên
usleep[int $microseconds]:int
Giống như chức năng ngủ,
7 sẽ trả về
2 khi nó ngủ thành công. Tuy nhiên, nếu chức năng không chuyển sang chế độ ngủ trong suốt thời gian đó, nó sẽ trả về
3Xin lưu ý rằng việc sử dụng thời gian ngủ ngắn dài hơn “
usleep[int $microseconds]:int
0” [1 giây] có thể không được hệ thống máy chủ hỗ trợVí dụ về việc sử dụng hàm usleep[]
Đối với ví dụ này, chúng tôi sẽ sử dụng hàm usleep[] của PHP để ngủ tập lệnh của chúng tôi trong 250000 micro giây [một phần tư giây]
Chúng tôi sẽ cần sử dụng thời gian được cung cấp bởi chức năng “
usleep[int $microseconds]:int
1” để theo dõi điều này. Điều này cung cấp cho chúng tôi dấu thời gian Unix hiện tại tính bằng micro giâyBắt đầu tập lệnh bằng cách lấy thời gian vi mô hiện tại và lưu trữ nó trong biến “
usleep[int $microseconds]:int
2”Sau đó, chúng ta có thể sử dụng hàm usleep[]
, chuyển vào
Time before sleep: 10:17:54
Time after sleep: 10:17:59
6 để ngủ tập lệnh trong khoảng thời gian Time before sleep: 10:17:54
Time after sleep: 10:17:59
6 micro giâySau khi ngủ, chúng tôi nhận lại thời gian vi mô và lưu trữ nó trong biến “
usleep[int $microseconds]:int
6”Sau đó, chúng tôi tính toán tổng thời gian thực hiện bằng cách lấy thời gian kết thúc trừ đi thời gian bắt đầu và lưu trữ nó trong biến “
usleep[int $microseconds]:int
7”Cuối cùng, chúng tôi sử dụng hàm echo để xuất tập lệnh mất bao lâu để chạy. Điều này sẽ cho chúng tôi thấy tập lệnh của chúng tôi ngủ như thế nào trong khi thực thi
Dưới đây là một ví dụ về những gì PHP sẽ in sau khi chạy ví dụ trên
Bạn sẽ nhận thấy rằng thời gian trả về không chính xác là thời gian ngủ vì các chức năng không hoàn thành ngay lập tức
0.25010299682617
Phần kết luận
Xuyên suốt hướng dẫn này, chúng tôi đã chỉ cho bạn hai cách để bạn có thể tạm dừng việc thực thi tập lệnh PHP của mình
Hai chức năng chúng tôi khám phá trong hướng dẫn này là các chức năng sleep[]
của PHP, và usleep[]
. Cả hai đều có cách sử dụng cụ thể nhưng sẽ tạm dừng việc thực thi tập lệnh