PHP工作中用到的小膏药
May 29
标题中所说的陷阱就是:PHP的索引key值如果没有用引号括起来来的话,PHP会先检查这个key是否是一个常量,如果不是常量,才会把它解析成一个变量。请看如下代码:
  
define('test','abc');

$arr = array();
$arr['test'] = 'aaa';
$arr['abc'] = 'bbb';

echo $arr['test']; //输出aaa
echo $arr[test]; //输出bbb

这种错误说大不大,不过要真没注意的话,调试的时候也会让人很纠结,呵呵。
May 29
我们在平时开发时,可能不会对PHP的gc做太多的关注,这也是PHP的先天因素决定的,即在脚本运行结束时释放所占有的内存,这一点和ruby,python等语言是完全不一样的。开发者完全没有必要担心PHP内存泄露的问题,除非是在开发cli等常驻内存的daemon程序。

在PHP内部,为每一个变量都定义了一个zval变量容器,这个zval包含4个信息:变量类型,变量值,is_ref(是否被引用),refcount(引用的次数,默认为1),当然,这个zval变量容器和变量作用域相关。
例如:
1、定义 $a = ‘test’;则zval内容为 a: (refcount=1, is_ref=0)=’test’。
2、$b = $a;则a的zval内容为 a: (refcount=2, is_ref=0)=’test’。
3、执行unset($b);则zval内容为 a: (refcount=1, is_ref=0)=’test’。

ps: 当我们使用unset($a)后,如果$a的refcount不为0,其实并没有销毁$a变量(只有到refcount为0时才会销毁),仅仅是少了一个引用而已。如果要销毁$a,应该使用$a=null;

复合数据类型(array,object)

复合数据类型的每个成员都有一个zval,即 $a = array(1,2);就有3个zval:
a: (refcount=1, is_ref=0)=array (
0=>(refcount=1, is_ref=0)=1,
1=>(refcount=1, is_ref=0)=2,
)
对复合数据类型执行unset和上面提到的一样。只减少refcount。

如果执行 $a[] = &$a;进行引用操作,则zval为:
a: (refcount=2, is_ref=1)=array (
0=>(refcount=1, is_ref=0)=1,
1=>(refcount=1, is_ref=0)=2,
2=>(refcount=2, is_ref=1) = array
)

启用和禁用垃圾回收,可以通过2个函数来控制,gc_enable(),gc_disable(),如果想要关闭垃圾回收,最好在gc_disable()之前执行一次gc_collect_cycles(),即强制回收,避免出现内存泄露。
  
Feb 7
//开启session 存储地址,session名称
function open($save_path, $session_name)
{
  global $sess_save_path, $sess_session_name;
      
  $sess_save_path = $save_path;
  $sess_session_name = $session_name;
  return(true);
}

function close()
{
  return(true);
}

function read($id)
{
  global $sess_save_path, $sess_session_name;

  $sess_file = "$sess_save_path/sess_$id";
  if ($fp = @fopen($sess_file, "r")) {
    $sess_data = fread($fp, filesize($sess_file));
    return($sess_data);
  } else {
    return(""); // Must return "" here.
  }

}

function write($id, $sess_data)
{
  global $sess_save_path, $sess_session_name;

  $sess_file = "$sess_save_path/sess_$id";
  if ($fp = @fopen($sess_file, "w")) {
    return(fwrite($fp, $sess_data));
  } else {
    return(false);
  }

}

function destroy($id)
{
  global $sess_save_path, $sess_session_name;
      
  $sess_file = "$sess_save_path/sess_$id";
  return(@unlink($sess_file));
}

/*********************************************
* WARNING - You will need to implement some *
* sort of garbage collection routine here.  *
*********************************************/
function gc($maxlifetime)
{
  return true;
}

// 开启、关闭、读取、写入、销毁、垃圾回收(失效)
session_set_save_handler("open", "close", "read", "write", "destroy", "gc");

session_start();

// proceed to use sessions normally

?>
Apr 26

