PHP에서 swoole을 사용하기 위한 애플리케이션 시나리오는 무엇입니까?

coldplay.xixi
풀어 주다: 2023-03-01 20:06:01
원래의
3682명이 탐색했습니다.

Swoole을 사용하는 PHP의 응용 시나리오는 다음과 같습니다. 1. 위치 데이터의 실시간 수집 및 실시간 출력 모든 위치 지정 장치는 실시간으로 수신되어야 하며 실시간 트랙 기록이 지도에 표시됩니다. . 포지셔닝 장치만 데이터베이스에 수집되어 저장됩니다. 모든 포지셔닝 장치에서 업로드된 데이터를 데이터베이스에 저장합니다.

PHP에서 swoole을 사용하기 위한 애플리케이션 시나리오는 무엇입니까?

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회이므로 초당 데이터를 요약하여 모든 사용자에게 방송할 수 있습니다. 방법을 기다려주세요

PHP에서 swoole을 사용하기 위한 애플리케이션 시나리오는 무엇입니까?

시나리오 2 - 데이터베이스에 위치 측정 장치만 수집

지침: 데이터를 입력해야 합니다. 모든 포지셔닝 장치가 데이터베이스에 업로드하는 7개의 장치, 초당 하나의 데이터, 저는 개인적으로 swoole의 작업 기능을 사용합니다(task_worker 풀에 비동기 작업을 전달합니다. 이 기능은 비차단이며 작업자 프로세스 수 구성할 수도 있음) 인터페이스 메서드를 호출한 후 저장

서버 메모리 알람 문제

이유:

function

swoole_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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