php 开启微信公众号开发者模式

php 开启微信公众号开发者模式

<?php
/**
  * wechat php test
  */
header('Content-type:text');
//define your token
//定义TOKEN密钥
define("TOKEN", "weixin");
//实例化微信对象
$wechatObj = new wechatCallbackapiTest();
//验证成功后注释掉valid方法
$wechatObj->valid();
//开启自动回复功能
$wechatObj->responseMsg();
//定义类文件
class wechatCallbackapiTest
{
    //实现valid验证方法:实现对接微信公众平台
    public function valid()
    {
        //通过GET请求接收随机字符串
        $echoStr = $_GET["echostr"];
        //调用checkSignature方法进行用户(开发者)数字签名验证
        //valid signature , option
        if($this->checkSignature()){
            //如果成功,则返回接收到的随机字符串
            echo $echoStr;
            //并退出
            exit;
        }
    }

    public function responseMsg()
    {
        //get post data, May be due to the different environments
        //接收用户端(客户)发送过来的XML数据
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

          //extract post data
        //判断XML数据是否为空
        if (!empty($postStr)){
                /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
                   the best way is to check the validity of xml by yourself */
                libxml_disable_entity_loader(true);
                //通过simplexml进行xml解析     PHP中有两大类可以完成对XML的解析,1.PHP的Dom模型2.通过simplexml模型
                  $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
                //手机端
                $fromUsername = $postObj->FromUserName;
                //微信公众平台
                $toUsername = $postObj->ToUserName;
                //接收用户发送的关键词
                $keyword = trim($postObj->Content);
                //时间戳
                $time = time();
                //文本发送模板
                $textTpl = "<xml>
                            <ToUserName><![CDATA[%s]]></ToUserName>
                            <FromUserName><![CDATA[%s]]></FromUserName>
                            <CreateTime>%s</CreateTime>
                            <MsgType><![CDATA[%s]]></MsgType>
                            <Content><![CDATA[%s]]></Content>
                            <FuncFlag>0</FuncFlag>
                            </xml>";   
                //判断用户发送关键词是否为空
                if(!empty( $keyword ))
                {
                    //回复类型,如果为"text",代表文本类型
                      $msgType = "text";
                    //回复内容
                    $contentStr = "Welcome to wechat world!";
                    //格式化字符串(对xml进行格式化操作,把里面相关的变量格式化成字符串)
                    $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                    //把XML数据返回给手机端
                    echo $resultStr;
                }
                //如果用户发送的关键词为空,则返回下列字符串
                else{
                    echo "Input something...";
                }

        }else {
            echo "";
            exit;
        }
    }
    
    //定义checkSignature方法
    private function checkSignature()
    {
        // you must define TOKEN by yourself
        
        //判断TOKEN密钥是否定义
        if (!defined("TOKEN")) {
            //如果没有定义则抛出异常,返回'TOKEN is not defined!'字符串
            throw new Exception('TOKEN is not defined!');
        }
        //接收微信加密签名
        $signature = $_GET["signature"];
        //接收时间戳信息
        $timestamp = $_GET["timestamp"];
        //接收随机数
        $nonce = $_GET["nonce"];
        //把TOKEN常量赋值给$token变量    
        $token = TOKEN;
        //把相关参数组装为数组(密钥文件、时间戳、随机数)
        $tmpArr = array($token, $timestamp, $nonce);
        // use SORT_STRING rule
        //通过字典法进行排序
        sort($tmpArr, SORT_STRING);
        //把排序后的数组转化为字符串
        $tmpStr = implode( $tmpArr );
        //通过哈希算法对字符串进行加密操作
        $tmpStr = sha1( $tmpStr );
        //与加密签名进行对比
        if( $tmpStr == $signature ){
            return true;
        }else{
            return false;
        }
    }
}

?>

1 TOKEN要跟微信公众号后台的TOKEN对应就行
2 $wechatObj->valid(); 微信公众号后台验证完就可以注释掉

php ffmpeg视频和序列帧转化

