이 기사에서는 PHP SWOOLE을 사용하여 비동기 예약 작업 시스템을 만드는 방법을 소개합니다. 구체적으로 어떻게 구현하는지 자세히 살펴보겠습니다.
Nanning 회사 및 여러 지점에서 호출 시스템이 사용되었습니다. 과거에는 통화 데이터 분석이 필요합니다. 지점의 통화 서버가 인트라넷에 있기 때문에 기술적 수단을 통해 매핑됩니다. 지점과 난닝 간의 네트워크가 불안정하므로 분석이 필요합니다. 지점의 통화 데이터는 난닝에 동기화됩니다.
가장 간단한 방법은 MySQL의 마스터-슬레이브 동기화를 직접 구성하여 난닝에 데이터를 동기화하는 것입니다. 하지만 영업 전화 시스템의 회사는 우리에게 MySQL 권한을 부여하지 않습니다. 따라서 이 방법은 포기할 수 밖에 없습니다.
그래서 우리는 단순히 PHP를 사용하여 간단한 PHP 타이밍 동기화 도구를 구현하면 PHP 프로세스가 백그라운드에서 영구적으로 실행될 것이라고 생각하여 먼저 PHP 구성 요소인 SWOOLE에 도달했습니다. 하루 최대 데이터량이 5,000개 내외이므로 이 솔루션도 가능하니 그냥 해보세요.
우리는 PHP SWOOLE을 사용하여 비동기 예약 작업 시스템을 만듭니다.
MySQL 데이터베이스 자체의 마스터-슬레이브 동기화는 마스터 데이터베이스의 바이너리 로그를 구문 분석하여 슬레이브 데이터베이스에 데이터를 동기화합니다. 그러나 PHP를 사용하여 데이터를 동기화하는 경우 마스터 라이브러리에서 일괄적으로 데이터를 쿼리한 다음 난닝의 슬레이브 라이브러리에 삽입할 수만 있습니다.
여기에서 사용하는 프레임워크는 ThinkPHP 3.2
입니다. ThinkPHP 3.2
.
首先安装PHP扩展: SWOOLE,因为没有使用到特别的功能,所以这里我们使用pecl来快速安装:
pecl install swoole
安装完成后在 php.ini
里面加入 extension="swoole.so"
安装完成后,我们使用 phpinfo()
public function index() { $serv = new \swoole_server("0.0.0.0", 9501); $serv->set([ 'worker_num' => 1,//一般设置为服务器CPU数的1-4倍 'task_worker_num' => 8,//task进程的数量 'daemonize' => 1,//以守护进程执行 'max_request' => 10000,//最大请求数量 "task_ipc_mode " => 2 //使用消息队列通信,并设置为争抢模式 ]); $serv->on('Receive', [$this, 'onReceive']);//接收任务,并投递 $serv->on('Task', [$this, 'onTask']);//可以在这个方法里面处理任务 $serv->on('Finish', [$this, 'onFinish']);//任务完成时候调用 $serv->start(); }
php.ini
에 extension="swoole.so"
를 추가합니다. 설치가 완료된 후 phpinfo()
를 사용하여 여부를 확인합니다. 성공했습니다. 설치가 성공적으로 완료되면 글쓰기를 시작해 보겠습니다.
Server
1 먼저 백그라운드 서버를 시작하고 포트 9501public function onReceive($serv, $fd, $from_id, $data) { //使用json_decode 解析任务数据 $areas = json_decode($data,true); foreach ($areas as $area){ //投递异步任务 $serv->task($area); } }
3. 작업 실행, 데이터를 쿼리하여 마스터 라이브러리에서 슬레이브 데이터베이스로 기록
public function onTask($serv, $task_id, $from_id, $task_data) { $area = $task_data;//参数是地区编号 $rows = 50; //每页多少条 //主库地址,根据参数地区($area)编号切换master数据库连接 //从库MySQL实例,根据参数地区($area)编号切换slave数据库连接 //由于程序是常驻内存的,所以MySQL连接可以使用长连接,然后重复利用。要使用设计模式的,可以使用对象池模式 Code...... //master 库为分公司的数据库,slave库为数据同步到南宁后的从库 Code...... //使用$sql获取从库中最大的自增: SELECT MAX(id) AS maxid FROM ss_cdr_cdr_info limit 1 $slaveMaxIncrementId = ...; //使用$sql获取主库中最大的自增: SELECT MAX(id) AS maxid FROM ss_cdr_cdr_info limit 1 $masterMaxIncrementId = ...; //如果相等的就不同步了 if($slaveMaxIncrementId >= $masterMaxIncrementId){ return false; } //根据条数计算页数 $dataNumber = ceil($masterMaxIncrementId - $slaveMaxIncrementId); $eachNumber = ceil($dataNumber / $rows); $left = 0; //根据页数来进行分批循环进行写入,要记得及时清理内存 for ($i = 0; $i < $eachNumber; $i++) { $left = $i == 0 ? $slaveMaxIncrementId : $left + $rows; $right = $left + $rows; //生成分批查询条件 //$where = "id > $left AND <= $right"; $masterData = ...;//从主库查询数据 $slaveLastInsertId = ...;//插入到从库 unset($masterData,$slaveLastInsertId); } echo "New AsyncTask[id=$task_id]".PHP_EOL; $serv->finish("$area -> OK"); }
4. 작업이 완료되면 public function onFinish($serv, $task_id, $task_data)
{
echo "AsyncTask[$task_id] Finish: $task_data".PHP_EOL;
}
을 호출합니다. 기본적으로 완료되었으며 남은 것은 클라이언트 작업 push
public function index() { $client = new \swoole_client(SWOOLE_SOCK_TCP); if (!$client->connect('127.0.0.1', 9501, 1)) { throw new Exception('链接SWOOLE服务错误'); } $areas = json_encode(['liuzhou','yulin','beihai','guilin']); //开始遍历检查 $client->send($areas); echo "任务发送成功".PHP_EOL; }
이제 기본적으로 완료되었습니다. 나머지는 예약된 실행을 위한 쉘 스크립트를 작성하는 것입니다: /home/wwwroot/sync_db/crontab/send.sh
#!/bin/bash PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH # 定时推送异步的数据同步任务 /usr/bin/php /home/wwwroot/sync_db/server.php home/index/index
crontab 예약 작업을 사용하여 추가합니다. 예약된 작업에 스크립트
#设置每天12:30执行数据同步任务 30 12 * * * root /home/wwwroot/sync_db/crontab/send.sh #设置每天19:00执行数据同步任务 0 19 * * * root /home/wwwroot/sync_db/crontab/send.sh
팁: 최고 작업 푸시 및 실행이 성공했는지 알 수 있도록 로그 쓰기 작업을 추가하는 것이 좋습니다.
기본적으로 프로그램이 완성되었습니다. 더 좋은 방법이 있으면 언제든지 제안해 주세요.
위 내용은 이 글의 전체 내용입니다. 모든 분들의 학습에 도움이 되었으면 좋겠습니다. 더 많은 관련 내용은 PHP 중국어 홈페이지를 주목해주세요!
PHP는 두 배열의 서로 다른 요소를 쿼리하는 방법을 구현합니다.php는 mysql 연결 풀의 효과를 구현합니다.🎜🎜
위 내용은 PHP는 SWOOLE 확장을 사용하여 타이밍 동기화를 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!