分类 PHP 下的文章

PHP获取关键词在百度、360、搜狗排名 关键词排名查询

工作过程需要定时查询某些关键在百度、360及搜狗中的排序,于是写了一个简单的查询类,有更好的方法或错误可以回复交流。
基本思路:根据关键词搜索结果匹配所在页面中的排序值
ThinkPHP5 /extend/org/util/KeyRank.php

<?php
namespace org\util;

error_reporting(E_ALL & ~E_NOTICE);

/**
 * 获取关键词在百度、360、搜狗排名
 * 
 * Author: IceCry <http://www.zhinizhiwo.com>
 *
 * @param      string   $key    检测关键字
 * @param      string   $url    检测域名
 * @param      integer  $deep   页面深度
 * @param      integer  $start  起始页面
 * @param      integer  $trytime尝试次数
 *
 * @return     integer  排名(不包含竞价广告,为自然排名)
 */
class KeyRank{
    private static $url;
    private static $key;
    private static $start;
    private static $deep;
    private static $trytime;

    public function __construct($key='', $url='', $deep=3, $start=1, $trytime=3) {
        if($key==='' || $url===''){
            die('key & url required !');
        }
        self::$url = $url;
        self::$key = $key;
        self::$deep = $deep;
        self::$start = $start;
        self::$trytime = $trytime;
    }
    
    //百度
    public static function baiduRank(){
        $rank=$page=0;
        $res = ['rank'=>$rank, 'page'=>$rank];
        for ($d=self::$start; $d <= self::$deep; $d++) {
            $pn = 10*($d-1);
            $url  = "http://www.baidu.com/s?ie=utf-8&wd=".urlencode(self::$key).'&pn='.$pn;
            $str = self::https_request($url);
            preg_match("/<div id=\"content_left\">.*?<div id=\"rs\">/ism", $str, $content);
            $str = $content[0];
            $arr = explode('<div class="result', $str);
            // var_dump($arr);die;

            if(!$arr[0]){
                for ($i=0; $i < self::$trytime; $i++) {
                    $str = self::https_request($url);
                    preg_match("/<div id=\"content_left\">.*?<div id=\"rs\">/ism", $str, $content);
                    $str = $content[0];
                    $arr = explode('<div class="result', $str);
                    if($arr[0] != ''){
                        break;
                    }
                    sleep(3);
                }
                if(!$arr[0]){
                    $err = date('Y/m/d H:i:s')."【错误】#百度#关键词@".self::$key."@页面抓取失败\r\n";
                    file_put_contents('./err.log', $err, FILE_APPEND);
                    break;
                }
            }

            foreach ($arr as $k => $v) {
                if($k==0) continue;
                // preg_match("/<div class=\"f13\">.*?<\/a>/ism", $v, $xxx);
                preg_match("/class=\"c-showurl\".*?>.*?<\/[^b|.]*?>/ism", $v, $xxx);
                if(isset($xxx[0]) && strstr(strip_tags($xxx[0]), self::$url)){
                    global $rank, $page;
                    $page = $d;
                    $rank = $k + ($d-1)*10;
                    break;
                }
            }
            
            if($rank){
                $res['rank'] = $rank;
                $res['page'] = $page;
                return $res;
            }
        }
        return $res;
    }

    //360
    public static function soRank(){
        $rank=$page=0;
        $res = ['rank'=>$rank, 'page'=>$rank];
        for ($d=self::$start; $d <= self::$deep; $d++) {
            $url = "https://www.so.com/s?ie=utf-8&fr=so.com&src=home_so.com&q=".urlencode(self::$key)."&pn=".$d;
            $str = self::https_request($url);
            preg_match("/<ul class=\"result\">.*?<div id=\"side\">/ism", $str, $content);
            $str = $content[0];
            $arr = explode('<li class="res-list', $str);

            if(!$arr[0]){
                for ($i=0; $i < self::$trytime; $i++) {
                    $str = self::https_request($url);
                    preg_match("/<ul class=\"result\">.*?<div id=\"side\">/ism", $str, $content);
                    $str = $content[0];
                    $arr = explode('<li class="res-list', $str);
                    if($arr[0] != ''){
                        break;
                    }
                    sleep(3);
                }
                if(!$arr[0]){
                    $err = date('Y/m/d H:i:s')."【错误】#360#关键词@".self::$key."@页面抓取失败\r\n";
                    file_put_contents('./err.log', $err, FILE_APPEND);
                    break;
                }
            }

            foreach ($arr as $k => $v) {
                if($k==0) continue;
                preg_match("/<cite>.*?<\/cite>/ism", $v, $xxx);
                if(isset($xxx[0]) && strstr(strip_tags($xxx[0]), self::$url)){
                    global $rank, $page;
                    $page = $d;
                    $rank = $k + ($d-1)*10;
                    break;
                }
            }
            
            if($rank){
                $res['rank'] = $rank;
                $res['page'] = $page;
                return $res;
            }
        }
        return $res;
    }

