PHP操作MongoDB配置与学习笔记

 更新时间:2016年11月25日 16:22  点击:1637
PHP操作MongoDB配置与学习笔记有需要的朋友可参考参考。Mongo主要解决的是海量数据的访问效率问题,根据官方的文档,当数据量达到50GB以上的时候,Mongo的数据库访问速度是MySQL的 10倍以上

2,安装(windows only)
到官网下载对应的包
解压到d:mongodb
创建d:mongodbdata放置数据文件

3,运行mongodb
d:mongodbbin下有一些可执行文件,其中mongod.exe是服务器端,mongo.exe是客户端。
运行cmd,输入
d:mongodbbin>mongod.exe -dbpath d:mongodbdata
服务器成功启动

4,让php支持MongoDB
下载php_mongo.dll,注意版本,php5.3.x应该支持v9的(有些老资料让apache的下v6,其实要看看phpinfo后下载对应的版本);
修改php.ini,增加 extension = php_mongo.dll;
重启apache.

 

 代码如下 复制代码

<?php
/**
 * PHP操作MongoDB学习笔记
 * 2011年2月23日
 * 原作者:xiaocai
 */

//*************************
//**    连接MongoDB数据库服务器
//*************************

//格式=>("mongodb://用户名:密码@地址:端口/默认指定数据库",参数)
$conn = new Mongo();
//可以简写为
//$conn=new Mongo();                                            #连接本地主机,默认端口.
//$conn=new Mongo("172.21.15.69");                              #连接远程主机
//$conn=new Mongo("xiaocai.loc:10086");                         #连接指定端口远程主机
//$conn=new Mongo("xiaocai.loc",array("replicaSet"=>true));     #负载均衡
//$conn=new Mongo("xiaocai.loc",array("persist"=>"t"));         #持久连接
//$conn=new Mongo("mongodb://sa:123@localhost");                #带用户名密码
//$conn=new Mongo("mongodb://localhost:27017,localhost:27018"); #连接多个服务器
//$conn=new Mongo("mongodb:///tmp/mongo-27017.sock");           #域套接字
//$conn=new Mongo("mongodb://admin_miss:miss@localhost:27017/test",array('persist'=>'p',"replicaSet"=>true));   #完整

 

//*************************
//**    选择数据库与表      
//*************************

$db=$conn->mydb;                                #选择mydb数据库
//$db=$conn->selectDB("mydb");                  #第二种写法

$collection=$db->column;                        #选择集合(选择'表')
//$collection=$db->selectCollection('column');  #第二种写法
//$collection=$conn->mydb->column;              #更简洁的写法

//注意:
// 1.数据库和集合不需要事先创建,若它们不存在则会自动创建它们.
// 2.注意错别字,你可能会无意间的创建一个新的数据库(与原先的数据库混乱).

 

   
//*************************
//**    插入文档        
//*************************

//**向集合中插入数据,返回bool判断是否插入成功. **/
$array=array('column_name'=>'col'.rand(100,999),'column_exp'=>'xiaocai');
$result=$collection->insert($array);        #简单插入
echo "新记录ID:".$array['_id'];              #MongoDB会返回一个记录标识
var_dump($result);                          #返回:bool(true)
#插入结果:{ "_id" : ObjectId("4d63552ad549a02c01000009"), "column_name" : "col770", "column_exp" : "xiaocai" }
#'_id'为主键字段,在插入是MongoDB自动添加.

//**向集合中安全插入数据,返回插入状态(数组). **/
$array=array('column_name'=>'col'.rand(100,999),'column_exp'=>'xiaocai2');
$result=$collection->insert($array,true);   #用于等待MongoDB完成操作,以便确定是否成功.(当有大量记录插入时使用该参数会比较有用)
echo "新记录ID:".$array['_id'];              #MongoDB会返回一个记录标识
var_dump($result);                          #返回:array(3) { ["err"]=> NULL ["n"]=> int(0) ["ok"]=> float(1) }
   
//**插入的完整语法 **/
# insert(array $data,array('safe'=>false,'fsync'=>false,'timeout'=>10000))
# 参数说明:safe:默认false,是否安全写入;fsync:默认false,是否强制插入到同步到磁盘;timeout:超时时间(毫秒)

//**以下两次插入的为同一条记录(相同的_id),因为它们的值相同**/
$collection->insert(array('column_name'=>'xiaocai'));
$collection->insert(array('column_name'=>'xiaocai'));
#避免方法,安全插入
$collection->insert(array('column_name'=>'xiaocai'),true);
 try {
     $collection->insert(array('column_name'=>'xiaocai'),true);
}catch(MongoCursorException $e){
    echo "Can't save the same person twice!n";
}
//详细资料:http://www.php.net/manual/zh/mongocollection.insert.php

 

   
//*************************
//**    更新文档           
//*************************

