Unicode 空白字符 \u00a0


2018-07-18 22:41
zpq
80

最近在做网页抓取数据这块遇到一个神奇的问题

php 中的 trim 函数一直不能去空,也差了很多资料,说是空白字符。
就索性用 json_encode 一下,果然发现问题,会有一个\u00a0 字符
搜了下意思是 不换行空格。。

其他的空格描述

laravel 5.4 redis 报错 'Predis\Response\ServerException' with message 'ERR unknown command 'EVAL''


2017-06-15 17:33
zpq
880

在laravel 5.2 迁移到 5.4 出现错误

这个错误不是框架错误 是 redis 版本 过低导致的 !!

redis eval 命令必须在版本 >= 2.6.0

之前安装redis的时候是用yum命令安装的。

安装的版本是2.4.10 找不到高版本的yum安装方式

没办法只能编译安装

编译安装官网也有,这里顺便也复制下来

wget http://download.redis.io/releases/redis-3.2.9.tar.gz
tar xzf redis-3.2.9.tar.gz
cd redis-3.2.9
make
src/redis-server
src/redis-cli

redis 默认是前台运行的 后台运行需要修改配置文件redis.conf
大约在 128 行

# By default Redis does not run as a daemon. Use 'yes' if you need it.
# Note that Redis will write a pid file in /var/run/redis.pid when daemonized.
daemonize no

no 改成 yes 保存 然后执行命令

./redis-server [/path/to/redis.conf]

laravel 5.4 报错SQLSTATE[42000] Syntax error or access violation 1055 'xxx' isn't in GROUP BY


2017-06-09 12:30
zpq
182

查询mysql 1055错误码发现问题为在mysql的配置中如果设置了sql_mode包含ONLY_FULL_GROUP_BY值得话,在进行查询时需要将select的字段都包含在group by 中。
即 select x,y from xxx group by x,y
否则就会报错

但是查看自己的配置my.cnf发现在sql_mode中并没有ONLY_FULL_GROUP_BY这个值

然后去查看Laravel的配置文件,config/database.php,查找mysql的配置,

'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', 'localhost'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'charset' => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix' => env('DB_PREFIX',''),
            'strict' => true,
            'engine' => null,
        ],

发现有个strict项,默认为true,上网也没有查找到相关解释,根据字面意思猜测可能为是否开启严格模式,将其修改为false,再次测试发现问题解决,可以输出正确结果
源代码解释
vendor\laravel\framework\src\Illuminate\Database\Connectors\MySqlConnector.php 约144行

protected function setModes(PDO $connection, array $config)
    {
        if (isset($config['modes'])) {
            $this->setCustomModes($connection, $config);
        } elseif (isset($config['strict'])) {
            if ($config['strict']) {		//这边有个判断如果是true则执行strictMode()方法所以要改为false
                $connection->prepare($this->strictMode())->execute();
            } else {
                $connection->prepare("set session sql_mode='NO_ENGINE_SUBSTITUTION'")->execute();
            }
        }
    }
protected function strictMode()
    {
        return "set session sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'";
    }

也可以编辑 /etc/my.cnf 文件
在**[mysqld]**追加

~~```
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"


~~重启mysql即可。~~

关闭X-Powered-By 信息(隐藏PHP版本信息)


2017-06-02 14:28
zpq
94


会暴露服务器运行的是php

修改 php.ini 文件 设置 expose_php = Off

官方给出的说明

Decides whether PHP may expose the fact that it is installed on the server
(e.g. by adding its signature to the Web server header). It is no security
threat in any way, but it makes it possible to determine whether you use PHP
on your server or not.

决定服务器上是否暴露安装有PHP,
(例如:把这些信息加到Web服务器头响应)。这是不安全的。
但能确定你的服务器时候运行着PHP。
意思就是打开的话可以告诉其他人这台服务器可以运行PHP,但不一定安全,可以关掉

微信支付报错“支付签名验证失败”


2017-06-01 22:06
zpq
199

微信支付有几个地方需要注意的

  • sign 签名时需要在末尾增加key参数 key 参数在商户后台进行设置 sign签名验证
  • wx.config 签名验证工具 url 参数必须是当前js运行所在的url(包括参数) 如果签名失败可能跟支付的授权目录有关
  • 微信创建统一订单时返回的数据格式中只有prepay_id参数有用,其他返回的参数无用
  • wx.chooseWXpay 在调起微信支付时需要二次签名(sign签名),其中有个地方需要注意(巨坑)。具体二次签名如下
$appid = 'appid';              //appid
$randstr = '123123213213';     //随机字符串
$time = '123456789';           //时间戳
$key = 'keyyyyyyyy';           //商户后台设置的key
$prepayid = 'wx2017060115493564b5a926a10145685802';//假设统一订单返回的prepayid
$prepayid = 'prepay_id='.$prepayid;//这里要组装(我是坑)
        $signstr = "appId={$appid}&nonceStr={$randstr}&package={$prepayid}&signType=MD5&timeStamp={$time}&key={$key}";
//生成需要签名的字符串为
//appId=appid&nonceStr=123123213213&package=prepay_id=wx2017060115493564b5a926a10145685802&signType=MD5&timeStamp=123456789&key=keyyyyyyyy";
$paysign = strtoupper(md5($signstr));
//data 为返回为前台数据
$data = [
    'nonceStr' => $randstr,
    'timestamp' => $time,
    'signType' => 'MD5',
    'paySign' => $paysign,
    'package' => $prepayid,
];
  • wx.chooseWXpay 中有个参数timestamp 不是timeStamp 需要签名的时间戳都是timeStamp js里的都是小写的。

自己搭建一个动态域名服务DDNS


2017-03-31 11:21
zpq
830

DDNS

DDNS(Dynamic Domain Name Server)是动态域名服务的缩写。

DDNS是将用户的动态IP地址映射到一个固定的域名解析服务上,用户每次连接网络的时候客户端程序就会通过信息传递把该主机的动态IP地址传送给位于服务商主机上的服务器程序,服务器程序负责提供DNS服务并实现动态域名解析。

需求对象

家庭/公司内部服务需要对外公开,但却没有固定IP的用户。

服务搭建条件

  1. 有自己的域名
  2. 有操作域名SDK(这里我用的是阿里云的万网)
  3. 内部服务器(不经常关机就行)
  4. 开发能力

服务运行流程