<?php
/**
* @Desc 生成随机数<验证码>
* @author yangjs
* @date 20100830
*/
@session_start();
class Randcode
{
  public $randCode;    //生成的验证码字符串
  private $codeLength;//生成的验证码的长度
  private $codeSize; //生成的验证码的字体大小
  private $imageHeight;//图片的宽度
  private $imageWidth;//图片的高度
  private $imageBoder;//图片是否需要边框
  private $imageId;//图象的标识符
  private $disturbColor; //干扰像素的颜色randStr
  public function __construct($codeLength=4,$codeSize=5,$imageHeight=30,$imageWidth=80,$imageBoder=true)
  {
     $this->codeLength=$codeLength;
     $this->codeSize=$codeSize;
     $this->imageHeight=$imageHeight;
     $this->imageWidth=$imageWidth;
     $this->imageBoder=$imageBoder;
  }
  public function outImg()
  {
     $this->outFileHeader();//输出头
     $this->getRandStr($this->codeLength);//产生验证码
     $this->createImage();//产生图片
     $this->setDisturbColor();//设置干扰像素
     $this->writeImage2();//往图片上写验证码
     imagepng($this->imageId);//生成图片
     imagedestroy($this->imageId);//销毁图片
  }
  // 输出头
  private function outFileHeader()
  {
     header ("Content-type: image/png");
  }
  //产生验证码图片
  private function createImage()
  {
     $this->imageId = @imagecreate($this->imageWidth,$this->imageHeight);
     $white = imagecolorallocate($this->imageId,255,255,255);
     $black = imagecolorallocate($this->imageId,0,0,0);
     imagefilledrectangle($this->imageId,0,0,$this->imageWidth-1,$this->imageHeight-1,$white);//白色底
     if($this->imageBoder)
     imagerectangle($this->imageId,0,0,$this->imageWidth-1,$this->imageHeight-1,$black);// 黑色边框
  }
  //设置图片的干扰像素
  private function setDisturbColor()
  {
     for ($i=0;$i<=100;$i++)
     {
      $this->disturbColor=imagecolorallocate($this->imageId,rand(0,255),rand(0,255),rand(0,255));
      imagesetpixel($this->imageId,rand(2,$this->imageWidth),rand(2,$this->imageHeight),$this->disturbColor);
      //magesetpixel()在图像中用color颜色在 x,y 坐标(图像左上角为 0,0)上画一个点。
     }
  }
  //在验证码图片上逐个画上验证码
  private function writeImage()
  {
     $black = imagecolorallocate($this->imageId,0,0,0);
     imagestring($this->imageId,$this->codeSize,0,0,$this->randCode,$black);
  }
  private function writeImage2()
  {
     for ($i=0;$i<=$this->codeLength;$i++)
     {
      //设置随机颜色值
      $randColor = imagecolorallocate ($this->imageId, rand(0,255), rand(0,128), rand(0,255));
      $x = floor($this->imageWidth/$this->codeLength)*$i+5;
      $y = rand(0,$this->imageHeight-15);//上下位置随机
      //$y=floor($this->imageHeight/3);//分成三份,放在中间
      @imagechar($this->imageId, $this->codeSize, $x, $y, $this->randCode[$i], $randColor);
     }
  }
  //产生验证码
  private function getRandStr($strLength = 4,$strMode = 3)
  {
     $strLength=$this->codeLength;
     switch($strMode)
     {
      case '1':
       $str = '1234567890';
       break;
      case '2':
       $str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
       break;
      case '3':
       $str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890';
       break;
     }
     $result =   '';
     $str_length = strlen($str)-1;
     for($i = 0;$i< $strLength;$i++)
     {
      $num = rand(0,$str_length);
      $result .= $str[$num];
     }
     $this->randCode=$result;
     return $result;
  }
  function __destruct()
  {
     unset($this->codeLength,$this->imageHeight,$this->imageWidth,$this->imageBoder);
  }
}
/**
session_start();
  include('class/randcode.php');
  $codeLength=4;//生成的验证码的长度
  $codeSize=5; //生成的验证码的字体大小
  $imageHeight=20;//图片的高度
  $imageWidth=50;//图片的宽度
  $imageBoder=true;//图片是否需要边框
  $obj=new Randcode($codeLength,$codeSize,$imageHeight,$imageWidth,$imageBoder);
  $obj->outImg();
  $_SESSION['PASSCODE']=$obj->randCode;
    

*/
Mar 24
1.当遇到gb2312出错时
方法1:用GBK代替gb2312
$text=iconv("UTF-8","GBK",$text);

方法2:加错误忽略 //IGNORE
iconv("UTF-8","GB2312//IGNORE",$data);

2.当遇到utf-8截取出错
$str=iconv('utf-8',"gb2312//TRANSLIT",$str);

手册上说:

<?php
$string = "ʿABBĀSĀBĀD";

echo iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $string);
// output: [nothing, and you get a notice]

echo iconv('UTF-8', 'ISO-8859-1//IGNORE', $string);
// output: ABBSBD

echo iconv('UTF-8', 'ISO-8859-1//TRANSLIT//IGNORE', $string);
// output: ABBASABAD
// Yay! That's what I wanted!

?>


明白了吗?
分页: 1/10 第一页 1 2 3 4 5 6 7 8 9 10 下页 最后页 [ 显示模式: 摘要 | 列表 ]