//** 修改更新 **/
$where=array('column_name'=>'col123');
$newdata=array('column_exp'=>'GGGGGGG','column_fid'=>444);
$result=$collection->update($where,array('$set'=>$newdata));  #$set:让某节点等于给定值
/*
 * 原数据
 * {"_id":ObjectId("4d635ba2d549a02801000003"),"column_name":"col123","column_exp":"xiaocai"}
 * 被替换成了
 * {"_id":ObjectId("4d635ba2d549a02801000003"),"column_name":"col123","column_exp":"GGGGGGG","column_fid":444}
 */

//** 替换更新 **/
$where=array('column_name'=>'col709');
$newdata=array('column_exp'=>'HHHHHHHHH','column_fid'=>123);
$result=$collection->update($where,$newdata);
/*
 * 原数据
 * {"_id":ObjectId("4d635ba2d549a02801000003"),"column_name":"col709","column_exp":"xiaocai"}
 * 被替换成了
 * {"_id":ObjectId("4d635ba2d549a02801000003"),"column_exp":"HHHHHHHHH","column_fid":123}
 */

//** 批量更新 **/
$where=array('column_name'=>'col');
$newdata=array('column_exp'=>'multiple','91u'=>684435);
$result=$collection->update($where,array('$set'=>$newdata),array('multiple'=>true));
/**
 * 所有'column_name'='col'都被修改
 */

//** 自动累加 **/
$where=array('91u'=>684435);
$newdata=array('column_exp'=>'edit');
$result=$collection->update($where,array('$set'=>$newdata,'$inc'=>array('91u'=>-5)));
/**
 * 更新91u=684435的数据,并且91u自减5
 * 注意:91u存在时加上-5,不存在时就设置91u=-5
 */

//**  匹配到就更新,否则新增  **/
 $c->update(
    array("name" => "joe"),
    array("username" => "joe312", "createdAt" => new MongoDate()),
    array("upsert" => true) #up(date)(in)sert
);

/** 删除节点 **/
$where=array('column_name'=>'col685');
$result=$collection->update($where,array('$unset'=>'column_exp'));
/**
 * 删除节点column_exp
 */

/** 附加新数据到节点 **/
$coll->update(
    array('b'=>1),
    array('$push'=>array('a'=>'wow')) #附加新数据到节点a
);
# 如果对应节点是个数组,就附加一个新的值上去;不存在,就创建这个数组,并附加一个值在这个数组上;
# 如果该节点不是数组,返回错误。
# 原纪录:array('a'=>array(0=>'haha'),'b'=>1)
# 新记录为:array('a'=>array(0=>'haha',1=>'wow'),'b'=>1)
# $pushAll与$push类似,只是会一次附加多个数值到某节点

/** 判断更新 **/
$coll->update(
    array('b'=>1),
    array('$addToSet'=>array('a'=>'wow'))
);
# 如果该阶段的数组中没有某值,就添加之
# 设记录结构为array('a'=>array(0=>'haha'),'b'=>1)
# 如果在a节点中已经有了wow,那么就不会再添加新的,
# 如果没有,就会为该节点添加新的item——wow。

/** 删除某数组节点的最后一个元素 **/
$coll->update(
    array('b'=>1),
    array('$pop'=>array('a'=>1)) #删除a数组节点的最后一个元素
);

/** 删除某数组节点的第一个元素 **/
$coll->update(
    array('b'=>1),
    array('$pop'=>array('a'=>-1))  #删除a数组节点的第一个元素
);

/** 删除某数组节点的元素 **/
$coll->update(
    array('b'=>1),
    array('$pull'=>array('a'=>'haha'))
)
# 如果该节点是个数组,那么删除其值为value的子项,如果不是数组,会返回一个错误。
# 原记录为:array('a'=>array(0=>'haha',1=>'wow'),'b'=>1),
# 删除a中value为haha的子项
# 结果为: array('a'=>array(0=>'wow'),'b'=>1)
# $pullAll与$pull类似,只是可以删除一组符合条件的记录。

# 注意:
# 1.注意区分替换更新与修改更新
# 2.注意区分数据类型如 array('91u'=>'684435')与array('91u'=>684435)
   
//*************************
//**    删除文档        
//*************************

/** 删除 **/
$collection->remove(array('column_name'=>'col399'));
//$collection->remove();                #清空集合
//$collection->drop();                  #清空,效率高于remove()


