2013-05-29 47 views
11

Tôi hiện đang làm việc trên một hệ thống CRM với một cơ sở dữ liệu khổng lồ. Nếu người dùng muốn tìm kiếm khách hàng, họ có thể sử dụng tìm kiếm ajax. Mỗi khi anh ta thay đổi một cái gì đó trong lĩnh vực tìm kiếm, trong khi một cuộc gọi đang chờ, cuộc gọi cũ sẽ bị hủy và một cuộc gọi mới sẽ được gửi đến máy chủ. Vấn đề của tôi là, các tiến trình php ở phía máy chủ tiếp tục chạy. Vì vậy, nếu người dùng bắt đầu nhập địa chỉ, một số yêu cầu được bắt đầu và bị hủy và máy chủ cần nhiều thời gian hơn để trả lời.Làm thế nào để hủy bỏ một quá trình PHP, khi cuộc gọi ajax bị hủy?

Có thể hủy quá trình chạy php khi cuộc gọi ajax bị hủy không? Hoặc có giải pháp khả thi ở phía máy chủ hay không, để phát hiện xem yêu cầu tìm kiếm từ cùng một người dùng có đang chạy và hủy yêu cầu đó trước khi bắt đầu một phiên bản mới không?

Cảm ơn trước vì câu trả lời của bạn.

+1

bạn có thể giới hạn số ký tự cần phải đầy trong hộp tìm kiếm hoặc khi đến hộp tìm kiếm và các loại bạn tìm kiếm ở đó bằng jQuery ajax. – Rafee

+1

Bạn nên bắt đầu tìm kiếm nếu người dùng chỉ truy cập nút "Tìm kiếm" hoặc lượt truy cập nhập khóa. –

+3

Nếu mất nhiều thời gian để thực hiện tra cứu tìm kiếm của bạn, quá trình này sẽ làm chậm máy chủ khi chạy nhiều lần, bạn cần phải tối ưu hóa các thói quen tìm kiếm của mình, thay vì cố gắng giết các tiến trình đang chạy. Đặt một khóa trên cột tìm kiếm và nó sẽ mất phân số của một giây để lấy kết quả – Anigel

Trả lời

3

Bạn đang tìm kiếm ignore_user_abort()?

http://www.php.net/manual/en/function.ignore-user-abort.php

+0

đọc ghi chú: PHP sẽ không phát hiện ra rằng người dùng đã hủy kết nối cho đến khi một nỗ lực được thực hiện để gửi thông tin cho khách hàng. Và cài đặt mặc định đã sai. – Marek

0

Có một giải pháp mà tôi đã tìm ra ngay bây giờ.

Bạn có thể đặt một boolean isPending khi yêu cầu ajax là gửi cho bạn có thể thiết lập giá trị này để true

Sau callback ajax được gọi (thành công hay lỗi), bạn có thể thiết lập isPending false;

Hơn nữa, bạn có thể có biến chuỗi searchContent và cập nhật biến này khi văn bản được thay đổi. Vì vậy, khi cuộc gọi Ajax không được chờ và searchContent có nội dung bạn có thể gửi một cuộc gọi ajax khác.

Tùy chọn tốt nhất là sử dụng giải pháp đã viết ví dụ: http://jqueryui.com/autocomplete/ nó rất dễ dàng và hoạt động rất tốt thậm chí nó đã được xây dựng trong hệ thống bộ nhớ đệm.

+0

Điều này sẽ không giải quyết được vấn đề của tôi vì nó cũng gửi nhiều yêu cầu đến máy chủ. Vì vậy, nó hủy bỏ yêu cầu ajax, khi dữ liệu mới được đăng ký nhưng quá trình máy chủ tiếp tục chạy cho đến khi máy chủ được cấu hình không làm như vậy. –

3

php phía máy chủ của bạn phải xuất ra nội dung nào đó để phát hiện yêu cầu bị hủy. Nhưng khi bạn có khả năng thực hiện một truy vấn sql dài, bạn không thể xuất ra bất cứ thứ gì.

Nhưng bạn vẫn có thể tiết kiệm id kết nối của bạn vào một phiên, và tiêu diệt các kết nối nếu nó phát hiện:

  1. mở phiên
  2. kết nối mở sql
  3. Nếu search_connection_id được thiết lập trong phiên giao dịch, giết kết nối
  4. Tìm id kết nối của bạn, lưu trong phiên làm việc search_connection_id
  5. Đóng phiên - quan trọng, nếu không yêu cầu tiếp theo sẽ bị chặn ở bước 1
  6. cơ sở dữ liệu Query
  7. Nếu kết nối bị hỏng, đó là một tìm kiếm giết chết bạn trong bước 3, thoát
  8. Mở phiên giao dịch, loại bỏ search_connection_id
  9. Gửi câu trả lời, kết nối sql gần
1

Cảm ơn tất cả câu trả lời của bạn.

Tôi đã thiết kế lại các truy vấn tìm kiếm của mình như Anigel được đề xuất, với kết quả áp đảo.

Nhưng tôi nghĩ câu trả lời đúng cho câu hỏi của tôi là câu trả lời của Marek và Harikrishnan Viswanathar. Cả hai nên làm những gì tôi yêu cầu.

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