EDIT: Cập nhật - di chuyển xuống
EDIT 2: Cập nhật - Vấn đề giải quyết PHP đang chạy dưới dạng ứng dụng FastCGI (php-cgi) - cách đưa ra yêu cầu đồng thời?
Một số thông tin cơ bản:
Tôi đang viết webserver của riêng tôi trong Java và một cặp vợ chồng của những ngày trước, tôi đã hỏi về SO chính xác giao diện Apache với PHP, vì vậy tôi có thể thực hiện hỗ trợ PHP. Tôi đã học được rằng FastCGI là cách tiếp cận tốt nhất (vì mod_php không phải là một lựa chọn). Vì vậy, tôi đã xem xét đặc tả giao thức FastCGI và đã quản lý để viết một trình bao bọc FastCGI hoạt động cho máy chủ của tôi. Tôi đã thử nghiệm phpinfo() và nó hoạt động, trên thực tế tất cả các hàm PHP có vẻ hoạt động tốt (đăng dữ liệu, phiên, ngày/giờ, v.v ...).
Máy chủ web của tôi có thể phân phối yêu cầu đồng thời (tức là user1 có thể truy xuất file1.html cùng lúc với user2 yêu cầu some_large_binary_file.zip), nó thực hiện điều này bằng cách sinh ra một chuỗi Java mới cho mỗi yêu cầu của người dùng (chấm dứt khi hoàn thành hoặc kết nối người dùng với máy khách bị hủy).
Tuy nhiên, nó không thể xử lý 2 (hoặc nhiều) yêu cầu FastCGI cùng một lúc. Những gì nó làm, nó xếp hàng chúng lên, vì vậy khi yêu cầu 1 được hoàn thành ngay sau đó nó bắt đầu xử lý yêu cầu 2. Tôi đã thử nghiệm này với 2 trang PHP, một chứa ngủ (10) và phpinfo khác().
Làm cách nào để xử lý nhiều yêu cầu như tôi biết có thể thực hiện được (PHP dưới IIS chạy dưới dạng FastCGI và có thể xử lý nhiều yêu cầu tốt).
Một số thông tin thêm:
tôi mã hóa dưới cửa sổ và tập tin thực thi của tôi sử dụng để thực thi php-cgi.exe chứa:
set PHP_FCGI_CHILDREN=8
set PHP_FCGI_MAX_REQUESTS=500
php-cgi.exe -b 9000
Nhưng nó không đẻ trứng 8 trẻ em, dịch vụ chỉ đơn giản là chấm dứt sau 500 yêu cầu.
tôi đã thực hiện nghiên cứu và từ Wikipedia: (. Tức là nhiều yêu cầu trên một kết nối duy nhất)
Xử lý nhiều yêu cầu đồng thời được thực hiện bằng cách sử dụng một kết nối duy nhất với ghép nội và/hoặc bằng cách sử dụng nhiều kết nối
Bây giờ rõ nhiều kết nối không làm việc cho tôi, như mọi một reque khách hàng sts một cái gì đó liên quan đến FastCGI nó tạo ra một ổ cắm mới cho các ứng dụng FastCGI, nhưng nó không hoạt động đồng thời (nó xếp hàng chúng lên thay thế).
Tôi biết rằng ghép kênh nội bộ của các yêu cầu FastCGI trong cùng một kết nối được thực hiện bằng cách đưa ra mỗi yêu cầu FastCGI duy nhất với request ID khác nhau. (cũng xem 3 đoạn cuối của tiêu đề 'Giao thức Giao tiếp' ở số this article).
Tôi chưa thử nghiệm điều này, nhưng làm cách nào để tôi thực hiện điều đó?Tôi lấy nó Tôi cần một số loại FastCGI Java thread có chứa một bản đồ của một số loại và một chức năng tĩnh mà tôi có thể sử dụng để thêm yêu cầu. Sau đó trong hàm run() của Thread nó sẽ có một vòng lặp while và cho mỗi chu kỳ nó sẽ kiểm tra xem Map có chứa các yêu cầu mới không, nếu như vậy nó sẽ gán cho chúng một ID yêu cầu và ghi chúng vào luồng FastCGI. Và sau đó chờ đợi cho đầu vào vv vv, Như bạn có thể thấy điều này trở nên quá phức tạp.
Có ai biết đúng cách để thực hiện việc này không? Hoặc bất kỳ suy nghĩ nào cả? Cảm ơn rất nhiều.
Lưu ý, nếu được yêu cầu, tôi có thể cung cấp mã cho trình bao bọc FastCGI của tôi.
Cập nhật:
Về cơ bản, tôi đã tải về nginx và thiết lập nó để sử dụng PHP như một ứng dụng FastCGI và nó quá mắc các vấn đề tương tự như máy chủ của tôi. Nó không thể xử lý các yêu cầu PHP đồng thời. Điều này khiến tôi tin rằng mã của tôi là đúng. Vì vậy, một cái gì đó là sai với PHP hoặc tôi không thiết lập nó một cách chính xác. Có lẽ đó là vì tôi đang sử dụng Windows bởi vì một số người dùng lighttpd yêu cầu Windows không thể xử lý FastCGI đúng cách (điều này không có ý nghĩa nhiều). Tôi sẽ cài đặt Linux đôi khi sớm và báo cáo bất kỳ tiến bộ nào với điều đó.
Rất tốt, tôi chỉ gặp vấn đề này trong một ngày, và khó tìm ra điều gì xảy ra trên giấc ngủ() của PHP sẽ ảnh hưởng đến quá trình khác, cảm ơn câu trả lời và chia sẻ của bạn. – ykc