1

我想存储一些计数器并希望根据需要增加。这个计数器与任何客户端都不相关,所以我不能使用会话或 cookie。我试过 $GLOBALS 但它不是我想要的。

我想要类似的东西,假设我有 3 个 php 文件,每个文件都会做一些计数器操作。

初始化文件

$_GLOBAL_VARIABLE['cntr1'] = 0;

文件1.php

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

文件2.php

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

文件3.php

echo $_GLOBAL_VARIABLE['cntr1'];

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

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

4

3 回答 3

1

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

于 2013-06-28T14:03:34.920 回答
0

我认为这会奏效

global $cntr1;

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

于 2013-06-28T14:06:41.183 回答
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->change() 方法来增加或减少计数器

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

这比任何事情都更值得深思,但可以根据需要进行调整以使其工作。

于 2013-06-28T15:18:21.537 回答