2008-08-21 45 views
15

Tôi đang chạy Apache trên Linux trong VMWare.sleep() âm thầm ho CPU CPU

Một trong các trang PHP tôi yêu cầu thực hiện sleep() và tôi thấy rằng nếu tôi cố gắng yêu cầu trang thứ hai trong khi trang đầu tiên là sleep()'ing, trang thứ hai bị treo, đợi trang sleep() từ trang đầu tiên đến hoàn thành.

Có ai khác nhìn thấy hành vi này không?

Tôi biết rằng PHP không phải là đa luồng, nhưng điều này có vẻ như xử lý sai tổng của CPU.

Chỉnh sửa: Tôi đã đề cập rằng việc sử dụng CPU không tăng đột biến. Những gì tôi có nghĩa là bởi CPU "hogging" là không có trang PHP khác có vẻ như có thể sử dụng CPU trong khi trang đang ngủ() 'ing.

+0

Bạn đã bao giờ tìm thấy giải pháp cho điều này chưa? Im có cùng một vấn đề. –

Trả lời

1

Bạn có thực sự thấy CPU đi tới 100% hay chỉ là không có trang nào khác đang được phân phối? Làm thế nào nhiều apache-trường hợp là bạn runnning? Tất cả đều dừng lại khi bạn chạy sleep() trong số các chủ đề?

Chức năng sleep() của PHP cơ bản chạy qua vòng lặp không hoạt động trong n giây. Nó không giải phóng bất kỳ bộ nhớ nào, nhưng nó không làm tăng tải CPU đáng kể.

4

Điều này có thể có nghĩa là Apache của bạn chỉ sử dụng 1 quy trình con.

Do đó:

Quá trình con 1 là xử lý một yêu cầu (trong trường hợp này ngủ nhưng nó có thể làm công việc thực tế, Apache không thể biết sự khác biệt), vì vậy khi một yêu cầu mới đến nó, nó sẽ phải đợi cho đến khi quá trình đầu tiên được thực hiện.

Giải pháp là tăng số lượng quy trình con Apache được phép sinh sản (MaxClients chỉ thị nếu bạn đang sử dụng prefork MPM), chỉ cần xóa sleep() khỏi tập lệnh PHP.

Nếu không biết chính xác những gì đang xảy ra trong tập lệnh của bạn thì khó có thể nói, nhưng bạn có thể thoát khỏi giấc ngủ().

+0

Bạn đã thuần hóa khái niệm một chút với từ 'có thể', nhưng tôi vẫn không thấy cách bạn có thể biện minh cho việc có thể loại bỏ các bit mã mà bạn chưa từng thấy mà không phá vỡ mọi thứ? – JoeBloggs

+3

Tôi xin lỗi tôi đã không nhận xét của tôi rõ ràng hơn. Tôi không có nghĩa là bạn chỉ có thể thoát khỏi giấc ngủ và ứng dụng sẽ tiếp tục hoạt động. Tôi có nghĩa là trong khả năng tất cả giấc ngủ() là không có cho một lý do tốt, và các ứng dụng có thể có thể được viết lại để làm việc mà không có giấc ngủ(). – rix0rrr

10

Có thể trang được gọi mở ra một phiên và sau đó không cam kết, trong trường hợp này, hãy xem this answer để biết giải pháp.

+4

Nếu bạn đã cấu hình php.ini với session.auto_start được đặt thành 1, nó sẽ mở phiên trước khi nó chạy bất kỳ mã nào và giữ nó mở cho đến khi bạn đóng nó một cách rõ ràng hoặc trang đến cuối. Yêu cầu thứ hai dường như sẽ treo ngay cả trước khi nó chạy dòng mã đầu tiên. –

+2

Trong trường hợp của tôi, gọi 'session_write_close()' trước khi bắt đầu vòng lặp ngăn chặn 'ngủ' từ khóa truy cập đến các trang khác trên máy chủ. – thirdender