2010-05-08 25 views
6

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 đó.

+0

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

Trả lời

6

OK, tôi đã tìm ra nguyên nhân của sự cố. Đó không phải là mã của tôi cả. Đó là PHP, nó không thể sinh ra thêm php-cgi dưới Windows khi chạy như chế độ FastCGI, dưới Linux nó hoạt động hoàn hảo, tôi chỉ đơn giản là chỉ máy chủ của tôi vào IP hộp Linux của tôi và nó không có vấn đề với các yêu cầu đồng thời FCGI. Sucks, nhưng tôi đoán đó là cách nó là ...

Tôi đã xem xét sâu hơn về mã nguồn PHP sau đó và thấy rằng phần mã trả lời PHP_FCGI_CHILDREN đã được đóng gói bởi #ifndef WIN32 Vì vậy, các nhà phát triển phải hãy lưu ý vấn đề này

2

Xin chào điều này đến muộn một chút, tôi đã viết một người viết blog cho php-cgi.exe trên các cửa sổ, không hoàn hảo nhưng nó có thể là thứ bạn cần. Kiểm tra tại here.

+0

Oh rất hay, tôi sẽ xem xét điều đó! –

+0

halleluya người đàn ông, sau 2 ngày googling rộng rãi và nhận ra rằng php-cgi.exe có thể phục vụ 1 kết nối đồng thời tôi đã tuyệt vọng để phát triển cục bộ trên apache và trên máy chủ có nginx, nhưng tôi muốn có cùng một thiết lập trong cả hai môi trường. vì vậy giải pháp của bạn đã giúp. btw nó chỉ hoạt động với activepython, bởi vì nó có ˇwin32processesˇ, python chuẩn không có lib đó – Skyzer

2

re: spawn-php python script ...

Cảm ơn @nosam thực sự đã trợ giúp.
Đối với những người muốn làm cho nó làm việc một cách nhanh chóng bạn sẽ cần sau (nếu hệ thống 64bit)

ActivePython-2.7.2.5-win64-x64.msi
pywin32-217.win-amd64-py2.7 Exe

ActivePython không có phiên bản cũ của những ngày www của họ, do đó bạn sẽ cần phải làm một chút googling xung quanh để tìm một tấm gương làm việc (có rất nhiều trên mạng)

một khi bạn đã tải về src từ bitbucket bạn có thể cần phải chỉnh sửa spawn-php.py (để sửa chữa tab spaci ng), khi bit-xô dường như làm hỏng tab trong tệp ngăn không cho nó chạy.

Tất cả trong tất cả đã lưu ngày của tôi cho một trang web cửa sổ nhỏ bận rộn sử dụng nginx + fast-cgi.

Cảm ơn bạn đời!

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