Swoole을 사용하는 PHP의 응용 시나리오는 다음과 같습니다. 1. 위치 데이터의 실시간 수집 및 실시간 출력 모든 위치 지정 장치는 실시간으로 수신되어야 하며 실시간 트랙 기록이 지도에 표시됩니다. . 포지셔닝 장치만 데이터베이스에 수집되어 저장됩니다. 모든 포지셔닝 장치에서 업로드된 데이터를 데이터베이스에 저장합니다.
PHP에서 swoole을 사용하는 응용 시나리오는 다음과 같습니다.
시나리오 1 - 위치 데이터의 실시간 수집 및 실시간 출력(예: Didi 운전자의 운전 궤적)
참고:
모든 위치 확인 장치는 실시간이어야 합니다. 실시간 추적 기록을 수신하고 지도에 표시합니다.
참고:
첫 번째 포인트:
사용자 1, 2, 3은 web1 서버에 연결되어 있으며 web1은 사용자 1, 2, 3에게 정보를 브로드캐스트합니다. 사용자 4, 5, 6은 web2 연결을 브로드캐스트할 수 없습니다. 사용자 1이 메시지를 보내는 장면을 가정하면 web1 서버의 사용자만 볼 수 있고 web2의 모든 사용자는 볼 수 없습니다. 두 번째 포인트: 메시지 빈도 제어, 예: 100개의 장치, 100명의 사용자, 100개의 장치가 초당 한 개의 데이터를 업로드하며, 이는 각 사용자에게 실시간으로 브로드캐스팅되어야 합니다. 즉, 100*100 = 초당 1W회이므로 초당 데이터를 요약하여 모든 사용자에게 방송할 수 있습니다. 방법을 기다려주세요
시나리오 2 - 데이터베이스에 위치 측정 장치만 수집지침: 데이터를 입력해야 합니다. 모든 포지셔닝 장치가 데이터베이스에 업로드하는 7개의 장치, 초당 하나의 데이터, 저는 개인적으로 swoole의 작업 기능을 사용합니다(task_worker 풀에 비동기 작업을 전달합니다. 이 기능은 비차단이며 작업자 프로세스 수 구성할 수도 있음) 인터페이스 메서드를 호출한 후 저장
서버 메모리 알람 문제
이유:
functionswoole_server->task
작업의 기본 사용에 대한 공식 소개에 있습니다. Unix 소켓 파이프 통신은 전체 메모리이며 IO 소비가 없습니다. . 단일 프로세스의 읽기 및 쓰기 성능은 100만/초에 달할 수 있습니다. 서로 다른 프로세스는 서로 다른 파이프라인을 사용하여 통신하므로 여러 코어의 사용을 극대화할 수 있습니다.
하지만 프로그램 인터페이스를 호출하는 작업의 경우 네트워크 지연으로 인해 추가된 작업이 소모된 작업보다 많으면 메모리 사용량이 계속 증가하여 서버의 메모리가 가득 차게 됩니다.
해결 방법: 메시지 수신 작업 빈도를 제어하고 자신의 비즈니스 시나리오에 따라 지연 가능 여부를 정의할 수 있습니다. 1초 이내에 모든 데이터를 요약한 다음 프로그램 인터페이스를 호출합니다. (저는 요약할 때 개인적으로 redis를 사용합니다.) ) 최고입니다. 인터페이스를 호출하지 않고 라이브러리에 직접 저장할 수 있습니다
간단한 코드 조각
function __construct($config) { $this->config = $config; $this->serv = new Swoole\Server($config['server']['host'], $config['server']['port']); // 连接redis $this->redis = new Predis\Client($config['redis']); $this->storage = new Storage($this->config); $this->serv->set([ 'worker_num' => $this->config['server']['workerNum'], //工作进程数量 'daemonize' => $this->config['server']['daemonize'], //是否作为守护进程 'task_worker_num' => $this->config['server']['taskWorkerNum'], ]); $this->serv->on('connect', function ($serv, $fd){ $this->onConnect($fd, $serv); }); $this->serv->on('receive', function ($serv, $fd, $from_id, $data) { $this->onReceive($fd, $serv, $data); }); $this->serv->on('Close', function($server, $fd) { $this->onClose($fd, $server); }); $this->serv->on('Task', function($server, $task_id, $from_id, $data) { $this->onTask($server, $task_id, $from_id, $data); }); $this->serv->on('Finish', function($server, $task_id, $data) { $this->onFinish($server, $task_id, $data); }); $this->serv->start(); } public function onTask($serv, $task_id, $from_id, $data){ // insert 方法是通过接口入库 $this->storage->insert($data); } public function onReceive($fd, $serv, $data) { $this->storage->writeLog('message:'.$data); $data = $this->formatData($data, $fd); $serv->task($data); } public function onClose($fd, $serv) { // writeLog 方法是写入log $this->storage->writeLog('close fd:'.$fd); } public function onFinish($serv, $task_id, $data) { return ''; }
PHP 프로그래밍 입문부터 숙련까지
위 내용은 PHP에서 swoole을 사용하기 위한 애플리케이션 시나리오는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!