背景:在一个项目中,需要一次对数据很复杂的计算,其中一次计算需要花费大概30秒钟时间,大概需要查询一个比较大的表300次左右,然后还需要进行查询7-8次数据库,然后进行组合排序等功能,完成最终结果。对于一个估算平均10w次的一个接口来说,无论从时间上讲和对于数据库的压力来说,这是完全不能接受的,但很幸运的是我们的需求只要求数据每天更新一次。

为此我们有了三种方法

第一种方案:这个方案是我一个同事提出,对300次查询进行优化,把计算结果规为一个表的一个属性,每天定时脚本得出这个属性,,这样查询只需7-8次就能完成。

第二种方案:这个方案是我另一个同事提出,对整个结果进行存储,这样就需要一句sql就能搞定,但是每天需要有一次比较长的查询排序放在一个结果表里面。

第三种方案:是我提出,为什么不把数据放在一个文件里面呢,这样数据库一次查询都没有了,不是降低了每天10w次的访问吗?于是我同事跟我说到进程同步问题,我很是迷茫,php不是有加锁功能吗?为什么不能放在一个文件里面,在使用file_put_content 加入LOCK_EX不是能预防读写锁问题吗。随着数据的增多,为什么一定要用数据库呢,几乎所有的瓶颈都是数据库上面,为什么不能尽量减少数据库的负担呢。于是我做了以下一些实验。

编写两个程序

process1:

set_time_limit(-1);
$filename="D://text.txt";
for($i=0;$i<100;$i++){
file_put_contents($filename, $i,FILE_APPEND|LOCK_EX);
sleep(1);
}

process2:

<?php
set_time_limit(-1);
$filename="D://text.txt";
$string = file_get_contents($filename);
for($i=0;$i<100;$i++){
    if(empty($string)){
        echo error_get_last().var_dump($string).'<br>';
    }else{
        echo $string."<br>";
    }
    sleep(1);
}

因为使用不同浏览器验证,我不知道这会不会产生什么影响。但是结果却是加锁后proceess2只能获得未加锁的内容。还是找不到关于为什么不能使用文件的原因,如果说数据完整和一致性管理上,第三种方法有他的劣势。但是我觉得跟进程无关。希望有人能回答我这些问题

另附我查询到的一些php锁资料

flock

(PHP 3 >= 3.0.7, PHP 4, PHP 5)

flock -- 轻便的咨询文件锁定

说明

bool flock ( int handle, int operation [, int &wouldblock] )

PHP 支持以咨询方式(也就是说所有访问程序必须使用同一方式锁定, 否则它不会工作)锁定全部文件的一种轻便方法。

注:
在 Windows 下 flock() 将会强制执行。

flock() 操作的 handle
必须是一个已经打开的文件指针。operation
可以是以下值之一:

    • 要取得共享锁定(读取程序),将
      operation 设为 LOCK_SH(PHP 4.0.1 以前的版本设置为 1)。

    • 要取得独占锁定(写入程序),将
      operation 设为 LOCK_EX(PHP 4.0.1 以前的版本中设置为 2)。

    • 要释放锁定(无论共享或独占),将
      operation 设为 LOCK_UN(PHP 4.0.1 以前的版本中设置为 3)。

    • 如果你不希望 flock() 在锁定时堵塞,则给
      operation 加上 LOCK_NB(PHP 4.0.1 以前的版本中设置为 4)。