php ffmpeg视频和序列帧转化

$cmd=shell_exec("ffmpeg -i ".__DIR__ . "/shipin1.mp4 -r 25 -q:v 2   ".__DIR__ . "/testxulie/%03d.jpg");
        print_r($cmd);
        exit();
       $cmd = shell_exec("ffmpeg -i ".__DIR__ . "/testxulie/%03d.jpg -c:v copy -c:a copy  ".__DIR__ . "/testxulie/1.mp4");
        print_r($cmd);
        exit();

ps:-c:v copy -c:a这个是保证无损压缩的 -q:v 2保证无损导出图片 如果导出图片无损 一般图片很大 最终图片再拼成视频都要压缩

php imagick蒙版做法

php imagick蒙版做法

   $image = new \Imagick();
        $image->readImage(__DIR__ . '/mengban.png');
        $watermark = new \Imagick();
        $watermark->readImage(__DIR__ . '/testmengban.jpg');
        /*$watermark->scaleImage(750, 1206, true); *///放到等比例按照宽度缩小图片 按照
        $image->compositeImage($watermark, \imagick::COMPOSITE_ATOP, 0, 0);
        $image->writeImage(__DIR__ . '/mengbanresult.png');

ps:注意蒙版和最终生成的图片都要png

这个是imagick 其他一些的教程 http://www.netingcn.com/category/imagemagick

php debug_backtrace方法跟踪代码调用

php debug_backtrace方法跟踪代码调用

function    string  当前的函数名,参见: __FUNCTION__。
line        integer 当前的行号。参见: __LINE__。
file        string  当前的文件名。参见: __FILE__。
class       string  当前 class 的名称。参见 __CLASS__
object      object  当前的 object。
type        string  当前调用的类型。如果是一个方法,会返回 "->"。如果是一个静态方法,会返回 "::"。 如果是一个函数调用,则返回空。
args        array   如果在一个函数里,这会列出函数的参数。 如果是在一个被包含的文件里,会列出包含的文件名。

index.php

<?php
require 'order.php';

// 获取用户订单资料
$order_id = 1000000;

$oOrder = new Order;
$order_info = $oOrder->get_order($order_id);
?>

order.php

<?php
require 'user.php';

// 订单资料
class Order{

    // 获取订单资料
    function get_order($order_id){

        $user_id = 1001;

        // 获取用户资料
        $oUser = new User;
        $user_info = $oUser->get_user($user_id);

        // 订单资料
        $order_info = array(
            'order_id' => $order_id,
            'order_name' => 'my order',
            'user_info' => $user_info,
        );

        return $order_info;

    }

}
?>

user.php

<?php
require 'message.php';

// 用户资料
class User{

    // 获取用户资料
    function get_user($user_id){

        // 获取用户讯息
        $oMessage = new Message;
        $user_message = $oMessage->get_message($user_id);

        $user_info = array(
                'user_id' => $user_id,
                'name' => 'fdipzone',
                'message' => $user_message
        );

        return $user_info;

    }

}
?>

message.php

<?php
// 用户讯息
class Message{

    // 获取用户讯息
    function get_message($user_id){

        $message = array(
            array('id'=>1, 'title'=>'message1'),
            array('id'=>2, 'title'=>'message2'),
        );

        // 加入跟踪调试
        $backtrace = debug_backtrace();
        var_dump($backtrace);

        return $message;

    }

}
?>
/message.php:15:
array (size=3)
  0 => 
    array (size=7)
      'file' => string '/user.php' (length=9)
      'line' => int 12
      'function' => string 'get_message' (length=11)
      'class' => string 'Message' (length=7)
      'object' => 
        object(Message)[3]
      'type' => string '->' (length=2)
      'args' => 
        array (size=1)
          0 => int 1001
  1 => 
    array (size=7)
      'file' => string '/order.php' (length=10)
      'line' => int 14
      'function' => string 'get_user' (length=8)
      'class' => string 'User' (length=4)
      'object' => 
        object(User)[2]
      'type' => string '->' (length=2)
      'args' => 
        array (size=1)
          0 => int 1001
  2 => 
    array (size=7)
      'file' => string '/index.php' (length=9)
      'line' => int 8
      'function' => string 'get_order' (length=9)
      'class' => string 'Order' (length=5)
      'object' => 
        object(Order)[1]
      'type' => string '->' (length=2)
      'args' => 
        array (size=1)
          0 => int 1000000