/** 删除指定MongoId **/
$id = new MongoId("4d638ea1d549a02801000011");
$collection->remove(array('_id'=>(object)$id));
/*
 * *
 *  使用下面的方法来匹配{"_id":ObjectId("4d638ea1d549a02801000011")},查询、更新也一样
 *  $id = new MongoId("4d638ea1d549a02801000011");
 *  array('_id'=>(object)$id)
 * *
 */

 


//*************************
//**    查询文档        
//*************************

/** 查询文档中的记录数 **/
echo 'count:'.$collection->count()."<br>";                                          #全部
echo 'count:'.$collection->count(array('type'=>'user'))."<br>";                     #可以加上条件
echo 'count:'.$collection->count(array('age'=>array('$gt'=>50,'$lte'=>74)))."<br>"; #大于50小于等于74
echo 'count:'.$collection->find()->limit(5)->skip(0)->count(true)."<br>";           #获得实际返回的结果数

/**
 * 注:$gt为大于、$gte为大于等于、$lt为小于、$lte为小于等于、$ne为不等于、$exists不存在
 */

/** 集合中所有文档 **/
$cursor = $collection->find()->snapshot();
foreach ($cursor as $id => $value) {
    echo "$id: "; var_dump($value); echo "<br>";    
}
/**
 * 注意:
 *      在我们做了find()操作,获得$cursor游标之后,这个游标还是动态的.
 *      换句话说,在我find()之后,到我的游标循环完成这段时间,如果再有符合条件的记录被插入到collection,那么这些记录也会被$cursor获得.
 *      如果你想在获得$cursor之后的结果集不变化,需要这样做:
 *      $cursor = $collection->find();
 *      $cursor->snapshot();#获得快照!
 *      详见http://www.bumao.com/index.php/2010/08/mongo_php_cursor.html
 */

/** 查询一条数据 **/
$cursor = $collection->findOne();
/**
 *  注意:findOne()获得结果集后不能使用snapshot(),fields()等函数;
 */

/** age,type 列不显示 **/
$cursor = $collection->find()->fields(array("age"=>false,"type"=>false));

/** 只显示user 列 **/
$cursor = $collection->find()->fields(array("user"=>true));
/**
 * 我这样写会出错:$cursor->fields(array("age"=>true,"type"=>false));
 */

/** (存在type,age节点) and age!=0 and age<50 **/
$where=array('type'=>array('$exists'=>true),'age'=>array('$ne'=>0,'$lt'=>50,'$exists'=>true));
$cursor = $collection->find($where);

/** 分页获取结果集  **/
$cursor = $collection->find()->limit(5)->skip(0);

/** 排序  **/
$cursor = $collection->find()->sort(array('age'=>-1,'type'=>1));                    #1表示降序 -1表示升序,参数的先后影响排序顺序

/** 创建索引  **/
$collection->ensureIndex(array('age' => 1,'type'=>-1));                             #1表示降序 -1表示升序
$collection->ensureIndex(array('age' => 1,'type'=>-1),array('background'=>true));   #索引的创建放在后台运行(默认是同步运行)
$collection->ensureIndex(array('age' => 1,'type'=>-1),array('unique'=>true));       #该索引是唯一的

/** 取得查询结果 **/
$cursor = $collection->find();
$array=array();
foreach ($cursor as $id => $value) {
   $array[]=$value;
}

要删除目录我们必须先删除目录中的文件才行,在php中删除文件很简单unlink(),删除空目录使用rmdir即可。

例1

 代码如下 复制代码

function del_dir($dir){
{
if (!$dir) { return ; }
$cacheDir = $dir;
$dh = opendir($cacheDir);
while ( $file = readdir($dh) ) {

if (($file == '.') || ($file == '..')) { continue; }

if (file_exists( $cacheDir .'/'.$file)) {
if(is_dir( $cacheDir .'/'.$file)){
del_dir($cacheDir .'/'.$file);
}elseif (!unlink($cacheDir .'/'. $file)) {

//删除完操作
}
}
}
}
}

例2

 代码如下 复制代码

<?
function deldir($dir) {
  //先删除目录下的文件:
  $dh=opendir($dir);
  while ($file=readdir($dh)) {
    if($file!="." && $file!="..") {
      $fullpath=$dir."/".$file;
      if(!is_dir($fullpath)) {
          unlink($fullpath);
      } else {
          deldir($fullpath);
      }
    }
  }
 
  closedir($dh);
  //删除当前文件夹:
  if(rmdir($dir)) {
    return true;
  } else {
    return false;
  }
}

?>

例3

 代码如下 复制代码

