최근 PHPChina에서 PHP 채팅방 기술에 관한 특별한 주제를 시작했습니다. 저는 최근 이 프로젝트에 참여하고 있기 때문에 여기에 개인적인 견해를 표현하고 싶습니다.
채팅방의 주요 기능:
1. 회원가입, 로그인, 로그아웃, 정보수정을 합니다.
2. 사용자는 채팅방 생성을 신청하고 채팅방 속성을 사용자 정의합니다.
3. 채팅방 이름, 설명, 진행자, 공지사항, 광고 등을 표시합니다.
4. 온라인 사용자 목록을 실시간으로 표시하며, 온라인 사용자 정보(닉네임, 이메일, IP, 접속 시간 등)를 확인할 수 있습니다.
5. 채팅 내용, 글꼴 속성, 동작, 표현 및 일반적인 문구를 게시합니다.
6. 투명화, 비공개 채팅, 스크롤, 사용자 차단, 화면 지우기, 채팅 장면 선택, 배경 음악, 전송 방법 사용자 정의를 허용합니다.
7. 관리자는 회원을 관리(퇴출, 발언 금지, 관리권 이전)할 수 있는 권한을 갖습니다.
참고 사항:
1. 프레임 구조 사용은 금지되어 있습니다. (iframe은 작업 부하를 줄이는 것 외에는 어떤 이점도 제공하지 않습니다.)
2. 프론트엔드 코드와 백그라운드 코드는 완전히 분리되어 있으며, 데이터는 ajax 채널을 통해서만 전송되며 꼭 필요한 데이터만 전송되어야 합니다. (포그라운드에서 데이터를 표시하고 백그라운드에서 데이터를 처리)
3. 프로그램으로 인해 전체 페이지를 새로 고치는 것은 금지되어 있으며, 변경이 필요한 내용만 업데이트합니다. (페이지 새로 고침을 위해 헤더와 메타를 사용하는 것은 금지되어 있습니다.)
4. 채팅 내용 제출 시 사용자 경험의 속도를 맹목적으로 추구할 수 없으며, 실제 채팅 기록 제출 순서를 무시할 수 없습니다. (즉, 많은 사람이 동시에 정보를 제출할 수 있기 때문에 제출된 채팅 기록을 서버에서 실제 순서대로 재구성한 후 클라이언트로 전송해야 합니다.)
사용된 기술:
1. 프런트엔드와 백엔드-AJAX 사이의 브리지. jquery, XAJAX를 선택할 수 있습니다. 나는 빠르고 간단하며 내구성이 뛰어나고 플러그인이 많고 업데이트가 빠른 jquery를 선호합니다.
2. 데이터 캐리어-XML의 형태. 사실 일반 대화방 데이터는 그다지 복잡하지 않고, json이면 충분합니다.
3. 데이터베이스 추상화 계층 -ADODB. PDO를 사용하는 것이 더 빠릅니다. 저는 이미 ADODB에 익숙합니다.
4. 기본 데이터 저장 매체 - MySQL. 이것에 대해서는 의심의 여지가 없습니다.
5. 데이터 중간 저장 매체-memcache. Memcache 공유 메모리에 고속 읽기 및 쓰기 데이터를 저장하여 데이터베이스의 부하를 줄입니다.
6. 영상과 음성을 구현하려면 서버 FMS(Flash Media Server)의 지원이 필요하며, 클라이언트에서는 Flash Player를 설치해야 합니다. 그리고 여기에는 HTML, 자바스크립트, 플래시 및 배경 간의 데이터 상호작용이 포함됩니다. 이에 대한 정보가 많지 않습니다.
이것이 핵심 기술이다. 실제 애플리케이션 개발에서는 아직 해결해야 할 세부적인 문제가 많다.
예: 온라인 목록 업데이트를 처리하는 방법은 무엇입니까?
두 가지 방법이 있습니다:
1. 업데이트 여부에 관계없이 전체 목록을 새로 고칩니다.
2. 온라인 신규 회원 추가, 오프라인 회원 삭제, 정보가 변경된 회원 변경이 가능합니다.
분명히 두 번째 옵션이 최선의 옵션입니다.
XmlHttpRequest 동시성 문제를 처리하는 방법은 무엇입니까?
JavaScript는 단일 스레드입니다. 동시에 두 개의 XmlHttpRequest 개체가 있으면 문제가 쉽게 발생할 수 있으며 이로 인해 XmlHttpRequest의 생성 및 종료를 제어해야 합니다.
채팅방에서 업데이트해야 하는 데이터에는 주로 온라인 목록(회원 정보 업데이트 포함), 채팅 기록, 채팅방 속성 등이 포함됩니다. 이러한 업데이트의 빈도는 일관되지 않습니다(시간이 일관되면 이를 처리하기 위해 XmlHttpRequest만 생성하면 됩니다). 채팅 기록은 업데이트하는 데 시간이 조금 더 걸리고, 온라인 목록은 업데이트하는 데 시간이 조금 더 걸릴 수 있습니다. 프레임워크를 사용하지 않고 XmlHttpRequest 객체를 별도로 생성하면 동시성 문제가 발생할 가능성이 높습니다. 이를 위해서는 시간 및 프로세스 제어 기능을 생성해야 합니다.
setInterval('process_control()',3000) //3초마다 한 번씩 호출됩니다.
process_control 함수는 일정 간격으로 작업을 실행하고 작업이 완료된 후에만 다음 작업을 실행하는 등 작업 스케줄링을 구현합니다.