php通过curl函数取得数据、模拟登陆、POST数据

 更新时间:2016年11月25日 16:46  点击:1431
费话不说多在php中我们如果要取得数据、模拟登陆、POST数据等功能第一个想到的肯定是curl函数了,这个函数方便实用并且还可以多线程了下面整理了一个例子,有兴趣的朋友可参考。

例子,使用php curl获取网页数据的方法:

 代码如下 复制代码

$ch=curl_init();
//设置选项,包括URL
curl_setopt($ch,CURLOPT_URL,"http://www.111cn.net");
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_HEADER,0);
//执行并获取HTML文档内容
$output=curl_exec($ch);
//释放curl句柄
curl_close($ch);


使用php curl post提交数据的方法

 代码如下 复制代码

$url="http://www.111cn.net/ curl_post.php";
$post_data=array (
 "nameuser"=>"syxrrrr",
 "pw"=>"123456"
);
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$post_data);
$output=curl_exec($ch);
curl_close($ch);
echo $output;

取得数据、模拟登陆、POST数据

 代码如下 复制代码

/********************** curl 系列 ***********************/
//直接通过curl方式取得数据(包含POST、HEADER等)
/*
 * $url: 如果非数组,则为http;如是数组,则为https
 * $header: 头文件
 * $post: post方式提交 array形式
 * $cookies: 0默认无cookie,1为设置,2为获取
 */
public function curl_allinfo($urls, $header = FALSE, $post = FALSE, $cookies = 0) {
    $url = is_array($urls) ? $urls['0'] : $urls;
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    //带header方式提交
    if($header != FALSE){
        curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
    }

    //post提交方式
    if($post != FALSE){
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
    }

    if($cookies == 1){
        curl_setopt($ch, CURLOPT_COOKIEJAR, "cookiefile");
    }else if($cookies == 2){
        curl_setopt($ch, CURLOPT_COOKIEFILE, "cookiefile");
    }

    if(is_array($urls)){
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    }

    $data = curl_exec($ch);
    curl_close($ch);
    return $data;
}

最后附一个模仿搜索引擎蜘蛛来抓取网页

 代码如下 复制代码

function get_web_page( $url )
{
$options = array(
CURLOPT_RETURNTRANSFER => true,     // return web page 返回网页
CURLOPT_HEADER         => false,    // 不返回头信息
CURLOPT_FOLLOWLOCATION => true,     // follow redirects
CURLOPT_ENCODING       => "",       // handle all encodings
CURLOPT_USERAGENT      => "spider", // 设置UserAgent
CURLOPT_AUTOREFERER    => true,     // set referer on redirect
CURLOPT_CONNECTTIMEOUT => 120,      // timeout on connect 连接超时
CURLOPT_TIMEOUT        => 120,      // timeout on response 回复超时
CURLOPT_MAXREDIRS      => 10,       // stop after 10 redirects
);
$ch      = curl_init( $url );
curl_setopt_array( $ch, $options );
$content = curl_exec( $ch );
$err     = curl_errno( $ch );
$errmsg  = curl_error( $ch );
$header  = curl_getinfo( $ch );
curl_close( $ch );
$header[''errno'']   = $err;
$header[''errmsg'']  = $errmsg;
$header[''content''] = $content;
return $header;
}

 

文件夹大小统计主要是计算文件夹里面的文件大小然后相加之后再利用函数进行统计了,统计文件大小函数我们使用php filesize函数了,其它的全用目录相关的处理函数,下面一起来看看

计算文件夹的大小,包括子文件夹,格式化输出文件夹大小、文件数、子文件夹数信息。

 代码如下 复制代码

<?
//代码也可以用于统计目录数
//格式化输出目录大小 单位:Bytes,KB,MB,GB
 
function getDirectorySize($path)
{
  $totalsize = 0;
  $totalcount = 0;
  $dircount = 0;
  if ($handle = opendir ($path))
  {
    while (false !== ($file = readdir($handle)))
    {
      $nextpath = $path . '/' . $file;
      if ($file != '.' && $file != '..' && !is_link ($nextpath))
      {
        if (is_dir ($nextpath))
        {
          $dircount++;
          $result = getDirectorySize($nextpath);
          $totalsize += $result['size'];
          $totalcount += $result['count'];
          $dircount += $result['dircount'];
        }
        elseif (is_file ($nextpath))
        {
          $totalsize += filesize ($nextpath);
          $totalcount++;
        }
      }
    }
  }
  closedir ($handle);
  $total['size'] = $totalsize;
  $total['count'] = $totalcount;
  $total['dircount'] = $dircount;
  return $total;
}

PHP中计算文件目录大小其实主要是用到"filesize"函数,通过递归的方法计算每个文件的大小,再计算他们的和即是整个文件目录的大小。