function removeDir($dirName)
{
     if(!is_dir($dirName)) //如果传入的参数不是目录,则为文件,应将其删除
     {
     @unlink($dirName);//删除文件
       return false;
     }
     $handle = @opendir($dirName); //如果传入的参数是目录,则使用opendir将该目录打开,将返回的句柄赋值给$handle
     while(($file = @readdir($handle)) !== false) //这里明确地测试返回值是否全等于(值和类型都相同)FALSE,否则任何目录项的名称求值为 FALSE 的都会导致循环停止(例如一个目录名为“0”)。
     {
         if($file!='.'&&$file!='..') //在文件结构中,都会包含形如“.”和“..”的向上结构,但是它们不是文件或者文件夹
         {
         $dir = $dirName . '/' . $file; //当前文件$dir为文件目录+文件
         is_dir($dir)?removeDir($dir):@unlink($dir); //判断$dir是否为目录,如果是目录则递归调用reMoveDir($dirName)函数,将其中的文件和目录都删除;如果不是目录,则删除该文件
         }
     }
     closedir($handle);
     
     return rmdir($dirName) ;
}

例4
删除几天前创建的目录

 代码如下 复制代码

<?php
function delfile($dir,$n) //删除DIR路径下N天前创建的所有文件;
{
if(is_dir($dir))
  {
 if($dh=opendir($dir))
   {
    while (false !== ($file = readdir($dh)))
    {
     if($file!="." && $file!="..")
     {
       $fullpath=$dir."/".$file;
       if(!is_dir($fullpath))
       {           
        $filedate=date("Y-m-d", filemtime($fullpath));
        $d1=strtotime(date("Y-m-d"));
        $d2=strtotime($filedate);
        $Days=round(($d1-$d2)/3600/24);
        if($Days>$n)
        unlink($fullpath);  ////删除文件
  
         }
     }     
    }
   }
   closedir($dh);
 }
}
?>

给图片加水印是php程序中一个常用的并且很实用的功能,下面我来给大家详细介绍php中png透明背景水印程序代码吧 。
 代码如下 复制代码

//原始图像

$dst = "/upload/20120914/20120914040740-0.jpg"; //注意图片路径要正确

//得到原始图片信息

$dst_info = getimagesize($dst); 

switch ($dst_info[2])

{

case 1:

$dst_im =imagecreatefromgif($dst);break;

case 2:

$dst_im =imagecreatefromjpeg($dst);break;

case 3:

$dst_im =imagecreatefrompng($dst);break;

case 6:

$dst_im =imagecreatefromwbmp($dst);break;

default:

die("不支持的文件类型1");exit;

}

//水印图像

$src = "/images/shuiyin.png"; //注意路径要写对

$src_info = getimagesize($src);

switch ($src_info[2])

{

case 1:

$src_im =imagecreatefromgif($src);break;

case 2:

$src_im =imagecreatefromjpeg($src);break;

case 3:

$src_im =imagecreatefrompng($src);break;

case 6:

$src_im =imagecreatefromwbmp($src);break;

default:

die("不支持的文件类型1");exit;

}

 

//半透明格式水印

//$alpha = 50;//水印透明度

//imagecopymerge($dst_im,$src_im,$dst_info[0]-$src_info[0]-10,$dst_info[1]-$src_info[1]-

10,0,0,$src_info[0],$src_info[1],$alpha);

 

//支持png本身透明度的方式

imagecopy($dst_im,$src_im,$dst_info[0]-$src_info[0]-10,$dst_info[1]-$src_info[1]-10,0,0,$src_info

[0],$src_info[1]);

 

//保存图片

switch ($dst_info[2]){

case 1:

imagegif($dst_im,$dst);break;

case 2:

imagejpeg($dst_im,$dst);break;

case 3:

imagepng($dst_im,$dst);break;

case 6:

imagewbmp($dst_im,$dst);break;

default:

die("不支持的文件类型2");exit;

}

imagedestroy($dst_im);

imagedestroy($src_im); 


给一个标准的图片水印类

 代码如下 复制代码

在网上找的水印代码:
/*
* 功能:PHP图片水印 (水印支持图片或文字)
* 参数:
*      $product_img    背景图片,即需要加水印的图片,暂只支持GIF,JPG,PNG格式;
*      $waterPos        水印位置,有10种状态,0为随机位置;
*                        1为顶端居左,2为顶端居中,3为顶端居右;
*                        4为中部居左,5为中部居中,6为中部居右;
*                        7为底端居左,8为底端居中,9为底端居右;
*      $waterImage        图片水印,即作为水印的图片,暂只支持GIF,JPG,PNG格式;
*      $waterText        文字水印,即把文字作为为水印,支持ASCII码,不支持中文;
*      $textFont        文字大小,值为1、2、3、4或5,默认为5;
*      $textColor        文字颜色,值为十六进制颜色值,默认为#FF0000(红色);
*
* 注意:Support GD 2.0,Support FreeType、GIF Read、GIF Create、JPG 、PNG
*      $waterImage 和 $waterText 最好不要同时使用,选其中之一即可,优先使用 $waterImage。
*      当$waterImage有效时,参数$waterString、$stringFont、$stringColor均不生效。
*      加水印后的图片的文件名和 $product_img 一样。
* 作者:longware @ 2004-11-3 14:15:13
*/
function imageWaterMark

