标签 PHP 下的文章

php将base64保存为图片

<?php 
$base64_url = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADkAAAA5CAYAAACMGIOFAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkNFN0E3M0I0Mjc4NDExRTU5RkYxQjg1Rjk2QkEyNzBEIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkNFN0E3M0I1Mjc4NDExRTU5RkYxQjg1Rjk2QkEyNzBEIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6Q0U3QTczQjIyNzg0MTFFNTlGRjFCODVGOTZCQTI3MEQiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6Q0U3QTczQjMyNzg0MTFFNTlGRjFCODVGOTZCQTI3MEQiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6o6V5PAAADu0lEQVR42uyaTUgVURTHm/cigiS1LEitoHoqbgtcZAStngtDoYxa9rFsYYuWfUBhuSjCneiylkH2oavoEZlC4aYsM9toakWLnpsWyfQfOMJrOvdjZs6bedQc+OF7d9499/y9M/fj3HFc110Xo3WAYfp8BozG0agTs8hFsIM+L4H6f1GkvzEnjkYz6/4DS0WmIlORSlsq+bxcKSI3gkHwBlwSGA3PkrjPNE+GnhXAZYprkOLUjOmYQjT0un/aMHAMdcqNQ3GUWq+ujqknt/i+nwZDcc1vih4cojh0cQbqyQaw4P5tSfQo14OezYNGXV0b5zly5Le+mEX2KQTmTHVtl3U58BQ0lpQtgJ2Gei2gE7SDVrANVIMf4Bt4B56Dh+C9wdc80/4RMGteTNr/J/09+lhzW3WBCTeYTVA91WPwKGgPBrldS9kFBkA/qGOuN4FnbjTz6jczvuuoXa/93UHilnxmjoMVV8ZWyJ9IbFICz4FVV9ZWyW9FiDwGfmmCnQIXQBuoBxvobxuVT2nqen57khbpPYNFRYBzoNtiPnXod3MKP0VqJxGRjmaQGQXVAf1VUz3VYOQkIbJLEdADkA3pM0v1OetKQuQ4E8gHUBXxEfDqzzC+x+MW2aL4b+eFRuu8wn9LGH9hN82dTNlrMCa02xgjf347GmdmoJ0puyu8rbrHlB2MU2QrUzYuLLJg2a6VyA7KbLsMi3Tdb9sVuwRJ+2TZrjF+b+4pTd2rkk/1hky4Z+vBapkz7lzW3Ri/ze3KpTqKTNlmYYG1TNlKmJRJpiSDxpkqq/aVKdsrLHIPU/ZFkwFUxu/dYk8M3c3ZNNjnKzsEXgmKPKxo12/G+MOOri+YslPCPXnSst2yTSEjTNkBkBcSmCd/Nu1aDF/hl15cDmdGYO26SXrtGuUs5AZT1kQrn2xIn1la6TQx1/rDT0TR9pMFxUL6fogeraJ6nBWS2k+uZQZUyauPtOO38dNNv1cltZqTzvH0WOZ49oMaqlND321yPCfSbF2ad5UXufaMFiIKLER9BqOK9Ea4m2CZEk61mrOQyYDiJjUpzFpqb5nad8olkjsfvG6RC7oIRsBsSY62SN9H6Lopd3MtyvmorcCM4gD0dkxnk7eiHARHEWg84RWkUXPinZEQeSXsCa8wOYXQqxIi31aAQN3R/rTEAv1lqCNs3taSTqoEmclmqf2FIFlCm3cGvBeBzoOt4I7vraqgJvW+awPF9B0MgJ9RRZYz+5a+75qKTEWmIstuFfm+q7RJve8ayH4LMACaxEJEaXs23AAAAABJRU5ErkJggg==';

preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_url, $result);
$type = $result[2];

$base64_body = substr(strstr($base64_url,','),1);
$img = base64_decode($base64_body);

$file_name_ok = md5(time()).".".$type;
file_put_contents($file_name_ok, $img);

PHP常用函数汇总

中文等多字节字符串翻转

$str = '字符串反转';

function rev($str, $encoding = 'utf-8'){
    $len = mb_strlen($str, $encoding);
    $result = '';

    for ($i = $len-1; $i>=0; $i--){
        $result.= mb_substr($str,$i,1,$encoding);
    }

    return $result;
}