    //搜狗
    public static function sogouRank(){
        $rank=$page=0;
        $res = ['rank'=>$rank, 'page'=>$rank];
        for ($d=self::$start; $d <= self::$deep; $d++) {
            $url = "https://www.sogou.com/web?query=".urlencode(self::$key)."&page=".$d;
            $str = self::https_request($url);
            preg_match("/<div class=\"results\".*?<div class=\"right\"/ism", $str, $content);
            $str = $content[0];
            $arr = explode('<!-- a -->', $str);

            if(!$arr[0]){
                for ($i=0; $i < self::$trytime; $i++) {
                    $str = self::https_request($url);
                    preg_match("/<div class=\"results\".*?<div class=\"right\"/ism", $str, $content);
                    $str = $content[0];
                    $arr = explode('<!-- a -->', $str);
                    if($arr[0] != ''){
                        break;
                    }
                    sleep(3);
                }
                if(!$arr[0]){
                    $err = date('Y/m/d H:i:s')."【错误】#搜狗#关键词@".self::$key."@页面抓取失败\r\n";
                    file_put_contents('./err.log', $err, FILE_APPEND);
                    break;
                }
            }

            //sogou首页个数非稳定10个 判断排名依据
            foreach ($arr as $k => $v) {
                $total = count($arr);
                if($k==0) continue;
                preg_match("/<cite.*?>.*?<\/cite>/ism", $v, $xxx);
                if(isset($xxx[0]) && strstr(strip_tags($xxx[0]), self::$url)){
                    global $rank, $page;
                    $page = $d;
                    // $rank = $k + ($d-1)*10;
                    $tmp += $total;
                    $rank = $k + $tmp - $total;
                    break;
                }
            }
            
            if($rank){
                $res['rank'] = $rank;
                $res['page'] = $page;
                return $res;
            }
        }
        return $res;
    }

    //curl
    public static function https_request($url, $data = null){
        $headers = array(
            "Content-type:application/html;charset=utf-8",
            "User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36",
            'Cache-Control:no-cache'
        );
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($curl, CURLOPT_TIMEOUT,3);
        if (!empty($data)){
            curl_setopt($curl, CURLOPT_POST, 1);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        }
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
        $output = curl_exec($curl);
        curl_close($curl);
        return $output;
    }
}

/*$KeyRank = new KeyRank('婧氏纸尿裤', 'magibaby.net', 2);
$baidu = $KeyRank::baiduRank();
$so = $KeyRank::soRank();
$sogou = $KeyRank::sogouRank();
var_dump($baidu);
var_dump($so);
var_dump($sogou);*/

password_hash密码哈希与安全

支持PHP5.5+
项目中大部分加密基于MD5+SALT,事实上password_hash()已经帮我们处理好了加盐。加进去的随机子串通过加密算法自动保存着,成为哈希的一部分。password_verify()会把随机子串从中提取,所以你不必使用另一个数据库来记录这些随机子串,大大简化了计算密码哈希值和验证密码的操作。

- 阅读剩余部分 -

二维数组中取某一相同字段的值进行,拼接字符串

使用PHP自带的一个函数:array_column() ,该函数的作用是返回输入数组中某个单一列的值。

$firms = M('lawfirm')->where('status=1')->field('id')->select();
$firmids = array_column($firms, 'id');
$who = implode(',', $firmids);

或是通过foreach进行拼装。

flush实现 “在页面中一边执行一边输出” 的效果

PHP实现页面执行中显示执行信息

set_time_limit(0);  //在有关数据库的大量数据的时候,可以将其设置为0,表示无限制。  
ob_end_clean();     //在循环输出前,要关闭输出缓冲区   
echo str_pad('',1024);     //浏览器在接受输出一定长度内容之前不会显示缓冲输出,这个长度值 IE是256,火狐是1024,不会出现上下的拉动条。  
for($i=1;$i<=100;$i++){   
    echo $i.'<br>';   
    flush();    //刷新输出缓冲   
    sleep(1);  //这个控制输出的速度。  
} 

PHPExcel读取EXCEL中的图片并保存到本地

项目中需要读取php中图片保存到服务器同时将图片地址写入数据库,phpexcel示例代码如下:

<?php   
ini_set("display_errors",1);  
   
include 'PHPExcel.php';  
include 'PHPExcel/IOFactory.php';  
   
define('EXCEL_EXTENSION_2003', "xls");  
define('EXCEL_EXTENSION_2007', "xlsx");  
   
   
$fileName2003 = "file.xls";  
$fileName2007 = "file.xlsx";  
   
$fileName = $fileName2003;  
//$fileName = $fileName2007;  
   