($product_img,$waterPos=0,$waterImage="",$waterText="",$textFont=5,$textColor="#FF0000")
{
    $isWaterImage = FALSE;
    $formatMsg = "暂不支持该文件格式,请用图片处理软件将图片转换为GIF、JPG、PNG格式。";
    //读取水印文件
    if(!empty($waterImage) && file_exists($waterImage))
    {
        $isWaterImage = TRUE;
        $water_info = getimagesize($waterImage);
        $water_w    = $water_info[0];//取得水印图片的宽
        $water_h    = $water_info[1];//取得水印图片的高
        switch($water_info[2])//取得水印图片的格式
        {
            case 1water_im = imagecreatefromgif($waterImage);break;
            case 2water_im = imagecreatefromjpeg($waterImage);break;
            case 3water_im = imagecreatefrompng($waterImage);break;
            default:die($formatMsg);
        }
    }
    //读取背景图片
    if(!empty($product_img) && file_exists($product_img))
    {
        $ground_info = getimagesize($product_img);
        $ground_w    = $ground_info[0];//取得背景图片的宽
        $ground_h    = $ground_info[1];//取得背景图片的高
        switch($ground_info[2])//取得背景图片的格式
        {
            case 1:$ground_im = imagecreatefromgif($product_img);break;
            case 2:$ground_im = imagecreatefromjpeg($product_img);break;
            case 3:$ground_im = imagecreatefrompng($product_img);break;
            default:die($formatMsg);
        }
    }
    else
    {
        die("需要加水印的图片不存在!");
    }
    //水印位置
    if($isWaterImage)//图片水印
    {
        $w = $water_w;
        $h = $water_h;
        $label = "图片的";
    }
    else//文字水印
    {
        $temp = imagettfbbox(ceil($textFont*2.5),0,"arial.ttf",$waterText);//取得使用 TrueType 字体的文

本的范围
        $w = $temp[2] - $temp[6];
        $h = $temp[3] - $temp[7];
        unset($temp);
        $label = "文字区域";
    }
    if( ($ground_w<$w) || ($ground_h<$h) )
    {
        echo "需要加水印的图片的长度或宽度比水印".$label."还小,无法生成水印!";
        return;
    }
    switch($waterPos)
    {
        case 0://随机
            $posX = rand(0,($ground_w - $w));
            $posY = rand(0,($ground_h - $h));
            break;
        case 1://1为顶端居左
            $posX = 0;
            $posY = 0;
            break;
        case 2://2为顶端居中
            $posX = ($ground_w - $w) / 2;
            $posY = 0;
            break;
        case 3://3为顶端居右
            $posX = $ground_w - $w;
            $posY = 0;
            break;
        case 4://4为中部居左
            $posX = 0;
            $posY = ($ground_h - $h) / 2;
            break;
        case 5://5为中部居中
            $posX = ($ground_w - $w) / 2;
            $posY = ($ground_h - $h) / 2;
            break;
        case 6://6为中部居右
            $posX = $ground_w - $w;
            $posY = ($ground_h - $h) / 2;
            break;
        case 7://7为底端居左
            $posX = 0;
            $posY = $ground_h - $h;
            break;
        case 8://8为底端居中
            $posX = ($ground_w - $w) / 2;
            $posY = $ground_h - $h;
            break;
        case 9://9为底端居右
            $posX = $ground_w - $w;
            $posY = $ground_h - $h;
            break;
        default://随机
            $posX = rand(0,($ground_w - $w));
            $posY = rand(0,($ground_h - $h));
            break;    
    }
    //设定图像的混色模式
    imagealphablending($ground_im, true);
    if($isWaterImage)//图片水印
    {
        imagecopy($ground_im, $water_im, $posX, $posY, 0, 0, $water_w,$water_h);//拷贝水印到目标文件   

    
    }
    else//文字水印
    {
        if( !empty($textColor) && (strlen($textColor)==7) )
        {
            $R = hexdec(substr($textColor,1,2));
            $G = hexdec(substr($textColor,3,2));
            $B = hexdec(substr($textColor,5));
        }
        else
        {
            die("水印文字颜色格式不正确!");
        }
        imagestring ( $ground_im, $textFont, $posX, $posY, $waterText, imagecolorallocate($ground_im,

$R, $G, $B));        
    }
    //生成水印后的图片
    @unlink($product_img);
    switch($ground_info[2])//取得背景图片的格式
    {
        case 1:imagegif($ground_im,$product_img);break;
        case 2:imagejpeg($ground_im,$product_img);break;
        case 3:imagepng($ground_im,$product_img);break;
        default:die($errorMsg);
    }
    //释放内存
    if(isset($water_info)) unset($water_info);
    if(isset($water_im)) imagedestroy($water_im);
    unset($ground_info);
    imagedestroy($ground_im);
}

