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 và 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ủ.
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 –
Đây là câu hỏi nghiêm túc và thú vị! –
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. –