Maison > développement back-end > tutoriel php > Contenu lié au verrouillage des processus PHP

Contenu lié au verrouillage des processus PHP

一个新手
Libérer: 2023-03-15 22:04:02
original
1306 Les gens l'ont consulté

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

<?php

/**

 * CacheLock 进程锁,主要用来进行cache失效时的单进程cache获取,防止过多的SQL请求穿透到数据库

 * 用于解决PHP在并发时候的锁控制,通过文件/eaccelerator进行进程间锁定

 * 如果没有使用eaccelerator则进行进行文件锁处理,会做对应目录下产生对应粒度的锁

 * 使用了eaccelerator则在内存中处理,性能相对较高

 * 不同的锁之间并行执行,类似mysql innodb的行级锁

 * 本类在sunli的phplock的基础上做了少许修改  http://code.google.com/p/phplock

 * @author yangxinqi

 *

 */

namespace Common\Business;

class PhpLock

{

    //文件锁存放路径

    private $path = null;

    //文件句柄

    private $fp = null;

    //锁粒度,设置越大粒度越小

    private $hashNum = 100;

    //cache key

    private $name;

    //是否存在eaccelerator标志

    private  $eAccelerator = false;

 

    /**

     * 构造函数

     * 传入锁的存放路径,及cache key的名称,这样可以进行并发

     * @param string $path 锁的存放目录,以"/"结尾

     * @param string $name cache key

     */

    public function __construct($name,$path=&#39;lock\\&#39;)

    {

        $app_path = str_replace(&#39;ThinkPHP/&#39;, &#39;&#39;, THINK_PATH);

        $is_cli = php_sapi_name();

        if($is_cli == &#39;cli&#39; || $is_cli == &#39;cli_server&#39;)

        {

            $app_path = trim(APP_PATH, &#39;.&#39;);

        }

        else

        {

            $app_path = $app_path . trim(APP_PATH, &#39;.&#39;);

        }

 

        $path = $app_path.&#39;/Common/Business/lockfile/&#39;;

        if(!file_exists($path))

        {

            mkdir($path);

            chmod($path,777);

        }

        //$path .= &#39;/protected/runtime/cache/&#39;;

        //判断是否存在eAccelerator,这里启用了eAccelerator之后可以进行内存锁提高效率

        $this->eAccelerator = function_exists("eaccelerator_lock");

        if(!$this->eAccelerator)

        {

            //$this->path = $path.($this->_mycrc32($name) % $this->hashNum).&#39;.txt&#39;;

            $this->path = $path.sha1($name).&#39;.txt&#39;;

        }

        $this->name = $name;

    }

 

    /**

 * crc32

 * crc32封装

 * @param int $string

 * @return int

 */

    private function _mycrc32($string)

    {

        $crc = abs (crc32($string));

        if ($crc & 0x80000000) {

            $crc ^= 0xffffffff;

            $crc += 1;

        }

        return $crc;

    }

    /**

     * 加锁

     * Enter description here ...

     */

    public function lock()

    {

        //如果无法开启ea内存锁,则开启文件锁

        if(!$this->eAccelerator)

        {

            //配置目录权限可写

            $this->fp = fopen($this->path, &#39;w+&#39;);

            if($this->fp === false)

            {

                return false;

            }

            return flock($this->fp, LOCK_EX);

        }else{

            return eaccelerator_lock($this->name);

        }

    }

    /**

     * 解锁

     * Enter description here ...

     */

    public function unlock()

    {

        if(!$this->eAccelerator)

        {

            if($this->fp !== false)

            {

                flock($this->fp, LOCK_UN);

                clearstatcache();

            }

            //进行关闭

            fclose($this->fp);

        }else{

            return eaccelerator_unlock($this->name);

        }

    }

}

Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal