首页 / PHP / php并发多进程任务
php并发多进程任务
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了php并发多进程任务,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2385字,纯文字阅读大概需要4分钟。
内容图文
![php并发多进程任务](/upload/InfoBanner/zyjiaocheng/930/ae211f5848a0444ab24dbcb278c87a27.jpg)
<?php
/*
* 业务需求 php开启5个子进程同步主表与从表数据
* 函数 pcntl_fork() 创建子进程 pcntl_wait回收子进程
*/
include_once "./sql/Medoo.php";
use Medoo\Medoo; //medoo框架 轻量级的PHP数据库框架, 提高开发效率
class Master
{
private $forkNums = 5; //并发数
private $pids = array(); //子进程临时存储
private $limit = 0;
private $offset = 100;
private $time = 2; //并发任务间隔时间
private $masterTableName = 'master'; //主表
private $prepareTableName = 'spare'; //从表
private function getSqlObj($type = 'M')
{
try {
$masterClientData = include '../config/masterDb.php'; //主表配置
$prepareClientData = include '../config/prepareDb.php'; //从表配置
$configData = $type == 'M' ? $masterClientData : $prepareClientData;
return new Medoo($configData);
} catch (Exception $e) {
$this->logWirte('error', $e->getMessage());
exit;
}
}
private function logWirte($type, $msg)
{
date_default_timezone_set('PRC');
$fileName = $type == 'info' ? '../logs/info.log' : '../logs/error.log';
$time = 'startTime:' . date('Y-m-d H:i:s') . " ";
return file_put_contents($fileName, $time . $msg . PHP_EOL, FILE_APPEND);
}
public function sendTask()
{
try {
$sqlObj = $this->getSqlObj('M');
$total = $sqlObj->count("student_master", "*");
$needNumber = ceil($total / $this->offset); //需要进程数
$this->logWirte('info', "=======开始任务======本次需要执行任务数: " . $needNumber);
while ($needNumber) {
$this->logWirte('info', "=======开始任务======: " . $needNumber);
$actualNumber = $needNumber < $this->forkNums ? $needNumber : $this->forkNums;
$this->logWirte('info', "=======并发任务数======: " . $actualNumber);
for ($i = 0; $i < $actualNumber; ++$i) {
$this->pids[$i] = pcntl_fork();
if ($this->pids[$i] == -1) {
die('fork error');
} else if ($this->pids[$i]) {
$this->limit += $this->offset;
$needNumber--;
pcntl_wait($status, WNOHANG);
} else {
$sqlObj = $this->getSqlObj('M');
$returndata = $sqlObj->select($this->masterTableName, "*", ['LIMIT' => [$this->limit, $this->offset]]);
$prepareMysqlObj = $this->getSqlObj('P');
$prepareMysqlObj->insert($this->prepareTableName, $returndata);
echo "父进程ID: ", posix_getppid(), " 进程ID : ", posix_getpid(), " {$i} \r\n";
$this->logWirte('info', "父进程ID: " . posix_getppid() . " 子进程ID : " . posix_getpid());
exit;
}
}
sleep($this->time);
}
} catch (Exception $e) {
$this->logWirte('error', $e->getMessage());
exit;
}
}
}
$obj = new Master();
$obj->sendTask();
参考文章 https://www.cnblogs.com/jkko123/p/6294602.html
内容总结
以上是互联网集市为您收集整理的php并发多进程任务全部内容,希望文章能够帮你解决php并发多进程任务所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。