php自定义函数集合

查找函数定义处

function func_dump($funcname)
{
    try {
        if (is_array($funcname)) {
            $func = new ReflectionMethod($funcname[0], $funcname[1]);
            $funcname = $funcname[1];
        } else {
            $func = new ReflectionFunction($funcname);
        }
    } catch (ReflectionException $e) {
        echo $e->getMessage();
        return;
    }
    $start = $func->getStartLine();
    $end =  $func->getEndLine();
    $filename = $func->getFileName();
    echo "函数{$funcname}被定义在【{$filename}】文件中第{$start}行到{$end}行\n";
}

二维数组排序函数


function sort_array(&$array, $keyid, $order = 'asc', $type = 'number')
{
    if (is_array($array)) {
        foreach ($array as $val) {
            $order_arr[] = $val[$keyid];
        }
        $order = ($order == 'asc') ? SORT_ASC : SORT_DESC;
        $type = ($type == 'number') ? SORT_NUMERIC : SORT_STRING;
        array_multisort($order_arr, $order, $type, $array);
    }
}

php ssl 发送邮件:fsockopen SSL routines:ssl3_get_server_certificate:certificate verify failed

php5.6版本以上发送的时候,报错:

image.png

官方说明:

It appears that in PHP 5.6.0 (at least the version in Debian jessie, with openssl 1.0.1h-3), this function *is* now validating SSL certificates (in a variety of ways). First, it appears to fail for untrusted certificates (i.e. no matching CA trusted locally), and secondly, it appears to fail for mismatched hostnames in the request and certificate.


解决方法:

1.设置openssl.cafile设置需要指向用于在远程主机上签名SSL证书的CA证书(此方法未验证)

2.禁用验证,fsockopen不支持流上下文,所以请改用stream_socket_client。它返回一个可用于fsockopen资源所有命令的资源。代码:

    $contextOptions = array(
    'ssl' => array(
        'verify_peer' => false, 
        'verify_peer_name' => false,
    )
);

$context = stream_context_create($contextOptions);


$this->smtp_conn = stream_socket_client("ssl://{$host}:{$port}", $errno, $errstr, 20, STREAM_CLIENT_CONNECT, $context);

3. 用swiftmailer的添加streamoptions参数进行设置

      'transport' => [
                'class' => 'Swift_SmtpTransport',
                'host' => env('MAIL_HOST'),
                'username' => env('MAIL_USERNAME'),
                'password' => env('MAIL_PASSWORD'),
                'port' => env('MAIL_PORT'),
                'encryption' => env('MAIL_ENCRYPTION'),
                'streamoptions' => array(
                    'ssl' => array(
                        'verify_peer'      => false, 
                        'verify_peer_name' => false,
                    ),
                ),
            ],

thinkphphelp(tp助手)升级版使用说明

yii框架中有gii,感觉很方便。所以就想tp也有脚手架这个东西,刚好网上有个朋友已经开发。刚好我在他的基础上做了些调整。首先感谢这个朋友开发出这个东西出来。

我定制这个主要适用于onethink,但并不是完美的,后续会继续升级和更新的。

image.png

  1. 添加了继承控制器,如图所示。

  2. 定制了onethink_backend后台主题模板。模板在Template\View下

  3. 添加了判断如果字段类型是date 显示时间控件 如图:

image.png

4.修复了thinkphphelper 存在的一些问题

项目地址如:https://github.com/fanlt/TPH

阿里云短信服务接入

最近在做发送短信的接口,用了阿里云的短信服务。分享自己的开发心得。

阿里主要提供了三个接口:短信发送API,短信查询API,短信消息API。

短信发送API:发送短信的接口(SendSms)。

短信查询API:短信记录查询接口(QuerySendDetails)。

短信消息API:SmsReport短信状态报告和SmsUp上行短信消息接口

步骤1.首先购买阿里云短信服务。

步骤2.去短信服务控制台去添加短信签名和短信模板

步骤3.下载官方sdk地址 

步骤4.开始你的代码,我是用php开发,这里用php做示例

下载的sdk目录如图所示:

image.png

api_demo:短信发送API、短信查询API demo 

api_sdk:短信发送API、短信查询API 所需要的sdk 

msg_demo: 短信消息API demo 

msg_sdk: 短信消息API 所需要sdk。

SmsDemo.php和MsgDemo.php 是官方给的例子

发送短信:

$demo = new SmsDemo(
    "your AccessKeyId",
    "your AccessKeySecret"
);

echo "SmsDemo::sendSms\n";
$response = $demo->sendSms(
    "短信签名名称", // 短信签名
    "短信模板CODE", // 短信模板编号
    "12345678901", // 短信接收者
    Array(  // 短信模板中字段的值
        "code"=>"12345",
    ),
    uniqid()
);
print_r($response);

查询短信记录:

$demo = new SmsDemo(
    "your AccessKeyId",
    "your AccessKeySecret"
);

$phoneNumbers = "12345678901";
$sendDate="20171024";
$response = $demo->queryDetails($phoneNumbers,$sendDate);
echo '<pre>';
print_r($response);

SmsReport短信消息报告

     $sms = new MsgDemo(
            "1943695596114318",
              "your AccessKeyId",
            "your AccessKeySecret"
        );

        $sms->receiveMsg(
            "SmsReport",
            "Alicom-Queue-10391693-SmsReport",
             function ($message) {
                $message = json_encode($message,JSON_UNESCAPED_UNICODE);
               file_put_contents(\Yii::getAlias('@root').'/logs/msg.log',$message.PHP_EOL,FILE_APPEND);
                return true;
            }
        );

SmsUp上行短信

  $sms = new MsgDemo(
            "1943695596114318",
              "your AccessKeyId",
            "your AccessKeySecret"
        );

        $sms->receiveMsg(
            "SmsUp",
            "Alicom-Queue-10391693-SmsUp",
           function ($message) {
            $message = json_encode($message,JSON_UNESCAPED_UNICODE);
              file_put_contents(\Yii::getAlias('@root').'/logs/msg.log',$message.PHP_EOL,FILE_APPEND);
                return true;
            }
        );

注:

Alicom-Queue-10391693-SmsReport 和 Alicom-Queue-10391693-SmsUp 是你订阅了短信状态报告接收短信上行消息接收后阿里云给予的列队名称 如下图所示

image.png