2013-08-14 37 views
5

Tôi biết rằng tôi có thể hủy bỏ một tập lệnh bằng PHP bằng cách gọi thoát hoặc chết. Tuy nhiên, tôi không chỉ dừng việc thực hiện một kịch bản mà còn không gửi phản hồi tới các yêu cầu nhất định (dẫn đến thời gian chờ của phía máy khách).Không trả lời yêu cầu trong PHP

Nếu có ai có thể cho tôi biết cách thực hiện việc này, tôi thực sự sẽ đánh giá cao điều đó. Cảm ơn!

EDIT: Tôi xin lỗi vì tôi không thể cụ thể hơn về lý do tại sao tôi làm điều này, nhưng tôi không thể vì bản chất của dự án. Những gì tôi sẽ nói là tôi đang đối phó với một bot.

+2

Out of tò mò, tại sao bạn muốn làm điều này? –

+5

Bạn có thể thêm một chút giải thích tại sao bạn muốn làm điều này? Có thể có một giải pháp thẳng tiến hơn cho vấn đề của bạn. – Joe

+4

Kích hoạt thời gian chờ phía máy khách là khá tích cực: có gì sai với phản ứng 400 dòng đơn giản –

Trả lời

1

Thời gian chờ phía máy khách nghĩa là khi bạn thực hiện yêu cầu ajax nhưng máy chủ mất quá nhiều thời gian để phản hồi. Nếu bạn thực sự thực sự muốn thực hiện điều này, tôi đoán cách sẽ là đặt một câu lệnh sleep() lớn, sao cho trang ajax không trả lời và nó hết thời gian. Tuy nhiên, tôi không thể nhấn mạnh đủ làm thế nào đây không phải là cách để làm điều đó, trên thực tế nó mời một thảm họa trong tương lai.

Lý tưởng nhất là bạn nên gửi câu trả lời cụ thể cho khách hàng, ví dụ: trống hoặc "0" hoặc "NULL" và sau đó trong mã phía máy khách sẽ xử lý phản hồi đó là không phản hồi.

Nếu bạn không có quyền kiểm soát mã phía khách hàng ví dụ, một bot, tôi sẽ thứ hai bình luận Mark Baker và nói gửi 444 hoặc nếu bạn đang cảm thấy buồn cười, 418 trả lời :)

This post giải thích làm thế nào để gửi một Mã phản hồi HTTP sử dụng PHP.

+0

Tuyên bố về giấc ngủ có vẻ như nó sẽ đạt được những gì tôi muốn. Tuy nhiên, tôi đồng ý nó không phải là cách để đi vì nó có thể ăn các nguồn tài nguyên. Bạn trả lời bằng cách nào? Tôi không có quyền kiểm soát đối với khách hàng. – TheCatWhisperer

+0

Vâng, tất cả phụ thuộc vào cách mã phía máy khách sẽ diễn giải phản hồi của bạn. Ví dụ, bạn có thể làm một cái gì đó như 'echo 'NULL'; thoát, 'nhưng sau đó onus là trên máy khách để không giải thích các phản ứng không phải là chuỗi chữ mà là NULL. Cùng một cách, gửi 0 và thoát ra, một lần nữa onus là mã máy khách để giải thích 0 là đáp ứng trống. Vì vậy, bạn có thể phải đi sâu vào mã máy khách và xem họ có bất kỳ điều khoản nào để xử lý bất kỳ phản hồi nào không - không phải là phản hồi - thường là 0 hoặc sai hoặc NULL hoặc không có đầu ra nào được coi là không có phản hồi. – coderkane

+1

@Không Những gì bạn thực sự muốn là để máy chủ web thả kết nối nội bộ mà không gửi một gói tin thả đến máy khách. Nói cách khác, chỉ cần * không làm gì và bỏ qua khách hàng *. PHP không thể thực sự làm điều này vì máy chủ web * đã chấp nhận và đang giữ kết nối mở. Tôi không biết liệu có cách nào để thực hiện điều này (cũng phụ thuộc vào máy chủ web), nhưng Apache có thể bị thuyết phục để hành động phù hợp với các mod được cài đặt đúng. Trường hợp xấu nhất: viết mod của riêng bạn. Bạn cũng có thể làm điều này trực tiếp tại tường lửa. – deceze

2

Hết thời gian chờ của khách hàng? Có thể bạn muốn kết thúc phiên của người dùng để bạn có thể chỉ cần sử dụng session_destroy() trước khi bạn die hoặc exit tập lệnh của mình.

Cũng thật kỳ lạ thay vì chuyển hướng người dùng bằng thông báo, bạn sẽ kết thúc việc thực thi tập lệnh không thân thiện. Nếu bạn muốn, bạn có thể sử dụng header() để chuyển hướng người dùng đến một số trang có thể khiến anh ấy nhận được thông báo về những gì anh ấy đã làm hoặc lý do anh ấy bị ngăn chặn/chuyển hướng.

+0

Không thực sự là một người sử dụng cho mỗi nói; giống như một bot. Tôi không chắc nó có giữ cookie phiên hay không. – TheCatWhisperer

+1

Nhảy đến kết luận rằng đây là về phiên là một chút xa IMO lấy. – deceze

+0

@deceze Tôi có thể nhận được một số lời giải thích thân thiện không? :) –

-1

Vấn đề là khi PHP thực hiện, nó luôn tạo ra một phản hồi ... thậm chí echo '' sẽ được gửi trả lại.

Cách tốt nhất để làm điều này là để làm cho sự sụp đổ của kịch bản, tôi nghĩ ...

Chỉ cần làm một cái gì đó như: $pdo = new PDO('unexisting_server'); mà không có một khối try catch

+1

Xin lỗi, nhưng ... rất nhiều thất bại trong một câu trả lời! 'mysql_' không ném ngoại lệ, do đó không có' try..catch' sẽ hoạt động. Điều này cũng sẽ không * chậm trễ * phản ứng ở tất cả. Hầu hết tất cả, đừng làm cho kịch bản của bạn ** sụp đổ **. Tất cả những gì bạn cần là trả lại * phản hồi * mong muốn cho khách hàng. Điều này có thể được thực hiện một cách rõ ràng mà không làm hỏng tập lệnh của bạn. – deceze

+0

@deceze Có, bạn có đúng về 'mysql_connect' có thể, nhưng' new PDO() 'nên hoạt động không? OP muốn kịch bản không trả lời, điều này có nghĩa là không có phản hồi và không phải là 'phản hồi mong muốn', không có phản hồi ... Điều này có vẻ như một giải pháp cho tôi, cũng như giải pháp ngủ ... –

+0

Nếu bạn muốn "không phản hồi "chỉ * không trả lời *. Crashing kịch bản * sẽ * kích hoạt một phản ứng, vì vậy nó là vô nghĩa. – deceze

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