//---------------------------------------------------------------------------------------
if(isset($_FILES) && !empty($_FILES['userfile']) && $_FILES['userfile']['size']>0)
{
    $uploadfile = "./".time()."_".$_FILES['userfile']['name'];
    if (copy($_FILES['userfile']['tmp_name'], $uploadfile))
    {
        echo "OK<br>";
        //文字水印
        imageWaterMark($uploadfile,0,"",http://www.111cn.net,5,"#FF0000");
        //图片水印
        //$waterImage="images/bz.gif";//水印图片路径
        //imageWaterMark($uploadfile,0,$waterImage);
        echo "<img src="".$uploadfile."" border="0">";
    }
    else
    {
        echo "Fail<br>";
    }
}

在php中采集我们用的是简单的采集方式(例如file_get_contents)就无法做到了,但是如果想模拟登录用户并采集利用它就没办法了,我们可利用CURL函数来实现模拟登录并采集数据

这里要说一些,默认情况下,PHP的CURL功能是没有开启的,所以你要自己去开启这个功能,需要在php.ini中把  ;extension= php_curl.dll 前面的  " ; " 号去掉!!!
  好,我讲讲昨天晚上的程序吧,虽然最后没有成功,但是还是学习到一些东西的。
 

 代码如下 复制代码

$login="http://www.phpyu.com/index.php?action=login";
$post_file="user=××&pw=××";
$cookie_file    =    tempnam('./temp','cookie'); 

/////创建一个具有唯一文件名的临时文件。 若成功,则该函数返回新的临时文件名。若失败,则返回 false。

 代码如下 复制代码

$ch=curl_init($login_url); /////初始化一个CURL对象
curl_setopt($ch,CURLOPT_HEADER,0);

  //如果你想把一个头包含在输出中,设置这个选项为一个非零值。

 代码如下 复制代码

curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); ///设置不输出在浏览器上
curl_setopt($ch,CURLOPT_POST,1);

 /////如果你想PHP去做一个正规的HTTP POST,设置这个选  项为一个非零值。这个POST是普通的 application/x-www-from-urlencoded 类型,多数被HTML表单使用。

 代码如下 复制代码

curl_setopt($ch,CURLOPT_POSTFIELDS,$post_file);  ////传递一个作为HTTP "POST"操作的所有数据的字符串。
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);  /////把返回来的cookie信息保存在$cookie_jar文件中
curl_exec($ch);///执行
curl_close($ch);////关闭


上面已经完成了模拟登录的过程
 

下面要做的就是进入具有权限的页面了,要记得你现在已经登录了,你应该把登录的凭证cookie保存了起来。

 代码如下 复制代码

$url="http://www.phpyu.com/admin/××";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);

////把这个页面显示在浏览器上,这里要特别注意!!就是如果把它显示在浏览器上的时候 下面的$contents 就会变成 一个布尔类型 true

 代码如下 复制代码

curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
$contents = curl_exec($ch);

例2

 代码如下 复制代码

<?php
        $cookie_path = './'; //设置cookie保存路径


        //-----登录要提交的表单数据---------------
        $vars['username'] = '张三';
         $vars['pwd'] = '123';
         //-------------------------------------
        $method_post = true;
        //登录提交的url地址(表单中的action的绝对地址)
         $url = 'http://****.com/login';
        //----------------------------


         $ch = curl_init();
        $params[CURLOPT_URL] = $url;    //请求url地址
        $params[CURLOPT_HEADER] = true; //是否返回响应头信息
        $params[CURLOPT_RETURNTRANSFER] = true; //是否将结果返回
        $params[CURLOPT_FOLLOWLOCATION] = true; //是否重定向
        $params[CURLOPT_USERAGENT] = 'Mozilla/5.0 (Windows NT 5.1; rv:9.0.1) Gecko/20100101 Firefox/9.0.1';
   
        $postfields = '';
        foreach ($vars as $key => $value){
            $postfields .= urlencode($key) . '=' . urlencode($value) . '&'; 
        }
       
        $params[CURLOPT_POST] = true;
        $params[CURLOPT_POSTFIELDS] = $postfields;
       
        //判断是否有cookie,有的话直接使用
        if (isset($_COOKIE['cookie_jar']) && ($_COOKIE['cookie_jar'] || is_file($_COOKIE['cookie_jar'])))
        {
            $params[CURLOPT_COOKIEFILE] = $_COOKIE['cookie_jar']; //这里判断cookie
        }
        else
        {
            $cookie_jar = tempnam($cookie_path, 'cookie'); //产生一个cookie文件
            $params[CURLOPT_COOKIEJAR] = $cookie_jar; //写入cookie信息
            setcookie('cookie_jar', $cookie_jar); //保存cookie路径
        }
        curl_setopt_array($ch, $params); //传入curl参数
        $content = curl_exec($ch); //执行


        echo '
