2013-03-01 26 views
5

Có thể biết có bao nhiêu đối tượng được lập trình của một lớp PHP có trên toàn bộ máy chủ (đối với tất cả người dùng, không chỉ cho một chuỗi).Có bao nhiêu phiên bản của một lớp trên máy chủ?

Đây là lý do tại sao tôi muốn làm điều đó. Tôi đang làm một trò chơi bài và tôi muốn có lớp phòng (với tên phòng duy nhất, người chơi tại thời điểm trực tuyến trong phòng, socked id ...) vì vậy khi một số người dùng tham gia máy chủ để có danh sách mới của các phòng hoạt động. Và khi một phòng bị hủy bỏ (bị phá hủy), tôi sẽ gửi cho tất cả người dùng thông tin đó (về cơ bản là (các) trạng thái phòng thời gian thực).


Ok, đây là lý do tại sao tôi muốn thực hiện. Tôi đang thực hiện dự án trò chơi bài và tôi muốn có lớp Phòng (với tên phòng duy nhất, người chơi tại thời điểm trực tuyến trong phòng, socked id ...) vì vậy khi một số người dùng tham gia máy chủ để có danh sách mới của phòng hoạt động. Và khi một phòng bị hủy bỏ (bị phá hủy), tôi sẽ gửi cho tất cả người dùng thông tin đó (về cơ bản là (các) trạng thái phòng thời gian thực). Tôi hy vọng bạn hiểu những gì tôi muốn làm.

+4

Không, và không chắc chắn lý do tại sao bạn cần biết ... mỗi yêu cầu máy chủ thậm chí không nhận biết được các yêu cầu máy chủ khác –

+0

Đây là câu hỏi nghiêm túc và thú vị! –

+0

Tôi tò mò tại sao bạn muốn nó, nhưng nó rất thú vị. Tôi sẽ sử dụng một số theo dõi nosql/memcache cho nhiệm vụ này lúc khởi động. –

Trả lời

4

Bạn muốn thực hiện một trò chơi đa người dùng, vì vậy bạn nên sử dụng một client-server kiến ​​trúc cho nó: Thiết lập duy nhất, dai dẳng quá trình máy chủ chạy trên máy tính của bạn và theo dõi trạng thái trò chơi. Mỗi yêu cầu của người dùng được xử lý bởi một tập lệnh "khách hàng" PHP nói chuyện với máy chủ trò chơi và yêu cầu tất cả các thông tin cần thiết.

Bằng cách đó, tất cả các đối tượng Room và tất cả trạng thái trình phát đều hoạt động trong một quá trình: Máy chủ. Máy chủ web (không bị nhầm lẫn với máy chủ trò chơi của bạn) sẽ khởi chạy các chuỗi máy khách và họ nói không đồng bộ với máy chủ trò chơi theo bất kỳ cách nào bạn muốn.

Nếu tình huống của bạn thực sự đơn giản, bạn có thể thay thế quy trình máy chủ bằng cơ sở dữ liệu tập trung lưu trữ ảnh chụp nhanh trạng thái hiện tại của trò chơi (bao gồm danh sách đầy đủ các phòng hoạt động và người chơi liên quan). Mỗi yêu cầu người dùng tải trạng thái trò chơi từ cơ sở dữ liệu và ghi ra bất kỳ thay đổi nào.Nhưng tôi nghĩ rằng một máy chủ chạy dài là cách dễ dàng hơn để đi.

Chỉnh sửa: Câu hỏi của bạn cho thấy một số nhầm lẫn về cách thức hoạt động của PHP. Các chủ đề PHP do máy chủ khởi chạy để xử lý các yêu cầu của người dùng rất ngắn ngủi. Giả sử bạn có 5 người chơi ở đó trong một giờ. Cứ sau vài phút hoặc vài giây, người chơi sẽ gửi yêu cầu tới máy chủ web của bạn. Máy chủ khởi chạy một chuỗi PHP xử lý yêu cầu và thoát. Trò chơi có thể kéo dài hàng giờ, nhưng hầu hết thời gian có không chủ đề đang chạy và không trường hợp của lớp học của bạn để đếm. Vào mọi lúc, bạn sẽ có một số người chơi không có kết nối hoạt động. Vì vậy, bạn cần một số loại loại thực thể liên tục để giữ trạng thái trò chơi giữa các yêu cầu và bạn cũng có thể làm cho nó độc đáo.

Chỉnh sửa 2: Kể từ khi có vẻ như bạn là một chút trên đầu của bạn, có lẽ bạn nên đi với tùy chọn thứ hai: Hãy quên đi quá trình liên lạc và giữ trạng thái trò chơi trong một cơ sở dữ liệu :

Mỗi yêu cầu php là một hành động của người chơi. Khi người dùng nhấp vào một nút hoặc bất cứ điều gì, kịch bản php của bạn tải từ cơ sở dữ liệu tất cả các thông tin cần thiết để mô hình trạng thái hiện tại của trò chơi. Nó thực hiện bất kỳ việc dọn dẹp nhà cần thiết nào (hủy kích hoạt bất kỳ người dùng nào ngừng chơi lâu trước đây), sau đó xử lý hành động của người dùng, lưu mọi thay đổi vào cơ sở dữ liệu và tạo một trang mới cho người dùng. Sau đó, nó thoát. Tất cả chỉ mất một phần nhỏ trong một giây. Sau đó, người dùng tiếp theo (hoặc cùng một người dùng) gửi một hành động khác và bạn bắt đầu lại.

