CC's blog

CC的技术博客 专注于 it 互联网的技术爱好者

分类 PHP开发 下的文章

Jenkins_Api 使用接口触发jekins 操作,获取Jenkins 构建状态

使用方法

http://localhost/index.php?jobname={项目名称}&action={要执行的操作}
//示例
http://localhost/index.php?jobname=jenkins_test&action=build

jobname 项目名称 :你的项目名称
action  要执行的操作 选项:  build (构建)  getlastbuild (获取该项目最后一次构建信息)  getbuilds(获取该项目所有构建信息)

下载地址

https://github.com/xiongcaichang/Jenkins_Api

阅读全文
none

带有中文字符的html截取 博客截取详情


<?php

* ============================== 截取含有 html标签的字符串 =========================
* @param (string) $str 待截取字符串
* @param (int) $lenth 截取长度
* @param (string) $repalce 超出的内容用$repalce替换之(该参数可以为带有html标签的字符串)
* @param (string) $anchor 截取锚点,如果截取过程中遇到这个标记锚点就截至该锚点处
* @return (string) $result 返回值
* @demo $res = cut_html_str($str, 256, '...'); //截取256个长度,其余部分用'...'替换
* ===============================================================================
*/
function cut_html_str($str, $lenth, $replace='', $anchor='&lt;!-- break --&gt;'){
    $_lenth = mb_strlen($str, "utf-8"); // 统计字符串长度(中、英文都算一个字符)
    if($_lenth &lt;= $lenth){
        return $str; // 传入的字符串长度小于截取长度,原样返回
    }
    $strlen_var = strlen($str); // 统计字符串长度(UTF8编码下-中文算3个字符,英文算一个字符)
    if(strpos($str, '&lt;') === false){
        return mb_substr($str, 0, $lenth); // 不包含 html 标签 ,直接截取
    }
    if($e = strpos($str, $anchor)){
        return mb_substr($str, 0, $e); // 包含截断标志,优先
    }
    $html_tag = 0; // html 代码标记
    $result = ''; // 摘要字符串
    $html_array = array('left' =&gt; array(), 'right' =&gt; array()); //记录截取后字符串内出现的 html 标签,开始=&gt;left,结束=&gt;right
    /*
    * 如字符串为:&lt;h3&gt;&lt;p&gt;&lt;b&gt;a&lt;/b&gt;&lt;/h3&gt;,假设p未闭合,数组则为:array('left'=&gt;array('h3','p','b'), 'right'=&gt;'b','h3');
    * 仅补全 html 标签,&lt;? &lt;% 等其它语言标记,会产生不可预知结果
    */
    for($i = 0; $i &lt; $strlen_var; ++$i) {
        if(!$lenth) break; // 遍历完之后跳出
    $current_var = substr($str, $i, 1); // 当前字符
    if($current_var == '&lt;'){ // html 代码开始
        $html_tag = 1;
        $html_array_str = '';
    }else if($html_tag == 1){ // 一段 html 代码结束
        if($current_var == '&gt;'){
            $html_array_str = trim($html_array_str); //去除首尾空格,如 &lt;br / &gt; &lt; img src="" / &gt; 等可能出现首尾空格
            if(substr($html_array_str, -1) != '/'){ //判断最后一个字符是否为 /,若是,则标签已闭合,不记录
                // 判断第一个字符是否 /,若是,则放在 right 单元
                $f = substr($html_array_str, 0, 1);
                if($f == '/'){
                    $html_array['right'][] = str_replace('/', '', $html_array_str); // 去掉 '/'
                }else if($f != '?'){ // 若是?,则为 PHP 代码,跳过
                    // 若有半角空格,以空格分割,第一个单元为 html 标签。如:&lt;h2 class="a"&gt; &lt;p class="a"&gt;
                    if(strpos($html_array_str, ' ') !== false){
                        // 分割成2个单元,可能有多个空格,如:&lt;h2 class="" id=""&gt;
                        $html_array['left'][] = strtolower(current(explode(' ', $html_array_str, 2)));
                    }else{
                        //若没有空格,整个字符串为 html 标签,如:&lt;b&gt; &lt;p&gt; 等,统一转换为小写
                        $html_array['left'][] = strtolower($html_array_str);
                    }
                }
            }
            $html_array_str = ''; // 字符串重置
            $html_tag = 0;
        }else{
            $html_array_str .= $current_var; //将&lt; &gt;之间的字符组成一个字符串,用于提取 html 标签
        }
    }else{
        --$lenth; // 非 html 代码才记数
    }
    $ord_var_c = ord($str{$i});
    switch (true) {
        case (($ord_var_c &amp; 0xE0) == 0xC0): // 2 字节
            $result .= substr($str, $i, 2);
            $i += 1; break;
        case (($ord_var_c &amp; 0xF0) == 0xE0): // 3 字节
            $result .= substr($str, $i, 3);
            $i += 2; break;
        case (($ord_var_c &amp; 0xF8) == 0xF0): // 4 字节
            $result .= substr($str, $i, 4);
            $i += 3; break;
        case (($ord_var_c &amp; 0xFC) == 0xF8): // 5 字节
            $result .= substr($str, $i, 5);
            $i += 4; break;
        case (($ord_var_c &amp; 0xFE) == 0xFC): // 6 字节
            $result .= substr($str, $i, 6);
            $i += 5; break;
        default: // 1 字节
            $result .= $current_var;
    }
}
if($html_array['left']){ //比对左右 html 标签,不足则补全
    $html_array['left'] = array_reverse($html_array['left']); //翻转left数组,补充的顺序应与 html 出现的顺序相反
    foreach($html_array['left'] as $index =&gt; $tag){
        $key = array_search($tag, $html_array['right']); // 判断该标签是否出现在 right 中
        if($key !== false){ // 出现,从 right 中删除该单元
            unset($html_array['right'][$key]);
        }else{ // 没有出现,需要补全
            $result .= '&lt;/'.$tag.'&gt;';
        }
    }
}
return $result.$replace;
}
阅读全文
none

