2012-01-18 24 views
18

Tôi đang gọi một tập lệnh php qua ajax để thực hiện bảo trì cơ sở dữ liệu. Nếu người dùng đóng trang, truy cập lại hoặc nhấp vào một liên kết, tập lệnh php có được thực thi đầy đủ không? Có cách nào để làm điều đó?Điều gì sẽ xảy ra nếu người dùng thoát khỏi trình duyệt hoặc thay đổi trang trước khi yêu cầu AJAX vượt quá

Có lẽ nếu kịch bản php gọi là exec() phương pháp hoặc một cái gì đó tương tự, trong đó sẽ lần lượt gọi một kịch bản thông qua giao diện điều khiển như vậy:

$ php /var/www/httpdocs/maintenance.php 

?

Trả lời

13

Miễn là tác nhân người dùng (trình duyệt, v.v.) đã gửi đầy đủ yêu cầu, máy chủ có tất cả những gì cần và sẽ hoàn thành yêu cầu và cố gắng gửi trả lời.

Thực tế, kiểu hành vi "ping" này thường được sử dụng cho các quy trình giống như "nhịp tim" giúp giữ ấm dịch vụ hoặc thực hiện bảo trì định kỳ.

2

Khi yêu cầu web đưa nó vào máy chủ của bạn, điều đó thực sự không quan trọng nếu người dùng đóng trình duyệt của họ hoặc điều hướng đi. Máy chủ của bạn sẽ vẫn phản hồi, nhưng sẽ không có ai lắng nghe câu trả lời.

+0

có cách nào để tránh điều đó không? –

+0

@SushantBajracharya Bạn có thể sử dụng một biến được đặt thành "1" khi cuộc gọi được thực hiện và nếu người dùng cố chuyển hướng trong khi biến "1" thì họ nhận được thông báo cho biết họ không thể. Khi cuộc gọi được thực hiện, nó sẽ quay trở lại "0" và cho phép chuyển hướng. –

14

Đó là điều kiện chạy đua. PHP sẽ phát hiện tại một số điểm (thường là khi cố gắng để làm đầu ra) mà Apache đang la hét trong khuôn mặt của nó rằng người dùng từ xa đã đóng kết nối. Cho dù tất cả mọi thứ bạn muốn làm được thực hiện tại thời điểm đó phụ thuộc vào cách cấu trúc mã của bạn.

Nếu bạn muốn đảm bảo rằng tất cả các thao tác đã hoàn tất trước khi tập lệnh tự tắt, hãy sử dụng ignore_user_abort(TRUE), giúp PHP chạy sau khi ngắt kết nối. Nó vẫn phải tuân theo giới hạn max_execution_time của người dùng và không có gì, nhưng nó sẽ không tắt vì bạn đã ngắt kết nối.

+0

Vì vậy, một tập lệnh PHP có thể tạm dừng trước khi nó thực hiện xong nếu Apache phát hiện rằng kết nối từ xa đã đóng? –

+1

Hahaha, tôi đã tìm thấy chức năng đó ngay sau khi đăng bài, cố gắng hủy bỏ câu hỏi của tôi và tự trả lời, nhưng tôi chưa có đủ uy tín.Dưới đây là những gì tôi muốn viết, xin lỗi vì đã khiến mọi người mất thời gian khi tìm kiếm điều sai: ** Ok, vẫn không biết chính xác điều gì xảy ra với AJAX, nhưng tôi đã tìm cách ngăn chặn các tập lệnh PHP chấm dứt nếu người dùng ngắt đoạn mã php với hàm: ignore_user_abort() http://php.net/manual/en/function.ignore-user-abort.php Tôi nên thực hiện nghiên cứu của mình qua PHP ngay từ đầu thay vì AJAX, tôi tìm thấy nó ngay lập tức. ** – NaturalBornCamper

+0

Có thể, nhưng không phải. có các yếu tố khác trong trò chơi, nhưng về mặt lý thuyết, người dùng có thể (ví dụ) hoàn thành quy trình thanh toán thương mại điện tử bằng cách nhấn ESC sau khi khoảng không quảng cáo của cửa hàng được cập nhật nhưng trước khi thanh toán được xử lý. Yêu cầu ajax –

0

Khi cuộc gọi ajax được khởi động, người dùng có thể tự do làm bất cứ điều gì họ muốn. Nếu họ đóng trang, họ sẽ không nhận được phản hồi (nếu có) từ cuộc gọi ajax đã được thực hiện.

0

Nếu php bắt đầu thực hiện thì nó sẽ tiếp tục thực thi bất kể người dùng có đóng cửa sổ hoặc điều hướng khỏi trang hay không.

0

Tập lệnh php sẽ hoàn thành, bất kể trạng thái trình duyệt. Các php được phân tích cú pháp trên máy chủ, và điều đó không quan tâm về việc liệu khách hàng vẫn còn mở hay không.

0

Nếu yêu cầu HTTP được hoàn thành, thì có, tập lệnh PHP sẽ được thực hiện đầy đủ ngay cả khi máy tính của khách hàng bị đóng.

1

Thay đổi về cài đặt, máy chủ web, hệ điều hành, v.v.

Thông thường, yêu cầu sẽ được xử lý như bình thường và phản hồi sẽ không bao giờ được đọc. Đôi khi, ghi có thể bị lỗi trước đó và yêu cầu không thành công trong khi xử lý.

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