echo rev($str);

生成圆形头像:

test('2.jpg','1.jpg'); #2原图 1生成图
function test($url,$path='./'){  
    $w = 100;  $h=100; // original size  
    $original_path= $url;  
    $dest_path = $path.uniqid().'.png';  
    $src = imagecreatefromstring(file_get_contents($original_path));  
    $newpic = imagecreatetruecolor($w,$h);  
    imagealphablending($newpic,false);  
    $transparent = imagecolorallocatealpha($newpic, 0, 0, 0, 127);  
    $r=$w/2;  
    for($x=0;$x<$w;$x++)  
        for($y=0;$y<$h;$y++){  
            $c = imagecolorat($src,$x,$y);  
            $_x = $x - $w/2;  
            $_y = $y - $h/2;  
            if((($_x*$_x) + ($_y*$_y)) < ($r*$r)){  
                imagesetpixel($newpic,$x,$y,$c);  
            }else{  
                imagesetpixel($newpic,$x,$y,$transparent);  
            }  
        }  
    imagesavealpha($newpic, true);  
    imagepng($newpic, $dest_path);  
    imagedestroy($newpic);  
    imagedestroy($src);  
   // unlink($url);  
    return $dest_path;  
} 

curl随机IP访问:

function curl($url,$ifpost = 0, $datafields = '', $cookiefile = '', $v = false){
    $ip_long = array(
        array('607649792', '608174079'), //36.56.0.0-36.63.255.255
        array('1038614528', '1039007743'), //61.232.0.0-61.237.255.255
        array('1783627776', '1784676351'), //106.80.0.0-106.95.255.255
        array('2035023872', '2035154943'), //121.76.0.0-121.77.255.255
        array('2078801920', '2079064063'), //123.232.0.0-123.235.255.255
        array('-1950089216', '-1948778497'), //139.196.0.0-139.215.255.255
        array('-1425539072', '-1425014785'), //171.8.0.0-171.15.255.255
        array('-1236271104', '-1235419137'), //182.80.0.0-182.92.255.255
        array('-770113536', '-768606209'), //210.25.0.0-210.47.255.255
        array('-569376768', '-564133889'), //222.16.0.0-222.95.255.255
    );
    $rand_key = mt_rand(0, 9);
    $ip= long2ip(mt_rand($ip_long[$rand_key][0], $ip_long[$rand_key][1]));


    $header = array("Connection: Keep-Alive","Accept: text/html, application/xhtml+xml, */*", "Pragma: no-cache", "Accept-Language: zh-Hans-CN,zh-Hans;q=0.8,en-US;q=0.5,en;q=0.3","User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)",'CLIENT-IP:'.$ip,'X-FORWARDED-FOR:'.$ip); 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_HEADER, $v); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header); 
    $ifpost && curl_setopt($ch, CURLOPT_POST, $ifpost); 
    $ifpost && curl_setopt($ch, CURLOPT_POSTFIELDS, $datafields); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
    $cookiefile && curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile); 
    $cookiefile && curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile); 
    curl_setopt($ch,CURLOPT_TIMEOUT,30); //允许执行的最长秒数
    $ok = curl_exec($ch); 
    curl_close($ch); 

    unset($ch);
    return $ok;

}
print_r(curl("https://www.r1989.com"));

PHP获取上一个月 下一个月

如果当前为2018-01-29则通过echo date("Y-m",strtotime("+1 month"));则会得出3月的错误结果

function GetMonth($sign="1")  
{  
    //得到系统的年月  
    $tmp_date=date("Ym");  
    //切割出年份  
    $tmp_year=substr($tmp_date,0,4);  
    //切割出月份  
    $tmp_mon =substr($tmp_date,4,2);  
    $tmp_nextmonth=mktime(0,0,0,$tmp_mon+1,1,$tmp_year);  
    $tmp_forwardmonth=mktime(0,0,0,$tmp_mon-1,1,$tmp_year);  
    if($sign==0){  
        //得到当前月的下一个月   
        return $fm_next_month=date("Ym",$tmp_nextmonth);          
    }else{  
        //得到当前月的上一个月   
        return $fm_forward_month=date("Ym",$tmp_forwardmonth);           
    }  
}  