if(getExtendFileName($fileName) == EXCEL_EXTENSION_2003)  
{  
    $reader = PHPExcel_IOFactory::createReader('Excel5');  
}  
else if(getExtendFileName($fileName) == EXCEL_EXTENSION_2007)  
{  
    $reader = new PHPExcel_Reader_Excel2007();  
}  

$PHPExcel = $reader->load($fileName);  
$worksheet = $PHPExcel->getActiveSheet();  
$imageInfo = extractImageFromWorksheet($worksheet,"savepath/");  

print_r($imageInfo);

/**
 * 检测文件类型
 *
 * @param      <type>  $file_name  The file name
 *
 * @return     <type>  The extend file name.
 */
function getExtendFileName($file_name) {  
    $extend = pathinfo($file_name);
    $extend = strtolower($extend["extension"]);
    return $extend;
}  

/**
 * 获取图片
 *
 * @param      <type>  $worksheet  The worksheet
 * @param      <type>  $basePath   The base path
 *
 * @return     array   ( description_of_the_return_value )
 */
function extractImageFromWorksheet($worksheet, $basePath){  
    $result = array();  
    $imageFileName = "";  
    foreach ($worksheet->getDrawingCollection() as $drawing) {  
        $xy=$drawing->getCoordinates();  
        $path = $basePath;  
        // for xlsx  
        if ($drawing instanceof PHPExcel_Worksheet_Drawing) {  
            $filename = $drawing->getPath();  
            $imageFileName = $drawing->getIndexedFilename();  
            $path = $path . $drawing->getIndexedFilename();  
            copy($filename, $path);  
            $result[$xy] = $path;  
        // for xls  
        } else if ($drawing instanceof PHPExcel_Worksheet_MemoryDrawing) {  
            $image = $drawing->getImageResource();  
            $renderingFunction = $drawing->getRenderingFunction();  
            switch ($renderingFunction) {  
                case PHPExcel_Worksheet_MemoryDrawing::RENDERING_JPEG:  
                    $imageFileName = $drawing->getIndexedFilename();  
                    $path = $path . $drawing->getIndexedFilename();  
                    imagejpeg($image, $path);  
                    break;  
                case PHPExcel_Worksheet_MemoryDrawing::RENDERING_GIF:  
                    $imageFileName = $drawing->getIndexedFilename();  
                    $path = $path . $drawing->getIndexedFilename();  
                    imagegif($image, $path);  
                    break;  
                case PHPExcel_Worksheet_MemoryDrawing::RENDERING_PNG:  
                    $imageFileName = $drawing->getIndexedFilename();  
                    $path = $path . $drawing->getIndexedFilename();  
                    imagegif($image, $path);  
                    break;
                case PHPExcel_Worksheet_MemoryDrawing::RENDERING_DEFAULT:  
                    $imageFileName = $drawing->getIndexedFilename();  
                    $path = $path . $drawing->getIndexedFilename();  
                    imagegif($image, $path);  
                    break;
            }
            $result[$xy] = $imageFileName;
        }
    }
    return $result;
}

网站屏蔽指定省市 禁止IP查看网站

<?php 
    //屏蔽北上广
    $ip = get_client_ip();
    // $url = "http://ip.taobao.com/service/getIpInfo.php?ip=".$ip;
    $url = "http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=".$ip;
    $data = https_request($url);
    $data = json_decode($data, true);

    $region = $data['province'];
    if($region == '广东' || $region == '北京' || $region == '上海'){
        header("Content-type: text/html; charset=utf-8");
        echo "<h1>网站升级中</h1>";
        die;
    }

    /**
     * 获取访客IP地址
     *
     * @param      integer  $type   The type
     * @param      boolean  $adv    The advance
     *
     * @return     array    The client ip.
     */
    function get_client_ip($type = 0,$adv=false) {
        $type       =  $type ? 1 : 0;
        static $ip  =   NULL;
        if ($ip !== NULL) return $ip[$type];
        if($adv){
            if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
                $arr    =   explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
                $pos    =   array_search('unknown',$arr);
                if(false !== $pos) unset($arr[$pos]);
                $ip     =   trim($arr[0]);
            }elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
                $ip     =   $_SERVER['HTTP_CLIENT_IP'];
            }elseif (isset($_SERVER['REMOTE_ADDR'])) {
                $ip     =   $_SERVER['REMOTE_ADDR'];
            }
        }elseif (isset($_SERVER['REMOTE_ADDR'])) {
            $ip     =   $_SERVER['REMOTE_ADDR'];
        }
        // IP地址合法验证
        $long = sprintf("%u",ip2long($ip));
        $ip   = $long ? array($ip, $long) : array('0.0.0.0', 0);
        return $ip[$type];
    }

    /**
     * 获取接口数据
     *
     * @param      <type>  $url    The url
     *
     * @return     <type>  ( description_of_the_return_value )
     */
    function https_request($url){
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        $output = curl_exec($curl);
        curl_close($curl);
        return $output;
    }