如何永久地在全球范围内存储价值?

时间:2013-06-28 13:57:49

标签: php session cookies global-variables counter

我想存储一些计数器,并希望根据需要增加。 此计数器与任何客户端无关,因此我无法使用会话或cookie。 我试过$ GLOBALS但是,这不是我想要的。

我想要类似的东西,假设我有3个php文件,每个都会做一些反制造。

的init.php

$_GLOBAL_VARIABLE['cntr1'] = 0;

file1.php

$_GLOBAL_VARIABLE['cntr1'] = $_GLOBAL_VARIABLE['cntr1'] + 7;

file2.php

$_GLOBAL_VARIABLE['cntr1'] = $_GLOBAL_VARIABLE['cntr1'] + ($_GLOBAL_VARIABLE['cntr1'] * 0.90);

file3.php

echo $_GLOBAL_VARIABLE['cntr1'];

所有三个文件(init.php除外)将在没有ant关系的情况下随机调用,init将调用一次。

我不想尝试数据库事务coz计数器制作是非常频繁的,文件i / o是一样的。我正在寻找一些方法将我的数据存储在服务器上,直到它启动并运行,有点像c#中的全局类和变量。

3 个答案:

答案 0 :(得分:1)

如果您希望服务器中的商店全局可访问值而不使用数据库,cookie或会话,那么memcache可能是您的解决方案。它是一个守护进程,允许您存储数据并在不同的连接请求中使用它。如果您经常访问,则必须以某种方式处理应用程序中的并发。

答案 1 :(得分:0)

我认为这会起作用

global $cntr1;

如果没有,那么您可以制作一个.inc.php并将此文件包含在所有页面中。 这将解决您的问题。

答案 2 :(得分:0)

我确定这不是你想要的,但我已经使用fileread / filewrite将我的全局变量存储在驱动器上的文件中,可以读取,写入更新值等。这允许你设置很多全局变量作为int,我修改了我的全局变量代码作为迭代器,按照你传递的值来计算或倒计时。

这是我处理请求的简单快速课程:

<?php
  class my_global{

    protected $name;
    protected $value;

    static protected $path = './globals/'; 

    public function __construct()
    {
      if(!is_dir(self::$path))
        mkdir(self::$path);  

    }

    public function change($name, $value)
    {           
      $current = $this->get($name); 
      $this->set($name,$current+$value);       
      return $current+$value;
    }     
    protected function set($name, $value)
    {
      $this->name = $name;    
      $this->value = $value;    
      $this->write(); 
    }
    protected function get($name)    
    {

      if(file_exists(self::$path.$name))
      {
        $myFile = self::$path.$name;
        $fh = fopen($myFile, 'r');
        $value = fread($fh, filesize($myFile));
        fclose($fh); 
      }
      else
        $value = 0;

      $this->name = $name;
      $this->value  = $value;

      return $value;

    }
    protected function write(){     

      $myFile = self::$path.$this->name;
      $fh = fopen($myFile, 'w') or die("can't open file");
      fwrite($fh, $this->value);      
      fclose($fh);

    }

  }
  $my_global = new my_global();   
?>

然后您可以调用$ my_global-&gt; change()方法来增加或减少计数器

<?php     
  echo $my_global->change('new_global',5).'<br>';
  echo $my_global->change('anotherglobal',-2).'<br>';
  echo $my_global->change('forme',7).'<br>';
?>

这比任何事情都更值得思考,但可以根据需要调整使用。