2010-03-07 17 views
5

Tôi có một trang web hoạt động với PHP ở phía máy chủ.PHP: ignore_user_abort (true) trong tất cả các tập lệnh

trang Người dùng truy cập và PHP hiện một số tính toán, ghi dữ liệu vào một cơ sở dữ liệu MySQL, vv

Hãy tưởng tượng một người dùng truy cập một trang nơi PHP tạo một tài khoản cho người dùng. Việc tạo ra bao gồm hai phần: chèn dữ liệu đăng ký vào bảng "người dùng" và chèn cài đặt cho tài khoản này vào bảng "cài đặt". Đây là hai truy vấn SQL mà phải được thực hiện cái khác. Nếu người dùng thoát khỏi trang sau truy vấn đầu tiên, sẽ không có bất kỳ giá trị nào được chèn vào "cài đặt".

Làm cách nào để tránh sự cố này? Tôi nghĩ đơn giản bằng cách sử dụng ignore_user_abort (true), phải không?

Vì vậy, không hữu ích khi gọi ignore_user_abort (đúng) trên đầu mỗi tập lệnh PHP? Tôi không biết bất kỳ trường hợp nào mà nó sẽ gây ra vấn đề.

Trả lời

8

Ví dụ cụ thể của bạn, sử dụng các giao dịch cơ sở dữ liệu (như được đề cập bởi Ignacio) sẽ là cách tiếp cận phù hợp hơn.

Có những trường hợp khác mà bạn có thể muốn đảm bảo rằng người dùng không thể hủy bỏ sớm, tuy nhiên, không liên quan đến cơ sở dữ liệu. Ví dụ: nếu bạn cập nhật cơ sở dữ liệu và sau đó gửi thư, bạn không muốn người dùng có thể dừng quá trình này trước khi thư bị xóa. Trong trường hợp này, ignore_user_abort sẽ phù hợp.

Tuy nhiên, lưu ý rằng một đường ống bị hỏng do khách hàng hủy kết nối không ngừng thực hiện ngay lập tức, chỉ vào thời điểm bạn tiếp theo cố gắng ghi vào đầu ra tập lệnh. Điều này có thể thông qua việc gọi số echo hoặc print hoặc thậm chí chỉ bằng cách đóng thẻ PHP và chèn khoảng trắng trước khi mở một thẻ mới (... ?> <?php ...). Vì vậy, nếu bạn có tất cả phần 'hành động' của tập lệnh ở đầu trang, trước khi bạn cố gắng viết bất kỳ nội dung trang nào, bạn không phải lo lắng về việc gián đoạn từ các đường ống bị hỏng ảnh hưởng đến logic ứng dụng của bạn.

Và tất nhiên, bạn nên tách logic hành động khỏi nội dung trang theo cách đó.

2

Nếu bạn cần nhiều truy vấn xảy ra hoàn toàn hoặc không hoàn toàn, thì bạn nên thực hiện đúng cách bằng cách sử dụng giao dịch thay vì đặt băng trên sự cố.

Có thể thuận tiện cho phía từ xa để hủy yêu cầu nếu ví dụ: yêu cầu liên quan đến tính toán kéo dài và người dùng quyết định rằng họ không cần kết quả sau khi tất cả.

1

Bạn có thể đặt ignore_user_abort trong php.ini: PHP.ini configuration

tôi sẽ không làm điều này, mặc dù. Tôi muốn có trang PHP bắt đầu một cá thể PHP khác trên dòng lệnh thực hiện truy vấn trong nền, ví dụ: sử dụng exec.

Ngoài ra, có thể khái niệm luồng cơ bản của bạn bị lệch. Nếu người dùng hủy bỏ việc thực hiện một phép tính, có lẽ bạn nên cuộn nó lại đúng cách - nhưng điều đó phụ thuộc vào bản chất của những gì đang được thực hiện.