';        echo $content; //输出登录结果
        /*
        //---------登录成功后再次请求其他地址,如果有多个可以循环执行---------
        echo '
--------------------------------------------------------------------------------
 ';
        $nexturl = 'http://****.com/test';
        $params[CURLOPT_URL] = $nexturl;
        $params[CURLOPT_POSTFIELDS] = '';
        curl_setopt_array($ch, $params); //传入curl参数
        $content = curl_exec($ch); //执行
        echo $content; //输出请求结果
        //-------------------------------------------------
        */
        curl_close($ch); //关闭连接
       
?>

注:如果遇到无法请求https站点的情况,可能是因为无法验证证书或者域名,只要在curl_setopt_array前增加以下两项就可以了:

 代码如下 复制代码

$params[CURLOPT_SSL_VERIFYPEER] = false;

$params[CURLOPT_SSL_VERIFYHOST] = false;

 代码如下 复制代码

 

/*
  * 使用POI读取EXCEL文件
  */
 import java.io.File;
 import java.io.FileInputStream;
 import java.util.ArrayList;
 
 import org.apache.poi.hssf.usermodel.HSSFCell;
 import org.apache.poi.hssf.usermodel.HSSFRow;
 import org.apache.poi.hssf.usermodel.HSSFSheet;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 
 /**
  *
  * @author Hanbin
  */
 public class ReadExcel {
 
     /**
      * @param args the command line arguments
      */
     public static void main(String[] args)throws Exception {
         read("d:\demo.xls");
     }
    
     public static ArrayList read(String fileName){
         ArrayList list = new ArrayList();
         String sql = "";
         try{
             File f = new File(fileName);
             FileInputStream fis = new FileInputStream(f);
             HSSFWorkbook wbs = new HSSFWorkbook(fis);
             HSSFSheet childSheet = wbs.getSheetAt(0);
             System.out.println("行数:" + childSheet.getLastRowNum());
             for(int i = 4;i<childSheet.getLastRowNum();i++){
                 HSSFRow row = childSheet.getRow(i);
                 System.out.println("列数:" + row.getPhysicalNumberOfCells());
                 if(null != row){
                     for(int k=1;k<row.getPhysicalNumberOfCells();k++){
                         HSSFCell cell;
                         cell = row.getCell((short)k);
                        // System.out.print(getStringCellValue(cell) + "t");
                         list.add(getStringCellValue(cell) + "t");
                     }
                 }
             }
         }catch(Exception e){
             e.printStackTrace();
         }
         return list;
     }
     /**
      * 获取单元格数据内容为字符串类型的数据
      *
      * @param cell Excel单元格
      * @return String 单元格数据内容
      */
     private static String getStringCellValue(HSSFCell cell) {
         String strCell = "";
         switch (cell.getCellType()) {
         case HSSFCell.CELL_TYPE_STRING:
             strCell = cell.getStringCellValue();
             break;
         case HSSFCell.CELL_TYPE_NUMERIC:
             strCell = String.valueOf(cell.getNumericCellValue());
             break;
         case HSSFCell.CELL_TYPE_BOOLEAN:
             strCell = String.valueOf(cell.getBooleanCellValue());
             break;
         case HSSFCell.CELL_TYPE_BLANK:
             strCell = "";
             break;
         default:
             strCell = "";
             break;
         }
         if (strCell.equals("") || strCell == null) {
             return "";
         }
         if (cell == null) {
             return "";
         }
         return strCell;
     }
 }

[!--infotagslink--]

