php静态数组成员为什么总是被初始化? 不能使用静态成员存储全站共享的信息么?
我的目的是记录访问网站的所有访客的ip我写了一段程序用来将访客的ip加入到ipManager类的一个静态成员array对象里(下面程序的$ips)但是每次打开一个页面的时...
我的目的是记录访问网站的所有访客的ip
我写了一段程序用来将访客的ip加入到ipManager类的一个静态成员array对象里(下面程序的$ips)
但是每次打开一个页面的时候,都发现这个array对象里面是空的!
难道php的静态成员每次打开页面都会被初始化么?
如何才能够实现记录访问网站的所有访客的ip呢?
下面是ipManager类:
<?php
class IpManager{
public static $ips= array();
//查看ip是否已经在列表中
static public function isInList($targetIp){
print_r(self::$ips);
echo "".$targetIp;
foreach(self::$ips as $key=>$value){
echo "".$key;
if(strcmp("".$key, "".$targetIp)==0){
return $value;
}
}
return -1;
}
//将新ip添加到列表里
static public function add($targetIp){
$ip = "".$targetIp;
self::$ips[$ip] = 1;
//array_push($ips, $ip, 0);
//print_r(self::$ips);
}
}
?>
在页头里面调用:
require('ipManager.php');
$ip = getIP(); //通过一个函数得到ip
if( ($count = IpManager::isInList($ip)) < 0){ //查看是否列表里有了该ip
echo 'not in list';
IpManager::add($ip); //如果列表里没有当前ip,加入列表
}
我就算不停刷新同一个页面,每次这个array也会被重置(没有内容)
我只需要保存24小时的ip,之后就清空这个array,因此想存在内存里就好了。。。 展开
我写了一段程序用来将访客的ip加入到ipManager类的一个静态成员array对象里(下面程序的$ips)
但是每次打开一个页面的时候,都发现这个array对象里面是空的!
难道php的静态成员每次打开页面都会被初始化么?
如何才能够实现记录访问网站的所有访客的ip呢?
下面是ipManager类:
<?php
class IpManager{
public static $ips= array();
//查看ip是否已经在列表中
static public function isInList($targetIp){
print_r(self::$ips);
echo "".$targetIp;
foreach(self::$ips as $key=>$value){
echo "".$key;
if(strcmp("".$key, "".$targetIp)==0){
return $value;
}
}
return -1;
}
//将新ip添加到列表里
static public function add($targetIp){
$ip = "".$targetIp;
self::$ips[$ip] = 1;
//array_push($ips, $ip, 0);
//print_r(self::$ips);
}
}
?>
在页头里面调用:
require('ipManager.php');
$ip = getIP(); //通过一个函数得到ip
if( ($count = IpManager::isInList($ip)) < 0){ //查看是否列表里有了该ip
echo 'not in list';
IpManager::add($ip); //如果列表里没有当前ip,加入列表
}
我就算不停刷新同一个页面,每次这个array也会被重置(没有内容)
我只需要保存24小时的ip,之后就清空这个array,因此想存在内存里就好了。。。 展开
展开全部
在PHP里类本身 只有在一个页面(包括include文件)里存在的 ,所有成员属性都一样
只要你换页面 或者重新打开 那都会重置的。
所谓静态是 在一个页面 多次调用的时候 才能有效保存。
你要实现访问网站的所有访客的ip ,
最有效方法 是 存储在 数据库当中 这样才能保证不会 丢失
---------------------------
你只要进行了刷新页面 所有变量会被 清除 在重新生成。
短时间存储的 话 内存当然是最有效的。
但是需要服务器配置 才可以使用
比如 Memcache扩展 就是利用内存进行缓存的。
网上有很多资料 你可以搜一下
只要你换页面 或者重新打开 那都会重置的。
所谓静态是 在一个页面 多次调用的时候 才能有效保存。
你要实现访问网站的所有访客的ip ,
最有效方法 是 存储在 数据库当中 这样才能保证不会 丢失
---------------------------
你只要进行了刷新页面 所有变量会被 清除 在重新生成。
短时间存储的 话 内存当然是最有效的。
但是需要服务器配置 才可以使用
比如 Memcache扩展 就是利用内存进行缓存的。
网上有很多资料 你可以搜一下
追问
谢谢回答
但是我就算不停刷新同一个页面,每次这个array也会被重置(没有内容)
这又是怎么回事?(是否和include方式有关系?我在每个页面里include head.php然后head里面include了ipManager.php)
我只需要保存24小时的ip,之后就清空这个array,因此想存在内存里就好了。。。
追答
PHP里 所有变量 都是在 页面结束的时候就 会被销毁的 静态也一样
也就是 你刷新同一个页面 他也会是 销毁 然后重新 生成 所以当然是 没有内容了。
要保存下来 只有 数据库 ,文件缓存 和 内存缓存了。
建议你用 Memcache扩展 或 APC扩展 需要自己在服务器配置一下
网上有资料 配置不是很难, 手册里有相关函数
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询