echo GetMonth('0');

PHP修改PNG图片DPI

来源:http://www.codeweblog.com/php%E4%BF%AE%E6%94%B9png%E5%9B%BE%E7%89%87dpi/
最近使用PHP生成图片用于打印,但是浏览器默认输出为72DPI,打印要求为300DPI,如果直接打印,图片会比较模糊。
在网上找了一圈,大部分链接都指向ImageMagick,但是我的项目部署在新浪SAE,新浪SAE不支持它。继续找,发现了《PHP 使用GD函式庫更改圖片DPI》这篇文章,提供了修改JPG图片分辨率的方法,亲测可行。但是我的项目必须使用PNG图片,因为用的是透明背景,所以上面的方法还不行,但是可以参考思路。后来又找到了另外一篇文章《PHP: Dpi of a png image》,这篇文章提供了获取PNG图片分辨率的方法,遗憾的是作者并没有给出设置分辨率的方法。
最后,被逼无奈,硬着头皮自己写啦,挣扎一番终于成功了。这是我写的测试例子:

<?php
$filename = 'img/example.png';
// ob_start();
// $im = imagecreatefrompng($filename);
// imagepng($im);
// $file = ob_get_contents();
// ob_end_clean();
$file = file_get_contents($filename);

//数据块长度为9
$len = pack("N", 9);
//数据块类型标志为pHYs
$sign = pack("A*", "pHYs");
//X方向和Y方向的分辨率均为300DPI(1像素/英寸=39.37像素/米),单位为米(0为未知,1为米)
$data = pack("NNC", 300 * 39.37, 300 * 39.37, 0x01);
//CRC检验码由数据块符号和数据域计算得到
$checksum = pack("N", crc32($sign . $data));
$phys = $len . $sign . $data . $checksum;

$pos = strpos($file, "pHYs");
if ($pos > 0) {
    //修改pHYs数据块
    $file = substr_replace($file, $phys, $pos - 4, 21);
} else {
    //IHDR结束位置(PNG头固定长度为8,IHDR固定长度为25)
    $pos = 33;
    //将pHYs数据块插入到IHDR之后
    $file = substr_replace($file, $phys, $pos, 0);
}

header("Content-type: image/png");
header('Content-Disposition: attachment; filename="' . basename($filename) . '"');
echo $file;
?>

这篇文章应该也可以作为《各位兄弟姐妹,php 怎么可以生成一张300分辨率的图片,谢谢》的一个答案。
本文参考的其他资料:
《W3C PNG Specification》
《png文件的数据结构》
《分析PNG图像文件结构(3)》
在网上搜索的过程中还遇到了一些有用的资料,也放在这里吧:
《JavaScript修改Canvas图片的分辨率(DPI)》
《PNG设置分辨率》(使用了Linux函数png_set_pHYs)
最后说一句,有条件还是使用ImageMagick,没必要这么折腾!

curl: (60) SSL certificate problem: unable to get local issuer certificate 错误

由于没有配置信任的服务器HTTPS验证。默认,cURL被设为不信任任何CAs,就是说,它不信任任何服务器验证。
解决:
下载:https://github.com/bagder/ca-bundle/blob/e9175fec5d0c4d42de24ed6d84a06d504d5e5a09/ca-bundle.crt
放置php5.6.31\extras\ssl目录下

php.ini搜索curl.cainfo配置地址:"D:\install\wamp64\bin\php\php5.6.31\extras\ssl\ca-bundle.crt"

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);*/

PHP判断系统为windows还是linux

函数php_uname()返回所运行的系统信息。php_uname([string $mode]);
$mode可选参数:
'a': 返回所有信息
's': 操作系统的名称,如FreeBSD
'n': 主机的名称,如cnscn.org
'r': 版本名,如5.1.2-RELEASE
'v': 操作系统的版本号
'm': 核心类型,如i386

echo strtoupper(substr(PHP_OS,0,3))==='WIN'?'windows 服务器':'不是 widnows 服务器';
echo DIRECTORY_SEPARATOR=='\\'?'windows 服务器':'不是 widnows 服务器'; //根据分隔符判断
echo PATH_SEPARATOR==';'?'windows 服务器':'不是 widnows 服务器'; //根据PATH分割符判断