PHP 安装第三方扩展

一开始安装PHP的时候,我们并不知道需要哪些扩展,所以只有等到我们真正用到的时候才想办法去安装。

安装PHP扩展最简单的办法就是

sudo apt-get install php5-xxx  

但有的时候并非我们所愿,源里面并没有我们需要的扩展,这时候就需要我们下载源码自己编译安装了。

这篇文章中我将介绍在本地Linux平台下编译安装PHP扩展的方法。

现在网站根目录下创建 index.php 打印基本的配置信息,以验证我们是否安装成功。

配置编译环境

我们需要安装一些编译必须的库,还有 php-dev 版本

Ubuntu

sudo apt-get install php5-dev php5-mysql gcc libpcre3-dev  

Fedora

sudo yum install php-devel php-mysqlnd gcc libtool 

RHEL

sudo yum install php-devel php-mysql gcc libtool 

Suse

yast2 -i php5-pear php5-devel php5-mysql gcc  

安装扩展

PHP有两种可供安装的扩展:一种是PHP原生的但是默认没有安装的,另一种的第三方开发的扩展。

下面依次介绍两种扩展的安装方法:

安装之前我们需要一份和当前机器上相同版本的PHP源码

cd code
wget http://cn2.php.net/distributions/php-5.5.9.tar.bz2 tar xvjf php-5.5.9.tar.bz2
cd php-5.5.9  

前往此处 下载相应的源码包。

在 /ext 目录下面可以看到所有PHP原生的扩展。

安装原生扩展

以 PHP-intl 为例,这是PHP国际化的扩展。

为了安装这个扩展我们需要先安装ICU 库

sudo apt-get install icu-devtools icu-doc libicu-dev libicu52 libicu52-dbg  

ICU 安装成功之后进入/ext/intl 目录:

cd intl
phpize
./configure --enable-intl make
sudo make install 

下面解释一下上面的每个命令:
  • phpize : 是用来扩展php扩展模块的,通过phpize可以建立php的外挂模块
       //该步骤执行完提示没有autoConf  则 下载安装  安装步骤  ./congigure  &&make  &&make install
  • ./configure --enable-intl: 配置编译环境,相当于告诉编译器编译PHP源码的时候加上intl这个扩展。
  • make: 将会把源码编译成 intl.so
  • make install : 将会把 intl.so 移动到当前安装的 PHP 的扩展目录。

接下来我们要做的就是在php.ini中启用这个扩展,这一步将会在最后给出示例。

安装第三方扩展

将以这个 扩展为例,这个扩展主要实现了PHP识别条形码的功能。

先安装必要的依赖

sudo apt-get install pkg-config  
git clone https://github.com/mongodb/mongo-php-driver cd mongo-php-driver
phpize
./configure
make
sudo make install  

将会生成一个文件,将其拷贝到PHP的扩展目录下面。

启用扩展

在php.ini中启用扩展的方式有很多:

  1. 直接在php.ini文件中添加 extension=mongo.so,这是最简单直接的方法。
  2. 也可以单独建一个ini文件,然后在php.ini中包含这些文件就可以了。