因为直接返回的文件大小是以字节为单位的,所以我们一般还要经过换算得到我们常见得大小,以下是单位换算的函数:

 代码如下 复制代码
 
function sizeFormat($size)
{
    $sizeStr='';
    if($size<1024)
    {
        return $size." bytes";
    }
    else if($size<(1024*1024))
    {
        $size=round($size/1024,1);
        return $size." KB";
    }
    else if($size<(1024*1024*1024))
    {
        $size=round($size/(1024*1024),1);
        return $size." MB";
    }
    else
    {
        $size=round($size/(1024*1024*1024),1);
        return $size." GB";
    }
 
}
 
$path="/home/www/htdocs";
$ar=getDirectorySize($path);
 
echo "<h4>路径 : $path</h4>";
echo "目录大小 : ".sizeFormat($ar['size'])."<br>";
echo "文件数 : ".$ar['count']."<br>";
echo "目录术 : ".$ar['dircount']."<br>";
 
//print_r($ar);
?>


后面附一个单位函数

该函数最主要的是根据文件的字节数,判断应当选择的统计单位,也就是说一个文件用某一单位比如MB,那么该文件肯定小于1GB,否则当然要用GB作为单位了,而且文件要大于KB,不然的话得用更小的单位统计。该函数代码如下

 代码如下 复制代码

//size()  统计文件大小
function size($byte)
{
    if($byte < 1024) {
      $unit="B";
    }
    else if($byte < 10240) {
      $byte=round_dp($byte/1024, 2);
      $unit="KB";
    }
    else if($byte < 102400) {
      $byte=round_dp($byte/1024, 2);
      $unit="KB";
    }
    else if($byte < 1048576) {
      $byte=round_dp($byte/1024, 2);
      $unit="KB";
    }
    else if ($byte < 10485760) {
      $byte=round_dp($byte/1048576, 2);
      $unit="MB";
    }
    else if ($byte < 104857600) {
      $byte=round_dp($byte/1048576,2);
      $unit="MB";
    }
    else if ($byte < 1073741824) {
      $byte=round_dp($byte/1048576, 2);
      $unit="MB";
    }
    else {
      $byte=round_dp($byte/1073741824, 2);
      $unit="GB";
    }

$byte .= $unit;
return $byte;
}

function round_dp($num , $dp)
{
  $sh = pow(10 , $dp);
  return (round($num*$sh)/$sh);
}

关于php round函数用法可参考 http://www.111cn.net/w3school/php/func_math_round.htm

 

如果是简单的字符截取我们常用的就substr函数或再使用mb_substr来截取字符了,但是我们有时会发现有中英文混排字符串截取时并不像那么简单,因这样我们需要考虑到编码问题,如ascii、16进制、正则匹配、循环计数,但今天文章介绍的不需要想到这些用到一个我们不常用的字符截取函数,mb_strwidth这个是php自带的函数哦。

mb_strwidth($str, $encoding) 返回字符串的宽度

$str 要计算的字符串

$encoding 要使用的编码,如 utf8、gbk

mb_strimwidth($str, $start, $width, $tail, $encoding) 按宽度截取字符串

$str 要截取的字符串

$start 从哪个位置开始截取,默认是0

$width 要截取的宽度

$tail 追加到截取字符串后边的字符串,常用的是 ...

$encoding 要使用的编码

 代码如下 复制代码


<?php
/**
 * utf8 编码格式
 * 1个中文占用3个字节
 * 我们希望的是1个中文占用2个字节,
 * 因为从宽度上看2个英文字母占用的位置相当于1个中文
 */

// 测试字符串
$str = 'aaaa啊啊aaaa啊啊啊aaa';
echo strlen($str); // 只用strlen输出为25个字节

// 必须指定编码,不然会使用php的内码 mb_internal_encoding()可以查看内码
// 使用mb_strwidth输出字符串的宽度为20使用utf8编码
echo mb_strwidth($str, 'utf8');

// 只有宽度大于10才截取
if(mb_strwidth($str, 'utf8')>10){
    // 此处设定从0开始截取,取10个追加...,使用utf8编码
    // 注意追加的...也会被计算到长度之内
    $str = mb_strimwidth($str, 0, 10, '...', 'utf8');
}

// 最后输出 aaaa啊... 4个a算4个 1个啊算2个 3个点算3个 4+2+3=9
// 是不是很简单啊,有的人说了为什么是9个不是10个吗?
// 因为正好“啊”的后边还是“啊”,中文算2个,9+2=11 超出了设定,所以去掉1个就是9了
echo $str;