可以看到调用过程是

1.index.php 
line 8 
class Order 
function get_order 
args int 1000000

2.order.php 
line 14 
class User 
function get_user 
args int 1001

3.user.php 
line 12 
class Message 
function get_message 
args int 1001

这个方法主要看 某个函数是调用方式是怎么样的 来解决问题的

php imagick svg转成jpg

php imagick svg转成jpg

  public function svgtojpg()
    {
        $image    = '<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg width="400" height="300" viewBox="0,0,40,30" style="border:1px solid #cd0000;" version="1.1"
xmlns="http://www.w3.org/2000/svg">
  <rect x="0" y="0" width="40" height="30" fill="#cd0000"/>

</svg>
';
        $filename = 'ef.jpg';
        /*  $image    = stripslashes($_POST['json']);
        $filename = $_POST['filename'];*/
        $unique = time();
        $im     = new \Imagick();
        $im->readImageBlob($image);
        $res     = $im->getImageResolution();
        $x_ratio = $res['x'] / $im->getImageWidth();
        $y_ratio = $res['y'] / $im->getImageHeight();
        $im->removeImage();
        $im->setResolution($width_in_pixels * $x_ratio, $height_in_pixels * $y_ratio);
        $im->readImageBlob($image);
        $im->setImageFormat("jpeg");
        $im->writeImage(__DIR__ . '/../../../Public/moban/images/1/humourised_'. $filename);
        $im->clear();
        $im->destroy();
    }

win7 安装php插件imagick

 

 

win7 安装php插件imagick

 

安装步骤:

步骤一:先安装好扩展包

之所以先安装扩展是因为扩展的版本要与软件版本对应,而扩展版本出来的速度比软件版本要慢得多,所以总是没法支持最新版本的软件,因此最好是根据自己安装的扩展来选择安装的ImageMagick软件版本。

首先Imagic的php扩展包下载地址:http://pecl.php.net/package/imagick

首先根据你自己的php版本选择,如果不知道自己的版本可以查看phpinfo,下面我截图自己的给个示范:

下面红框标识的地方都是要注意的,最上面是php版本,我的是5.5.30版本的,另外是服务器环境是x86的,也就是32位的,如果这里是64就是64位的,要注意。

再接着就是看php的安全线程情况:disabled是关闭状态,enable是开启状态,我的安全线程是关闭的,这里一定要留意

下面来看上面的下载页面是什么情况:这里有最新的各个版本imagick的php扩展,也写明了要求的版本,这里支持的ImageMagick版本是6.5.3-6.10的,并且php版本要高于5.4。

如果你的php版本低于这个,那么可能你需要找更低的扩展版本了,而且软件的版本也随之更低,这篇博文与你的安装情况应该是有出入的,顶多做个参考,例如低版本的ImageMagick是需要手动进行系统变量path配置的,高版本的都自动安装时勾选了自动配置了。

好了下面进入上面给的扩展下载页面会看到如下图片的显示:

红框里是我选择的版本,基本上这个是最新的且是稳定版本所以还是很好的选择,当然也可以根据自己的情况选择其他的版本,但注意选择stable稳定版本比较好,点击蓝色windows标识的DDL进入windows的版本选项,下面有截图。

根据上面我们看phpinfo得到的各个参数,这里选择php5.5版本的,并且是Non Thread Safe版本,同时32位,因此应该选择红框里的版本下载。

下载完毕后我们来看看里面有些什么东西:

用红框标识的都是在php安装imagick扩展所需要用到的:

1)最下面的php_imagick.dll放入php安装文件夹的ext扩展文件夹内