下面介绍一下第二种方法:

cd `/etc/php5/mods-available`  

这个目录里可以放新建的ini文件,然后执行

sudo touch mongo.ini echo "extension=mongo.so" | sudo tee -a mongo.ini
sudo touch intl.ini echo "extension=intl.so" | sudo tee -a intl.ini  

上面的命令将会创建ini文件,并且写如相应的配置信息。

然后执行下面的命令启用扩展即可(需要安装 php5enmod 工具):

sudo php5enmod mongo
sudo php5enmod intl  

如果未安装 php5enmod 工具,则需要手动配置:

ln -s /etc/php5/mods-available/mongo.ini /etc/php5/cli/conf.d/mongo.ini
ln -s /etc/php5/mods-available/intl.ini /etc/php5/cli/conf.d/intl.ini
ln -s /etc/php5/mods-available/mongo.ini /etc/php5/fpm/conf.d/mongo.ini
ln -s /etc/php5/mods-available/intl.ini /etc/php5/fpm/conf.d/intl.ini  

最后在执行一下重启操作就可以了:

sudo service nginx restart sudo service php5-fpm restart
阅读全文
none

friendlyTime 友好时间显示

  
    function friendlyDate($sTime,$type = 'normal',$alt = 'false') {
        if (!$sTime)
            return '';
        //sTime=源时间,cTime=当前时间,dTime=时间差
        $cTime      =   time();
        $dTime      =   $cTime - $sTime;
        $dDay       =   intval(date("z",$cTime)) - intval(date("z",$sTime));
        //$dDay     =   intval($dTime/3600/24);
        $dYear      =   intval(date("Y",$cTime)) - intval(date("Y",$sTime));
        //normal:n秒前,n分钟前,n小时前,日期
        if($type=='normal'){
            if( $dTime < 60 ){
                if($dTime < 10){
                    return '刚刚';    //by yangjs
                }else{
                    return intval(floor($dTime / 10) * 10)."秒前";
                }
            }elseif( $dTime < 3600 ){
                return intval($dTime/60)."分钟前";
                //今天的数据.年份相同.日期相同.
            }elseif( $dYear==0 && $dDay == 0  ){
                //return intval($dTime/3600)."小时前";
                return '今天'.date('H:i',$sTime);
            }elseif($dYear==0){
                return date("m月d日 H:i",$sTime);
            }else{
                return date("Y-m-d H:i",$sTime);
            }
        }elseif($type=='mohu'){
            if( $dTime < 60 ){
                return $dTime."秒前";
            }elseif( $dTime < 3600 ){
                return intval($dTime/60)."分钟前";
            }elseif( $dTime >= 3600 && $dDay == 0  ){
                return intval($dTime/3600)."小时前";
            }elseif( $dDay > 0 && $dDay<=7 ){
                return intval($dDay)."天前";
            }elseif( $dDay > 7 &&  $dDay <= 30 ){
                return intval($dDay/7) . '周前';
            }elseif( $dDay > 30 ){
                return intval($dDay/30) . '个月前';
            }
            //full: Y-m-d , H:i:s
        }elseif($type=='full'){
            return date("Y-m-d , H:i:s",$sTime);
        }elseif($type=='ymd'){
            return date("Y-m-d",$sTime);
        }else{
            if( $dTime < 60 ){
                return $dTime."秒前";
            }elseif( $dTime < 3600 ){
                return intval($dTime/60)."分钟前";
            }elseif( $dTime >= 3600 && $dDay == 0  ){
                return intval($dTime/3600)."小时前";
            }elseif($dYear==0){
                return date("Y-m-d H:i:s",$sTime);
            }else{
                return date("Y-m-d H:i:s",$sTime);
            }
        }
    }
阅读全文

PHP CURL 抓取教务系统信息

<?php

//模拟登录
function login_post($url, $cookie, $post) {
    $curl = curl_init($url);//初始化curl模块
    // curl_setopt($curl, CURLOPT_URL, $url);//登录提交的地址
    curl_setopt($curl, CURLOPT_HEADER, 0);//是否显示头信息
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 0);//是否自动显示返回的信息
    curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie); //设置Cookie信息保存在指定的文件中
    curl_setopt($curl, CURLOPT_POST, 1);//post方式提交
    curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($post));//要提交的信息
    curl_exec($curl);//执行cURL
    curl_close($curl);//关闭cURL资源,并且释放系统资源
}