如果对于全中文没有问题但如果中间有符号了就有问题了,如我使用mb_strimwidth,mb_strwidth,后发现如果标题中存在“”符号的时候,PHP mb_strwidth会将该符号认为是1个宽度,我纳闷了这个不是中文的双引号嘛,照理说肯定是宽字节的,长度应该是2个宽度,后查询“”unicode分别为u201C和u201D,不在中文字符的范围中,再查询unicode.org 的码表,发现u2000-u206F是通用符号的范围,此范围中的字符虽然都是宽字符的形式,但是PHP 的mb_函数却认为是1个宽度,没办法,只能靠自己了。

 代码如下 复制代码

function truncString($str, $length) 

$countLen=0; 
for($i=0;$i<mb_strlen($str);$i++) 

$countLen+=amb_strwidth(mb_substr($str,$i,1)); 
if($countLen>$length) 
return mb_substr($str,0,$i); 

return $str; 

function amb_strwidth($str_width) 

$count=0; 
for($i=0;$i<mb_strlen($str_width);$i++) 

//if(mb_substr($str_width,$i,1)=="\xE2\x80\x9C"||mb_substr($str_width,$i,1)=='\xE2\x80\x9D') 
//如果遇到u2000-u206F内的字符则将计数器加2 
if(preg_match("/[\x{2000}-\x{206F}]/u",mb_substr($str_width,$i,1))) 
$count+=2; 
else 
$count+=mb_strwidth(mb_substr($str_width,$i,1)); 

return $count; 
}

总结,做来做出怎么就感觉到这个变成了回原点了呢,感觉还是要使用到循环遍历算字符编码取字符位数哈。

学习php的朋友都知道php本身是没有函数重载这一说的更没说像java,c那样使用方法,但如果我们深入了解一下会发现要吧在php中使用func_get_args()和func_num_args()函数实现函数重载哦,下面来举两个函数重载例子,希望能给各位带来一些帮助。

这两个函数实现函数的重载!!

1、默认参数

从这个上面就可以看到,如果一个函数里面,对不是必须参数,添加相应的默认值,就可以完成相应的功能。

 代码如下 复制代码

  function overloadFun($param1, $param2 = '1',$param3 = true)
  {
   // do something
  }

利用函数func_get_args()和call_user_func_array()

PHP代码:

 代码如下 复制代码

function rewrite() {  
$args = func_get_args();  
if(func_num_args() == 1) {  
func1($args[0]);  
} else if(func_num_args() == 2) {  
func2($args[0], $args[1]);  
}  
}  
 
function func1($arg) {  
echo $arg;  
}  
 
function func2($arg1, $arg2) {  
echo $arg1, ' ', $arg2;  
}  
 
rewrite('PHP'); //调用func1  
rewrite('PHP','China'); //调用func2  