php 关于锁的一些看法的更多相关文章

  1. SQL Server中的锁 详解 nolock,rowlock,tablock,xlock,paglock

    摘自: http://www.myexception.cn/sql-server/385562.html 高手进 锁 nolock,rowlock,tablock,xlock,paglock 锁 no ...

  2. 深入理解 iOS 开发中的锁

    来源:伯乐在线 - 夏天然后 链接:http://ios.jobbole.com/89474/ 点击 → 申请加入伯乐在线专栏作者 摘要 本文的目的不是介绍 iOS 中各种锁如何使用,一方面笔者没有大 ...

  3. SQL Server中CURD语句的锁流程分析

    我只在数据库选项已开启“行版本控制的已提交读”(READ_COMMITTED_SNAPSHOT为ON)中进行了观察. 因此只适用于这种环境的数据库. 该类数据库支持四种不同事务隔离级别,下面分别观察数 ...

  4. java并发编程的艺术——第五章总结(Lock锁与队列同步器)

    Lock锁 锁是用来控制多个线程访问共享资源的方式. 一般来说一个锁可以防止多个线程同时访问共享资源(但有些锁可以允许多个线程访问共享资源,如读写锁). 在Lock接口出现前,java使用synchr ...

  5. 基于Redis的分布式锁真的安全吗?

    说明: 我前段时间写了一篇用consul实现分布式锁,感觉理解的也不是很好,直到我看到了这2篇写分布式锁的讨论,真的是很佩服作者严谨的态度, 把这种分布式锁研究的这么透彻,作者这种技术态度真的值得我好 ...

  6. 谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景?

    在日常开发中,尤其是业务开发,少不了利用 Java 对数据库进行基本的增删改查等数据操作,这也是 Java 工程师的必备技能之一.做好数据操作,不仅仅需要对 Java 语言相关框架的掌握,更需要对各种 ...

  7. 谷歌pixel手机解BL锁、刷机、破解电信(史上最详细的帖子)

    本文根据网上已有内容进行整理,对每一个步骤都进行了实践,运气爆棚,几乎没有出现什么重大错误,小错误也进行了很好地解决.因此,十分感激那些为折腾google pixel的IT爱好者,为我提供了无穷的帮助 ...

  8. 转自高手关于SQL 锁的叙述。。(nolock,rowlock,tablock,xlock,paglock)

    锁的概述 一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: [丢失更新]A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统 ...

  9. java锁类型

    转载链接在每个锁类型后边 线程锁类型 1.自旋锁 ,自旋,jvm默认是10次吧,有jvm自己控制.for去争取锁 锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchroni ...

随机推荐

  1. for...else: 一个程序引发的陷阱

    python3菜鸟教程有一段关于for循环和else搭配的代码: for n in range(2, 10): for x in range(2, n): if n % x == 0: print(n ...

  2. 剑指offer--18.从尾到头打印链表

    递归,逐个加到后面 ------------------------------------------------------------------------------ 时间限制:1秒 空间限 ...

  3. 通过ifreme实现文件上传

    模板页面添加ifreme <div style=' display: none;' >      <iframe name ="uploadResponse_attachm ...

  4. 2016 ACM-ICPC 区域赛(大连站)题解

    题目链接 A - Wrestling Match (二分图染色) 题意略坑(没有说好的玩家一定能打过差的玩家啊啊~~) 典型的二分图染色问题,每个玩家看成一个点,把相互较量过的玩家之间连边,好的玩家染 ...

  5. New Year and Buggy Bot

    Bob programmed a robot to navigate through a 2d maze. The maze has some obstacles. Empty cells are d ...

  6. LeetCode 361. Bomb Enemy

    原题链接在这里:https://leetcode.com/problems/bomb-enemy/description/ 题目: Given a 2D grid, each cell is eith ...

  7. 解决mac下sublime中文乱码

    Mac OS X 属于 Apple 独家演绎的 Unix 分支版本,默认使用 UTF-8 编码,当使用不同开发平台的小伙伴们,共同维护一份代码的时候,尤其现在很多人都还在用 Windows 系统的时候 ...

  8. jquery中stop停止动画笔记

    jQuery stop() 方法用于停止动画或效果,在它们完成之前. stop() 方法适用于所有 jQuery 效果函数,包括滑动.淡入淡出和自定义动画. 语法: $(selector).stop( ...

  9. RabbitMQ介绍

    (一)RabbitMQ基本概念 RabbitMQ是流行的开源消息队列系统,用erlang语言开发.我曾经对这门语言挺有兴趣,学过一段时间,后来没坚持.RabbitMQ是 AMQP(高级消息队列协议)的 ...

  10. Struts2中web.xml里面struts-cleanup作用

    struts2.1.3之后的版本均不需要配置该过滤器 参考: struts-cleanup作用 升级到struts-2.3.14.3之后涉及的改动以及ActionContextCleanUp,Stru ...