//登录成功后获取数据
function get_content($url, $cookie,$headers) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_HEADER, true);           
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 120);    //设置连接超时时间
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);   //设置请求头部信息
    curl_setopt($curl, CURLOPT_BINARYTRANSFER, true) ; //允许二进制传输
    curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate');  //用于请求压缩过的内容
    // curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie); //读取cookie
    $rs = curl_exec($ch); //执行cURL抓取页面内容
    curl_close($ch);
    return $rs;
}
$headers = array(
//标注请求的header参数
    'Cookie:JSESSIONID=14CE837D989EA1C0AEB26E4D309DC44E.kingo154' ,
);
$url1='http://xk1.henu.edu.cn:7001/cas/logon.action';


//      这个参数也会改变
$url2='http://xk1.henu.edu.cn/wsxk/xkjg.ckdgxsxdkchj_data10319.jsp?params=eG49MjAxNSZ4cT0xJnhoPTAwMDA0NDYzNg==';
$url2='http://xk1.henu.edu.cn:7001/wsxk/xkjg.ckdgxsxdkchj_data10319.jsp?params=eG49MjAxNSZ4cT0xJnhoPTAwMDA0NDYzNg==';

$posts = array(
'isPasswordPolicy'=>1,
'password'=>’#########db8587f83d099d5c9c3',
'randnumber'=>3767,
'username'=>1345030253,

);

// login_post($url1, $cookie, $posts);

$result=get_content($url2,$cookie,$headers);
$rs=mb_convert_encoding($result, 'GBK', 'GBK,UTF-8,ASCII');
var_dump($result1);




?>
阅读全文
none

PHP 递归 无限极分类

code

  • 下面的以zendframework 1为例


<?php
class Model_DbTable_Category extends Zend_Db_Table{

    protected  $_name="category";
    protected  $_primary="categoryId";

    //获取某分类的直接子分类
    function getSons($categorys,$catId=0){
        $sons=array();
        foreach($categorys as $item){
            if($item['parentId']==$catId)
                $sons[]=$item;
        }
        return $sons;
    }
   
    //获取某个分类的所有子分类
    function getSubs($categorys,$catId=0,$level=1){
        $subs=array();
        foreach($categorys as $item){
            if($item['parentId']==$catId){
                $item['level']=$level;
                $subs[]=$item;
                $subs=array_merge($subs,$this->getSubs($categorys,$item['categoryId'],$level+1));
   
            }
   
        }
        return $subs;
    }
   
    //获取某个分类的所有父分类
    //方法一,递归
    function getParents($categorys,$catId){
        $tree=array();
        foreach($categorys as $item){
            if($item['categoryId']==$catId){
                if($item['parentId']>0)
                    $tree=array_merge($tree,$this->getParents($categorys,$item['parentId']));
                $tree[]=$item;
                break;
            }
        }
        return $tree;
    }
   
    //方法二,迭代
    function getParents2($categorys,$catId){
        $tree=array();
        while($catId != 0){
            foreach($categorys as $item){
                if($item['categoryId']==$catId){
                    $tree[]=$item;
                    $catId=$item['parentId'];
                    break;
                }
            }
        }
        return $tree;
    }   
}





<?php
require_once 'BaseController.php';
class CategoryController extends  BaseController{
   
    public function indexAction(){
        $categoryModel=new Model_DbTable_Category();
        $categorys=$categoryModel->fetchAll()->toArray();
        //获取某分类的直接子分类
        $result=$categoryModel->getSons($categorys,1);
        foreach($result as $item)
            echo $item['categoryName'].'<br>';
        echo '<hr>';
        //获取所欲分类的子分类
        $result=$categoryModel->getSubs($categorys,0);
        foreach($result as $item)
            echo str_repeat('--',$item['level']).$item['categoryName'].'<br>';
        echo '<hr>';
       
         //获取某个分类的所有父分类
         //方法一,递归
        $result=$categoryModel->getParents($categorys,7);
        foreach($result as $item)
            echo $item['categoryName'].' >> ';
        echo '<hr>';
       
        //获取某个分类的所有父分类
        $result=$categoryModel->getParents2($categorys,15);
        foreach($result as $item)
            echo $item['categoryName'].' >> ';
       
    }
   
}

数据库