2.使用默认值,从而根据输入,得到自己想要的结果:

 

 代码如下 复制代码
 function test($name="小李",$age="23"){ 
echo $name."  ".$age; 

 
test(); 
echo "<br/>"; 
test("a"); 
echo "<br/>"; 
test("a","b");

3.利用__call($name, $arg) 函数进行处理。

 代码如下 复制代码

<?php
 
  class OverLoad{
   function __call($name, $args)
   {
  if($name=='overloadFun')
  {
   switch(count($args))
   {
    case 0: $this->overloadFun0();break;
    case 1: $this->overloadFun1($args[0]); break;
    case 2: $this->overloadFun2($args[0], $args[1]); break;
    default: //do something
      break;
   }
  }
   }
  
   function overloadFun0()
   {
  echo 0;
   }
  
   function overloadFun1($var1)
   {
  echo $var1;
   }

   function overloadFun2($var1,$var2)
   {
 
  echo $var1+$var2;
   }
  } 
   $test=new OverLoad();
  
   $test->overloadFun()."<br />".
   $test->overloadFun(1)."<br />".
   $test->overloadFun(1,2)."<br />";
  
?>

有了这样的方法之后我们就可以利用它们来实现简单函数重载了,但有一点要注明的是php 作为一种弱类型语言,本身不能像强类型如java ,c++那样,直接的实现重载,至少现在不可以以后版本会不会有我们不知道,

在php中函数自带了一个url转换字符或字符转换在url字符的方法,但是今天我也看到了一个朋友写的一个例子,下面我就把它现官方的函数整理一起

英文:

 代码如下 复制代码

function tourl($str) {
  $str = preg_replace('/[^a-zA-Z0-9]+/', '-', $str);
  $str = trim($str, '-');
  return strtolower($str);
}

包含特殊字符:

 

 代码如下 复制代码
function strtourl($str) {
  $str = htmlentities($str, ENT_QUOTES, "UTF-8");
  $str = preg_replace('/&([a-z]{1,2})(?:acute|lig|grave|ring|tilde|uml|cedil|caron);/i','1',$str);
  $str = html_entity_decode($str, ENT_QUOTES, "UTF-8");
  $str = preg_replace('/[^a-z0-9]+/i', '-', $str);
  return strtolower($str);
}

urlencode函数 此函数可以解决百度 get与google get中文乱码问题哦

 代码如下 复制代码

header('Content-type: text/html; charset=utf-8');  
  
echo '<br />百度关键词URL编码转换示例:<br />'; 

$urlBaidu = 'http://www.baidu.com/s?wd=%D6%D0%CE%C4'; 

$arrParse = parse_url($urlBaidu); 

parse_str($arrParse ['query'],$output); 

echo '乱码:' . $output['wd'] . '<br />';  
//将gb2312编码转换成utf-8编码 

$strUTF8 = mb_convert_encoding($output['wd'], 'utf-8', 'gb2312'); 

echo '可读码:' . $strUTF8 . '<br />';  

echo '<br />谷歌关键词URL编码转换示例:<br />'; 

$urlGoogle = 'http://www.google.cn/search?hl=zh-CN&source=hp&q=%E4%B8%AD%E6%96%87&aq=f&oq='; 
    
$arrParse = parse_url($urlGoogle); 

parse_str($arrParse ['query'],$output); 
//谷歌关键词URL编码是utf-8,不用再作转换 

echo '可读码:' . $output['q'] . '<br />';

总结,个人更喜欢使用php自带urlencode()函数了,上面这个也是解决我们url用中文时百度与gg有时会乱码问题解决方案了。

[!--infotagslink--]

相关文章

  • php正确禁用eval函数与误区介绍

    eval函数在php中是一个函数并不是系统组件函数,我们在php.ini中的disable_functions是无法禁止它的,因这他不是一个php_function哦。 eval()针对php安全来说具有很...2016-11-25
  • php中eval()函数操作数组的方法

    在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
  • Python astype(np.float)函数使用方法解析

    这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08
  • Python中的imread()函数用法说明

    这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
  • C# 中如何取绝对值函数

    本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
  • C#学习笔记- 随机函数Random()的用法详解

    下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • 金额阿拉伯数字转换为中文的自定义函数

    CREATE FUNCTION ChangeBigSmall (@ChangeMoney money) RETURNS VarChar(100) AS BEGIN Declare @String1 char(20) Declare @String2 char...2016-11-25
  • Android开发中findViewById()函数用法与简化

    findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20
  • Android模拟器上模拟来电和短信配置

    如果我们的项目需要做来电及短信的功能,那么我们就得在Android模拟器开发这些功能,本来就来告诉我们如何在Android模拟器上模拟来电及来短信的功能。 在Android模拟...2016-09-20
  • C++中 Sort函数详细解析

    这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
  • PHP用strstr()函数阻止垃圾评论(通过判断a标记)

    strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。该函数返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 false。语法:strstr(string,search)参数string,必需。规定被搜索的字符串。 参数sea...2013-10-04
  • 夜神android模拟器设置代理的方法

    夜神android模拟器如何设置代理呢?对于这个问题其实操作起来是非常的简单,下面小编来为各位详细介绍夜神android模拟器设置代理的方法,希望例子能够帮助到各位。 app...2016-09-20
  • PHP函数分享之curl方式取得数据、模拟登陆、POST数据

    废话不多说直接上代码复制代码 代码如下:/********************** curl 系列 ***********************///直接通过curl方式取得数据(包含POST、HEADER等)/* * $url: 如果非数组,则为http;如是数组,则为https * $header:...2014-06-07
  • php中的foreach函数的2种用法

    Foreach 函数(PHP4/PHP5)foreach 语法结构提供了遍历数组的简单方式。foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息。...2013-09-28
  • C#模拟http 发送post或get请求的简单实例

    下面小编就为大家带来一篇C#模拟http 发送post或get请求的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C语言中free函数的使用详解

    free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。下面我们就来详细探讨下...2020-04-25
  • PHP函数strip_tags的一个bug浅析

    PHP 函数 strip_tags 提供了从字符串中去除 HTML 和 PHP 标记的功能,该函数尝试返回给定的字符串 str 去除空字符、HTML 和 PHP 标记后的结果。由于 strip_tags() 无法实际验证 HTML,不完整或者破损标签将导致更多的数...2014-05-31
  • SQL Server中row_number函数的常见用法示例详解

    这篇文章主要给大家介绍了关于SQL Server中row_number函数的常见用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-08
  • PHP加密解密函数详解

    分享一个PHP加密解密的函数,此函数实现了对部分变量值的加密的功能。 加密代码如下: /* *功能:对字符串进行加密处理 *参数一:需要加密的内容 *参数二:密钥 */ function passport_encrypt($str,$key){ //加密函数 srand(...2015-10-30
  • php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法

    最近遇到一个问题,就是在使用php的mail函数发送utf-8编码的中文邮件时标题出现乱码现象,而邮件正文却是正确的。最初以为是页面编码的问题,发现页面编码utf-8没有问题啊,找了半天原因,最后找到了问题所在。 1.使用 PEAR 的...2015-10-21