2)上面的dll文件直接放入php安装文件夹,如果是phpstudy多版本的php话,放入自

ps:这个地方同样dll还要放到apache里的bin目录里面 切记

己使用的版本对应的文件夹,例如php55n就是指php5.5以上但不高于5.6的版本

再来就是改php的配置文件,打开php.ini文件,像下图那样加上extension=php_imagick.dll的扩展配置。

完成这些配置后,重启电脑和服务器再打开phpinfo就可以看到imagick的扩展了,如果phpinfo里没有imagick则标识扩展表示没有安装成功,错误的可能性是服务器参数和php参数与imagick扩展参数不一致导致,因此检查上述的版本是否对应一致。

然后看phpinfo里面的imagick

查看这个Imagick compiled with ImageMagick version这个参数 ImageMagick 6.8.9-1 Q16 x86 2014-05-08 要安装这个 版本一定要对应 装好以后

 

需要 新建一个系统环境变量名为MAGICK_HOME,值为E:\你的imagick路径\modules\coders, 这步主要用来定位imagemagick的module,很重要。( 否则支持的图片格式数量默认为0 ImageMagick number of supported formats:  => 0 )

 

然后重启(必须重启)

然后再看PHPinfo ImageMagick supported formats 就会出现信息了 就是安装完成了 可以用了

如果没有信息 那就没办法了

 

这个是所有imagick历史版本 http://ftp.icm.edu.pl/packages/ImageMagick/binaries/

 

PHP判断是否为手机端的方法

PHP判断是否为手机端的方法

private function ismobile()
{
// 如果有HTTP_X_WAP_PROFILE则一定是移动设备
if (isset($_SERVER[‘HTTP_X_WAP_PROFILE’])) {
return true;
}

//此条摘自TPM智能切换模板引擎,适合TPM开发
if (isset($_SERVER[‘HTTP_CLIENT’]) && ‘PhoneClient’ == $_SERVER[‘HTTP_CLIENT’]) {
return true;
}

//如果via信息含有wap则一定是移动设备,部分服务商会屏蔽该信息
if (isset($_SERVER[‘HTTP_VIA’]))
//找不到为flase,否则为true
{
return stristr($_SERVER[‘HTTP_VIA’], ‘wap’) ? true : false;
}

//判断手机发送的客户端标志,兼容性有待提高
if (isset($_SERVER[‘HTTP_USER_AGENT’])) {
$clientkeywords = array(
‘nokia’, ‘sony’, ‘ericsson’, ‘mot’, ‘samsung’, ‘htc’, ‘sgh’, ‘lg’, ‘sharp’, ‘sie-‘, ‘philips’, ‘panasonic’, ‘alcatel’, ‘lenovo’, ‘iphone’, ‘ipod’, ‘blackberry’, ‘meizu’, ‘android’, ‘netfront’, ‘symbian’, ‘ucweb’, ‘windowsce’, ‘palm’, ‘operamini’, ‘operamobi’, ‘openwave’, ‘nexusone’, ‘cldc’, ‘midp’, ‘wap’, ‘mobile’,
);
//从HTTP_USER_AGENT中查找手机浏览器的关键字
if (preg_match(“/(” . implode(‘|’, $clientkeywords) . “)/i”, strtolower($_SERVER[‘HTTP_USER_AGENT’]))) {
return true;
}
}
//协议法,因为有可能不准确,放到最后判断
if (isset($_SERVER[‘HTTP_ACCEPT’])) {
// 如果只支持wml并且不支持html那一定是移动设备
// 如果支持wml和html但是wml在html之前则是移动设备
if ((strpos($_SERVER[‘HTTP_ACCEPT’], ‘vnd.wap.wml’) !== false) && (strpos($_SERVER[‘HTTP_ACCEPT’], ‘text/html’) === false || (strpos($_SERVER[‘HTTP_ACCEPT’], ‘vnd.wap.wml’) < strpos($_SERVER['HTTP_ACCEPT'], 'text/html')))) { return true; } } return false; }