CREATE TABLE IF NOT EXISTS `sorts` (
  `sid` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
  `sparent` smallint(5) unsigned NOT NULL DEFAULT '0',
  `name` varchar(50) NOT NULL,
  PRIMARY KEY (`sid`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=16 ;

INSERT INTO `sorts` (`sid`, `sparent`, `name`) VALUES
(1, 0, 'php'),
(2, 0, 'java'),
(3, 0, 'c/c++'),
(4, 1, 'php基础'),
(5, 1, 'php开源资料'),
(6, 1, 'php框架'),
(7, 2, 'java Se'),
(8, 2, 'java EE'),
(9, 2, 'java Me'),
(10, 3, 'c/c++基础编程'),
(11, 3, 'c/c++系统开发'),
(12, 3, 'c嵌入式编程'),
(13, 3, 'c++应用开发'),
(14, 13, 'c++桌面应用开发'),
(15, 13, 'c++游戏开发');

效果预览

ED95C89343554BFBA0B2A2B4759B59B1.png

阅读全文

PHP CURL 入门教程

使用PHP的cURL库可以简单和有效地去抓网页。你只需要运行一个脚本,然后分析一下你所抓取的网页,然后就可以以程序的方式得到你想要的数据了。无论是你想从从一个链接上取部分数据,或是取一个XML文件并把其导入数据库,那怕就是简单的获取网页内容,cURL 是一个功能强大的PHP库。本文主要讲述如果使用这个PHP库。

启用 cURL 设置

首先,我们得先要确定我们的PHP是否开启了这个库,你可以通过使用php_info()函数来得到这一信息。

phpinfo();

如果你可以在网页上看到下面的输出,那么表示cURL库已被开启。

如果你看到的话,那么你需要设置你的PHP并开启这个库。如果你是在Windows平台下,那么非常简单,你需要改一改你的php.ini文件的设置,找到php_curl.dll,并取消前面的分号注释就行了。如下所示:

//取消下在的注释

extension=php_curl.dll

如果你是在Linux下面,那么,你需要重新编译你的PHP了,编辑时,你需要打开编译参数——在configure命令上加上“–with-curl” 参数。

一个小示例

如果一切就绪,下面是一个小例程:


// 初始化一个 cURL 对象 
$curl = curl_init();
// 设置你需要抓取的URL 
curl_setopt($curl, CURLOPT_URL, 'http://cocre.com');
// 设置header 
curl_setopt($curl, CURLOPT_HEADER, 1);
// 设置cURL 参数,要求结果保存到字符串中还是输出到屏幕上。 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
// 运行cURL,请求网页 
$data = curl_exec($curl);
// 关闭URL请求 
curl_close($curl);
// 显示获得的数据 
var_dump($data);

如何POST数据

上面是抓取网页的代码,下面则是向某个网页POST数据。假设我们有一个处理表单的网址http://www.example.com/sendSMS.php,其可以接受两个表单域,一个是电话号码,一个是短信内容


$phoneNumber = '13912345678'; 
$message = 'This message was generated by curl and php'; 
$curlPost = 'pNUMBER=' . urlencode($phoneNumber) . '&MESSAGE=' . urlencode($message) .'&SUBMIT=Send'; 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/sendSMS.php'); 
curl_setopt($ch, CURLOPT_HEADER, 1); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost); 
$data = curl_exec();curl_close($ch);

从上面的程序我们可以看到,使用CURLOPT_POST设置HTTP协议的POST方法,而不是GET方法,然后以CURLOPT_POSTFIELDS设置POST的数据。

关于代理服务器

下面是一个如何使用代理服务器的示例。请注意其中高亮的代码,代码很简单,我就不用多说了。


$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, 'http://www.example.com'); 
curl_setopt($ch, CURLOPT_HEADER, 1); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1); 
curl_setopt($ch, CURLOPT_PROXY, 'fakeproxy.com:1080'); 
curl_setopt($ch, CURLOPT_PROXYUSERPWD, 'user:password'); 
$data = curl_exec();curl_close($ch); 


关于SSL和Cookie

关于SSL也就是HTTPS协议,你只需要把CURLOPT_URL连接中的http://变成https://就可以了。当然,还有一个参数叫CURLOPT_SSL_VERIFYHOST可以设置为验证站点。

关于Cookie,你需要了解下面三个参数:

CURLOPT_COOKIE,在当面的会话中设置一个cookie

CURLOPT_COOKIEJAR,当会话结束的时候保存一个Cookie

CURLOPT_COOKIEFILE,Cookie的文件。

HTTP服务器认证

最后,我们来看一看HTTP服务器认证的情况。

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, 'http://www.example.com'); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); 
curl_setopt(CURLOPT_USERPWD, '[username]:[password]')
$data = curl_exec(); 
curl_close($ch); 



阅读全文
none