Ví dụ: có một tập lệnh PHP rất đơn giản cập nhật một số bảng trên cơ sở dữ liệu, nhưng quá trình này mất một thời gian dài (có thể là 10 phút). Do đó, tôi muốn tập lệnh này tiếp tục xử lý ngay cả khi người dùng đã đóng trình duyệt, bởi vì đôi khi người dùng không đợi và họ đóng trình duyệt hoặc truy cập trang web khác.Các tập lệnh PHP có thể tiếp tục chạy ngay cả khi người dùng đã đóng trình duyệt không?
Trả lời
Để trả lời câu hỏi của bạn trực tiếp, xem ignore_user_abort
Nói rộng hơn, bạn có thể có một vấn đề kiến trúc ở đây.
Nếu nhiều người dùng có thể khởi tạo công cụ này, bạn sẽ muốn ứng dụng web thêm công việc vào một số loại hàng đợi và có một số quy trình nền nhai qua tất cả công việc.
Tập lệnh phía máy chủ sẽ tiếp tục hoạt động của ứng dụng bất kể khách hàng đang làm gì.
EDIT: Nhân tiện, bạn có chắc chắn muốn có các trang mất 10 phút để mở không? Tôi đề nghị bạn sử dụng một hàng đợi công việc (các mục của họ được thực hiện bởi cron trên cơ sở kịp thời) và chuyển hướng người dùng đến trang "ok, tôi đang ở trên đó".
... không hoàn toàn đúng: thông thường, có những nhân viên bảo vệ để "giết" các tập lệnh php chạy dài: chúng có dạng mục nhập crontab. – jldupont
Không phải lúc nào cũng đúng: http://php.net/manual/en/function.ignore-user-abort.php – timdev
@jldupont: Tôi không phải là anh chàng php, nhưng những đoạn mã này có liên quan gì đến khách hàng không? – shanyu
nếu tập lệnh hoàn toàn dựa trên máy chủ (không có phản hồi cho người dùng), việc này sẽ được thực hiện ngay cả khi khách hàng bị đóng.
Kiến trúc chung của PHP là khách hàng gửi yêu cầu đến tập lệnh cung cấp câu trả lời cho người dùng. nếu không có gì được trả lại cho người dùng thì tập lệnh sẽ vẫn thực thi ngay cả khi người dùng không ở phía bên kia nữa. Đơn giản hơn: chúng không có kết nối liên tục giữa máy chủ và máy khách trên tập lệnh thông thường.
Lưu ý luôn đúng: http://php.net/manual/en/function.ignore-user-abort.php – timdev
Bạn có thể làm cho tập lệnh PHP chạy 20 phút một lần bằng tệp crontab chứa thời gian và lệnh nào sẽ chạy trong trường hợp này, đó là tập lệnh php.
ngoài câu hỏi được yêu cầu ở đây ... – jldupont
Có. Máy chủ không biết liệu người dùng đã đóng trình duyệt hay chưa. Ít nhất nó không nhận ra điều đó ngay lập tức.
Không: máy chủ có thể (tùy thuộc vào cách được cấu hình) sẽ không cho phép tập lệnh php chạy trong 10 phút. Trên một lưu trữ chia sẻ giá rẻ tôi sẽ không dựa vào một kịch bản chạy lâu hơn một thời gian phản ứng hợp lý.
Nếu tác vụ mất 10 phút, không sử dụng trình duyệt để thực thi nó trực tiếp. Bạn có nhiều tùy chọn khác:
- Sử dụng cronjob để thực hiện tác vụ theo định kỳ.
- Có yêu cầu trình duyệt chèn một hàng mới vào một bảng cơ sở dữ liệu để thường xuyên cronjob có thể xử lý hàng mới và thực thi kịch bản PHP với lập luận thích hợp
- Có yêu cầu trình duyệt viết một tin nhắn hệ thống xếp hàng có số người đăng ký lắng nghe các sự kiện như vậy (sau đó thực hiện thực thi tập lệnh).
Mặc dù một số đề xuất này có thể quá mức cần thiết cho tình huống của bạn, phím, tính năng kết hợp là để loại bỏ yêu cầu trình duyệt khỏi thực thi công việc, để nó có thể được hoàn thành không đồng bộ.
Nếu bạn cần cửa sổ trình duyệt được cập nhật với tiến trình, bạn sẽ cần sử dụng yêu cầu AJAX được thực thi theo định kỳ để truy xuất trạng thái công việc.
+1 cho phiên bản trả lời thú vị và đẹp hơn nhiều. – timdev
Vì vậy, nếu tôi muốn bỏ yêu cầu trình duyệt từ việc thực hiện công việc, làm thế nào tôi có thể yêu cầu một tập lệnh php khác, trong khi yêu cầu hiện tại của người dùng tiếp tục bình thường. Vì vậy, khi người dùng yêu cầu bất kỳ url nào, yêu cầu này sẽ khởi chạy một tập lệnh khác (hoạt động độc lập với trình duyệt của người dùng và các yêu cầu khác). Và người dùng sẽ tiếp tục lướt trên trang web thông thường Tôi có thể làm như thế nào? –
Xem các dấu đầu dòng đó? Đó là tất cả các cách để làm điều này. Trong hầu hết các trường hợp, việc thiết lập một bảng cơ sở dữ liệu nhỏ chứa các đầu vào cho quá trình nền hoạt động tốt. Sau đó, bạn có thể khởi chạy một số tập lệnh PHP để thực hiện các công việc, hoặc thông qua cron, hoặc một số phương pháp khác. – timdev
Tập lệnh PHP sẽ tiếp tục chạy sau khi máy khách chấm dứt kết nối (không làm như vậy sẽ là một nguy cơ bảo mật), nhưng chỉ lên đến max_execution_time
(được đặt trong php.ini hoặc thông qua tập lệnh PHP, thường là 30 giây theo mặc định) ..
Ví dụ:
<?php
$fh = fopen("bluh.txt", 'w');
for($i=0; $i<20; $i++) {
echo $i."<br/>";
fwrite($fh,$i."\n");
sleep(1);
}
fclose($fh);
?>
Bắt đầu chạy trong trình duyệt của bạn và đóng trình duyệt trước khi nó hoàn thành. Bạn sẽ thấy rằng sau 20 giây tệp chứa tất cả các giá trị của $i
.
Thay đổi giới hạn trên của vòng lặp for thành 100 thay vì 20 và bạn sẽ thấy nó chỉ chạy từ 0 đến 29. Vì mã PHP max_execution_time
của tập lệnh hết thời gian chờ và chết.
- 1. Mã PHP để dừng tập lệnh chạy từ trình duyệt
- 2. Chạy một quy trình Java trong Windows ngay cả sau khi người dùng đăng xuất
- 3. Làm cách nào để tiếp tục chạy chương trình Unix trong nền ngay cả khi tôi đăng xuất?
- 4. Tiếp tục phiên trình duyệt trong JNLP
- 5. Chạy các tập lệnh PHP đồng thời
- 6. Tại sao không SESSION_EXPIRE_AT_BROWSER_CLOSE = True đăng nhập người dùng khi trình duyệt bị đóng?
- 7. Tự chạy tập lệnh php?
- 8. Vòng đời asp.net có tiếp tục nếu tôi đóng trình duyệt ở giữa quá trình xử lý không?
- 9. không thể thực thi các tập lệnh bash ngay cả khi root?
- 10. Lỗi quyền của tập lệnh, ngay cả khi CORS đã bật
- 11. Chủ đề tiếp tục chạy ngay cả sau khi ứng dụng đã được dừng lại ở Websphere
- 12. tạm dừng/tiếp tục tập lệnh python ở giữa
- 13. Trình duyệt tiếp tục ăn bộ nhớ với AJAX + setInterval
- 14. Sự kiện khi người dùng chuyển các tab trình duyệt
- 15. Có bất kỳ người dùng nào vô hiệu hóa JavaScript trong các trình duyệt di động như iphone, android không? ngay cả khi thiết bị có khả năng?
- 16. Có tương đương forever.js cho PHP để chạy tập lệnh của tôi liên tục không?
- 17. Làm cách nào để tìm hiểu, người dùng nào đang chạy tập lệnh php hiện tại?
- 18. Ứng dụng WinRT có thể tiếp tục chạy trong khi Tắt màn hình không?
- 19. Chạy ứng dụng dòng lệnh từ PHP với tư cách người dùng cụ thể
- 20. Chạy lệnh Drush từ tập lệnh PHP
- 21. Chạy tập lệnh python với tư cách người dùng khác
- 22. Tôi có thể sử dụng: di chuột để kích hoạt hoạt ảnh CSS3 (hoặc chuyển tiếp) tiếp tục chạy ngay cả khi chuột không còn lơ lửng
- 23. Làm thế nào để chạy tập lệnh PowerShell ngay cả khi Set-ExecutionPolicy bị cấm?
- 24. Làm thế nào để làm cho tập lệnh php chạy một tập lệnh php khác
- 25. Chạy các tập lệnh Python như PHP
- 26. Trình duyệt dừng/dừng tạm dừng thực thi tập lệnh?
- 27. Chạy tập lệnh php từ dòng lệnh có biến số
- 28. JavaScript có thể phát hiện xem trình duyệt của người dùng có hỗ trợ gzip không?
- 29. Trình gỡ lỗi không thể tiếp tục chạy quá trình. Không thể bắt đầu gỡ lỗi
- 30. Tiếp tục phát lại nhạc ngay cả khi thay đổi các trang
Vì vậy, nếu tôi muốn bỏ yêu cầu trình duyệt khỏi thực thi công việc, làm cách nào tôi có thể yêu cầu một tập lệnh php khác, trong khi yêu cầu hiện tại của người dùng tiếp tục bình thường. Vì vậy, khi người dùng yêu cầu bất kỳ url nào, yêu cầu này sẽ khởi chạy một tập lệnh khác (hoạt động độc lập với trình duyệt của người dùng và các yêu cầu khác). Và người dùng sẽ tiếp tục lướt trên trang web thông thường –
Câu hỏi hay! +1 –