扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
我的思路是:
创新互联公司长期为上千客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为泸州企业提供专业的网站制作、网站建设,泸州网站改版等技术服务。拥有10余年丰富建站经验和众多成功案例,为您定制开发。
数据库中新建一个表
is_showUpdate
字段:id、is_update
记录 :id=1;is_update = false;
当你的程序要修改显示信息的时候(也就是展示数据),信息修改完毕将is_showUpdate表的记录标记为true
update is_showUpdate set is_update ='true' where id = 1;
展示页面通过js定时器通过ajax每五秒调取下你的接口,接口只是查询is_showUpdate 表的id为1的记录 is_update 是否为true;如果该字段为true,则此接口将id=1的记录的is_update修改为false,然后给前台页面反水数据,刷新页面;
1、建议你读写数据和下载图片分开,各用不同的进程完成。
比如说,取数据用get-data.php,下载图片用get-image.php。
2、多进程的话,php可以简单的用pcntl_fork()。这样可以并发多个子进程。
但是我不建议你用fork,我建议你安装一个gearman worker。这样你要并发几个,就启几个worker,写代码简单,根本不用在代码里考虑thread啊,process等等。
3、综上,解决方案这样:
(1)安装gearman worker。
(2)写一个get-data.php,在crontab里设置它每5分钟执行一次,只负责读数据,然后把读回来的数据一条一条的扔到 gearman worker的队列里;
然后再写一个处理数据的脚本作为worker,例如叫process-data.php,这个脚本常驻内存。它作为worker从geraman 队列里读出一条一条的数据,然后跟你的数据库老数据比较,进行你的业务逻辑。如果你要10个并发,那就启动10个process-data.php好了。处理完后,如果图片地址有变动需要下载图片,就把图片地址扔到 gearman worker的另一个队列里。
(3)再写一个download-data.php,作为下载图片的worker,同样,你启动10个20个并发随便你。这个进程也常驻内存运行,从gearman worker的图片数据队列里取数据出来,下载图片
4、常驻进程的话,就是在代码里写个while(true)死循环,让它一直运行好了。如果怕内存泄露啥的,你可以每循环10万次退出一下。然后在crontab里设置,每分钟检查一下进程有没有启动,比如说这样启动3个process-data worker进程:
* * * * * flock -xn /tmp/process-data.1.lock -c '/usr/bin/php /process-data.php /dev/null 21'
* * * * * flock -xn /tmp/process-data.2.lock -c '/usr/bin/php /process-data.php /dev/null 21'
* * * * * flock -xn /tmp/process-data.3.lock -c '/usr/bin/php /process-data.php /dev/null 21'
不知道你明白了没有
我先讲一下大屏的应用场景,再来解答题主的问题。
大屏的应用场景主要有两方面:
1.企业能力展示---面对外部客户,展现企业的能力,做参观用。
2.业务能力展现,领导核心关注的数据。
这其中有些数据展现是实时,比如双十一大屏,有些是非实时的,看历史数据的。
对于题主的问题呢,插件可能没办法支持到,我们一般都是以插件作为补充,像视频、Echarts等,客户可以按自己的需要集成一些外部信息。
后台的频繁请求对运算速度有很高的要求,我们会用这几个技术去解决,其中也包括一些我们自主研发的技术,在数据处理效率方面,我们还是很有自信的。
中间结果集缓存技术
对GQuery执行的最终结果进行永久缓存,能够节省缓存结果集所占用的内存空间,同时也能大大提升报告的打开速度,
全局字典技术
通过数值型数据来映射字符串,大大减少了对内存占用的需求,可以提高数据处理效率。
压缩结果数据
MPP数据集市在数据节点(Map节点)可提前进行局部的Reduce计算,即Local Reduce,压缩了传输的结果数据大小,使存储和内存空间的占用降低大概80%多,这样就提高了计算速度。
分布式元数据存储
优化MPP集市云文件Meta信息的存储方式,在Name节点拆分存储naming.meta,从而使云文件可以进行部分的备份和迁移,可以提升系统的可靠性。
大屏上的可视化区域划分是根据具体的业务指标来的。
我举个例子:
我们有个客户大屏想展示的结果是 从盈利能力、资金管理、资产管理的关键财务指标反映xx所现阶段发展规模、经营绩效,以及当年考核目标值的完成情况。
你就能从中拆分出涉及的指标有:
主营业务收入、主营业务成本、利润总额
EVA率、净资产收益率
现金及银行存款、受限现金及银行存款、非受限现金及银行存款
资产负债率
然后你就能知道这些分析应该用什么样的分析方法、适合的图表、分析的维度,继续接着上面的例子,一一对应的关系为:
1.当期值:环比;累计值:全年预算完成率、同比。
按板块分析:各板块的全年目标预算完成情况:本年累计;各板块贡献占比:月度趋势
2. 累计值:实际值、考核值;月度对比分析:与考核值对比
3. 月度趋势分析:体现受限和非受限的结构
4. 期末值:实际值、考核值;月度对比分析:与考核值对比
最后布局设计就如下图:
mysql_query函数查询的方式是查询出全部结果后缓存到内存中,这样就会出现超内存的现象,使用另外一个函数mysql_unbuffered_query可以解决这个问题,mysql_unbuffered_query不会缓存结果集,而是查询出来数据后立马对结果集进行操作,也就是便查询边返回,这样就不会出现超出内存的现象,但是使用mysql_unbuffered_query的是时候不能使用 mysql_num_rows() 和 mysql_data_seek()。并且向 MySQL 发送一条新的 SQL 查询之前,必须提取掉所有未缓存的 SQL 查询所产生的结果行。例如:
使用缓存结果集的代码:
function selecttest()
{
try {
$pdo = new PDO("mysql:host=localhost;dbname=test", 'root', '123456');
// 不使用缓存结果集方式
// $pdo-setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
$sth = $pdo-prepare('select * from test');
$sth-execute();
echo '最初占用内存大小:' . memory_get_usage() . "\n";
$i = 0;
while ($result = $sth-fetch(PDO::FETCH_ASSOC)) {
$i += 1;
if ($i 10) {
break;
}
sleep(1);
print_r($result);
echo '占用内存大小:' . memory_get_usage() . "\n";
}
} catch (Exception $e) {
echo $e-getMessage();
}
}
执行时将会报超出内存的错误:
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 204800000 bytes) in E:\ProgramDevelopment\RuntimeEnvironment\xampp\htdocs\test\test.php on line 56
Call Stack:
0.0005 135392 1. {main}() E:\ProgramDevelopment\RuntimeEnvironment\xampp\htdocs\test\test.php:0
0.0005 135568 2. test-selecttest() E:\ProgramDevelopment\RuntimeEnvironment\xampp\htdocs\test\test.php:85
0.0050 142528 3. PDOStatement-execute() E:\ProgramDevelopment\RuntimeEnvironment\xampp\htdocs\test\test.php:56
将上面代码中的$pdo-setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);一行的注释去掉后将不在缓存结果集,这时运行该函数的结果如下:
最初占用内存大小:144808
Array
(
[id] = 1
[a] = v
[b] = w
[c] = i
)
占用内存大小:145544
Array
(
[id] = 2
[a] = b
[b] = l
[c] = q
)
占用内存大小:145544
Array
(
[id] = 3
[a] = m
[b] = p
[c] = h
)
占用内存大小:145536
Array
(
[id] = 4
[a] = j
[b] = i
[c] = b
)
占用内存大小:145536
可以看到,这时返回一条数据内存占用非常的小,也就700多字节,这样就不会出现超出内存的错误了。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流