Còn khoảng đồng thời? Trừ khi bạn quản lý để có được rất nhiều người dùng tập lệnh của bạn thực sự chậm, sẽ không có bất kỳ: bạn sẽ chỉ bao giờ chạy một bản sao của tập lệnh tại một thời điểm. Nếu bạn muốn cấm thực thi đồng thời, hãy sử dụng các giao dịch cơ sở dữ liệu để đảm bảo rằng hành động của người dùng được xử lý một lần. Nếu vẫn chưa đủ, hãy tìm hiểu về kiến ​​trúc client-server, giao tiếp giữa các quá trình và tất cả những thứ khác bạn cần cho giải pháp máy khách-máy chủ.

+0

ok điều này thực sự là một giải pháp chính xác – clime

+0

Bạn có thể giải thích cho tôi quá trình máy chủ một chút hoặc gửi một số tài liệu (nó là gì?).Tôi hiểu làm thế nào nó sẽ làm việc nhưng vẫn không biết làm thế nào để làm cho nó. – carobnodrvo

+1

Chi tiết phụ thuộc vào hệ điều hành của bạn. Nếu bạn đang ở trên Unix, máy chủ của bạn có thể chạy dưới dạng "daemon". Nếu trên Windows, nó được gọi là một dịch vụ. Nhưng bất kỳ cách nào để bắt đầu một quá trình chạy dài là tốt. Để biết thêm thông tin, google "kiến trúc máy khách-máy chủ" và theo các liên kết có vẻ liên quan đến những gì bạn đang cố gắng làm. Để tìm hiểu về các cách khác nhau, máy chủ của bạn có thể nói chuyện với các chủ đề máy khách PHP, google "liên lạc liên tiến trình". – alexis

0

Câu trả lời ngắn gọn là không. Câu trả lời rất dài và phức tạp là có nhưng nó sẽ đòi hỏi một tấn hack và chỉnh sửa nguồn php hoặc sử dụng gdb (hoặc một cái gì đó tương tự) để kiểm tra bộ nhớ đang chạy. Theo như tôi biết, hoàn toàn không có sự hỗ trợ của hộp này.

Câu hỏi hay hơn là tại sao bạn cần điều này? Bạn có nhiều khả năng cố gắng giải quyết một vấn đề dễ dàng hơn nhiều để giải quyết một cách khác.

Bạn có thể thoát khỏi chỉ bằng cách sử dụng tăng và giảm APC đối tượng và phá hủy đối tượng nhưng nếu thực sự có quá nhiều đối tượng bạn cần đếm thì bạn chắc chắn có thể gây ra vấn đề hiệu suất lớn.

+0

Không hoặc có? Khó khăn không có nghĩa là không thể. Câu hỏi là rõ ràng; hỏi "tại sao" là không có liên quan (không cần phải độc lập). Ý nghĩa hiệu suất và tầm quan trọng của chúng hoàn toàn không rõ. – erisco

+0

Nếu mục tiêu cuối cùng là giúp đỡ ai đó và họ là kỹ sư phần mềm bạn thực sự cần phải xem xét những gì họ đang cố gắng giải quyết. Nhiều kỹ sư sẽ giảm một vấn đề với những gì họ nghĩ là một giải pháp tối ưu (như đếm tất cả các biến của một biến trên toàn bộ máy chủ trong php) khi có thể họ muốn làm một cái gì đó như theo dõi xem có bao nhiêu truy vấn SQL đang chạy. đối tượng là một DTO). –

+0

Giả định rằng chúng không có khả năng đánh giá vấn đề và các giải pháp được đề xuất. Nếu bạn đã thực hiện công việc nền tảng thì thật tức giận khi tiếp tục nghe "nhưng tại sao bạn lại muốn làm điều đó?" kèm theo không có câu trả lời (mà nói, tôi đánh giá cao rằng bạn đã cung cấp một câu trả lời). Có rủi ro khi tìm ra thông tin bổ sung từ một người có thể bị hiểu lầm không? Tôi không nghĩ vậy. Con người cần phải được ra lệnh ít giáo điều và phải chịu nhiều thực tại hơn; cho phép họ giải quyết vấn đề một cách khác nhau và đạt được kết luận riêng của họ về mức độ khó khăn của nó. Cuộc sống không nằm trên hàng. – erisco

2

Điều này chắc chắn là một cách tiếp cận thô, nhưng bạn chỉ cần đặt một cái gì đó trong hàm tạo cho lớp. Đó là một cái gì đó có thể được để đăng nhập một cái gì đó, email một cái gì đó, đọc một truy cập và tăng vv ...

Rõ ràng nếu bạn muốn biết có bao nhiêu trường hợp tại bất kỳ điểm nào trong thời gian, bạn sẽ cần một cái gì đó trong destructor là tốt. ..

Sau khi đọc câu trả lời của bạn (mà cần phải có được một bình luận về câu hỏi ban đầu của bạn), cách tốt nhất để thực hiện điều này sẽ được sử dụng các phương pháp lớp và các thuộc tính, như vậy bất kỳ trường hợp có thể đọc/thay đổi số lượng chia sẻ. Bạn vẫn có thể sử dụng hàm tạo và hàm hủy để tăng/giảm số lượng bảng đang hoạt động, v.v., nhưng lớp sẽ duy trì một số duy nhất, có thể truy cập bởi tất cả các trường hợp.

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