相关文章

  • IntelliJ IDEA2021.1 配置大全(超详细教程)

    这篇文章主要介绍了IntelliJ IDEA2021.1 配置大全(超详细教程),需要的朋友可以参考下...2021-04-18
  • PHP添加MongoDB扩展实例教程

    由于要使用mikoomi mongodb plugin插件,所以需要php对mongodb的扩展支持,默认通过源安装的php并没有mongodb的扩展支持,具体可以通过php -m|grep mongo 验证 。这里就结...2016-11-25
  • Windows VPN服务器配置图文教程 超详细版

    VPN可以虚拟出一个专用网络,让远处的计算机和你相当于处在同一个局域网中,而中间的数据也可以实现加密传输,用处很大,特别是在一些大公司,分公司处在不同的区域。...2016-01-27
  • Tomcat配置及如何在Eclipse中启动

    这篇文章主要介绍了Tomcat配置及如何在Eclipse中启动,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-02-04
  • Laravel4安装配置的方法

    如果我们需要安培Laravel4的话最php最低要求要在php5.3.7版本并且我们需要把mcrypt与openss这两个扩展开启才可以,具体步骤我们参考下文。 前面我们介绍我了 com...2016-11-25
  • 详解Maven profile配置管理及激活profile的几种方式

    这篇文章主要介绍了详解Maven profile配置管理及激活profile的几种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-01-26
  • IDEA如何添加配置文件到classpath中

    这篇文章主要介绍了IDEA如何添加配置文件到classpath中,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-19
  • 查找php配置文件php.ini所在路径的二种方法

    通常php.ini的位置在:复制代码 代码如下:/etc目录下或/usr/local/lib目录下。如果你还是找不到php.ini或者找到了php.ini修改后不生效(其实是没找对),请使用如下办法:1.新建php文件,写入如下代码复制代码 代码如下:<?phpe...2014-05-31
  • 部署PHP时的4个配置修改说明

    以下就是部署PHP时的4个配置修改说明,大家一个一个进行学习研究。1、short_open_tag 是什么呢? 决定是否允许使用代码开始标志的缩写形式(<&#63; &#63;> )。如果要和 XML 结合使用PHP,可以禁用此选项以便于嵌入使用<&#63;x...2015-10-21
  • Vue-Router的routes配置详解

    在使用vue-router的项目中,实例化VueRouter是其配置选项routes该选项指定路由与视图的组件的关系或者路由与其他路由的关系,Router配置选项中是其中最重要的配置。本文就详细的介绍一下...2021-10-25
  • 华为畅享20Pro配置怎么样?华为畅享20Pro参数配置分析

    华为畅享20Pro配置怎么样?对于即将上市的华为畅享20 Pro手机,很多的网友们也是相当关注的,大家都想要知道这款华为畅享20 Pro手机的配置到底怎么样,赶紧看看吧...2020-06-29
  • 配置vue全局方法的两种方式实例

    vue项目中有一些方法需要在多个页面调用,但为了避免在每个页面都import进来,可以把方法加到原型上去,这样在每个组件中都能使用了,下面这篇文章主要给大家介绍了关于配置vue全局方法的两种方式,需要的朋友可以参考下...2021-09-13
  • 安装使用Mongoose配合Node.js操作MongoDB的基础教程

    这篇文章主要介绍了安装使用Mongoose来让Node.js操作MongoDB的基础教程,前端js+后端node+js操作MongoDB正是所谓最流行的一种JavaScript全栈开发方案,需要的朋友可以参考下...2016-03-03
  • php上传图片学习笔记与心得

    我们在php中上传文件就必须使用#_FILE变量了,这个自动全局变量 $_FILES 从 PHP 4.1.0 版本开始被支持。在这之前,从 4.0.0 版本开始,PHP 支持 $HTTP_POST_FILES 数组。这...2016-11-25
  • Smarty模板学习笔记之Smarty简介

    1、简介Smarty是一个使用PHP写出来的模板PHP模板引擎,是目前业界最著名的PHP模板引擎之一。它分离了逻辑代码和外在的内容,提供了一种易于管理和使用的方法,用来将原本与HTML代码混杂在一起PHP代码逻辑分离。简单的讲,目...2014-05-31
  • 详解element-ui 表单校验 Rules 配置 常用黑科技

    这篇文章主要介绍了element-ui 表单校验 Rules 配置 常用黑科技,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-07-11
  • mongodb与mysql命令详细对比

    传统的关系数据库一般由数据库(database)、表(table)、记录(record)三个层次概念组成,MongoDB是由数据库(database)、集合(collection)、文档对象(document)三个层次组成。MongoDB对于关系型数据库里的表,但是集合中没有列、行和关...2013-09-11
  • tomcat9 下载安装和配置+整合到eclipse的教程详解

    这篇文章主要介绍了tomcat9 下载安装和配置+整合到eclipse,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-07-28
  • 修复 Mac brew 安装 mongodb 报 Error: No available formula with the name ‘mongodb’ 问题详解

    最近在同事新的 Mac 电脑上安装 mongodb,报了错误 Error: No available formula with the name ‘mongodb’,今天就说说这个问题如何解决,需要的朋友可以参考下...2020-07-11
  • pytest配置文件pytest.ini的详细使用

    这篇文章主要介绍了pytest配置文件pytest.ini的详细使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-04-17