php报错:A non well formed numeric value encountered

问题:

处理时间的时候报错: A non well formed numeric value encountered

通常为了后去数据更新的时间,往往存储数据时加入时间戳字段,读取时间戳并使用date函数处理时PHP报错。

解决方法:

这种现象常常出现在弱类型语言上,读取的时间戳并不是真正的int类型, 这种问题经常出现在从数据库中提取出数据,但是数据不是int类型的,可能是varchar等等,大家可以使用intval()函数将非格式良好的数据转换成良好的数据类型就OK了!

[php collapse=”false”]
<?php
$time = …..//数据库获取时间戳
$time = intval($time);//强制转换为整型
echo date(‘y-m-d H:i:s’,$time);
[/php]

Lcrawl正方教务系统爬虫框架正式发布!

之前一直在写的正方教务系统爬虫框架终于写出了V1.0版本,目前已经实现通过模拟登陆来获取成绩、课表、选课、考试、等级考试、补考、成绩统计等数据的爬取并过滤存储。

一、项目简介

Lcrawl正方教务系统爬虫框架 采用PHP+MySQL 目前已经实现通过模拟登陆来获取成绩、课表、选课、考试、等级考试、补考、成绩统计等数据的爬取并过滤存储。

二、注意事项

1.由于各个学校正方教务系统有所差别,故需要按照具体情况进行微调。但大体情况基本一致。

2. 版本规避:PHP5.3版本以下请删除所有namespace/use关键字。并取消config.php类文件引入注释。

3.确保安装curl扩展.

三、使用方法

项目只有一个入口文件run.php,使用时只需要将本SDK放在项目文件夹内,include这个文件即可,简单清爽。代码内有完整注释信息,可参阅,简单易用。 框架中的index.php为demo文件,使用时参照即可!

———————-2016/07/03更新——————————————

项目已经更新,以上用法作废,具体请查看 GitHub

四、获取源码

项目主页:http://lcrawl.lzjtuhand.com
源码地址:GitHub

PHP serialize() VS unserialize()性能测试

最近遇到需要将一个复杂数组存储在MySQL的问题,找到两者方式:json_encode()和seriliaze().到底使用哪一个,于是想要测试一下两者的性能及使用时保持数据的结构完整性情况。
手册解释:

serialize — Generates a storable representation of a value

serialize — 产生一个可存储的值的表示

unserialize — Creates a PHP value from a stored representation

unserialize — 从已存储的表示中创建 PHP 的值

看这个解释还是有点陶醉,第一眼基本不是很明白,接下来在测试的过程中加深加理解。
测试使用环境:本机WAMP/PHP 5.5.12

一、初步测试json_encode/json_decode的效率与字符串长度,对一个简单的二位数组进行10000此循环测试。

1.测试代码如下:

[php collapse=”false”]
<?php

$array = array(
‘name’=>’luoning’,
‘sex’=>’man’,
‘age’=>21,
‘adress’=>’Lanzhou’,
‘phone’=>’110’,
‘other’=>array(
‘QQ’=>’947703573’,
‘Weibo’=>’Near_Je’,
‘blog’=>’http://www.luoning.me’
)
);

$json = json_encode($array);
$seri = serialize($array);

//输出json_encode/serialize之后的字符串长度
echo "json :" , strlen($json) ,'<br/>’;
echo "serialize :", strlen($seri) ,'<br/>’;

//—–测试json_encode/json_decode开始—
$stime = microtime(true);

for ($i = 0; $i < 10000; $i ++) {
json_encode($array);
}

$etime = microtime(true);
echo "json_encode :", ($etime – $stime) ,'<br/>’;

//———————————
$stime = microtime(true);

for ($i = 0; $i < 10000; $i ++) {
json_decode($json,true);
}

$etime = microtime(true);

echo "json_decode :", ($etime – $stime),'<br/>’;

//——测试serialize/unserialize开始—–
$stime = microtime(true);

for ($i = 0; $i < 10000; $i ++) {
serialize($array);
}

$etime = microtime(true);

echo "serialize :", ($etime – $stime) ,'<br/>’;

//——————————-
$stime = microtime(true);

for ($i = 0; $i < 10000; $i ++) {
unserialize($seri);
}

$etime = microtime(true);

echo "unserialize :", ($etime – $stime),'<br/>’;
[/php]

2.测试结果:

json :150
serialize :224
json_encode :0.12014198303223
json_decode :0.23659014701843
serialize :0.10482311248779
unserialize :0.12682294845581

3.结果分析

(1)两者比较,字符串的长度json_encode具有优势;
(2)经过多次刷新测试,数据变化幅度不大,在循环10000次的条件下serialize函数均比json_decode所需时间短,但是优势很小,综合比较还是相差无几。

二、接下来测试一下一个较大且比较复杂的数组的情况下二者性能差别以及数据恢复之后的完整性等。
具体数组不再展示,流程基本一样。
1.测试结果:

json :11431
serialize :15748
json_encode :2.82439494133
json_decode :6.316869020462
serialize :4.2260599136353
unserialize :3.5953121185303

2.结果分析:

(1)当数组变大之后,json_encode依旧有字符串长度小的优势;
(2)json_encode过程挽回时间上的落差,基本只需要serialize一半;
(3)json_decode相比unserialize又是的两倍的时间,势均力敌!
(4)以上多次刷新测试数据变化幅度不大。

3.其他测试项目:

(1)json_decode/unserialize之后的数组与原数组相同,结构完整。(没有测试更复杂情况)

相比较来说,在我看来两者的性能是差不多的,基本持平。
至于选用哪一个,可根据以上数据具体分析选用,但是考虑到跨语言等方面,还是推荐json_encode,毕竟现在很多API都是json数据传输的。
4.2015-04-17更新

经过一些实际使用对比,发现json式序列化在存入数据后之后读取之时会出现json_decode后为null的情况,百度原因为BOM,由于我的数据比较复杂,没有用去除BOM的方式解决,只好换回serialize了,问题立马fixed!

 

MySQL远程连接授权

在阿里云ECS上部署了LNMP环境,由于MySQL默认了只有localhost才能链接访问,所以必须先授权才能远程使用Navicat等客户端工具链接。
  • 改表法

    可能是你的帐号不允许从远程登陆,只能在localhost。这个时候只要在localhost的那台电脑使用mysql管理工具登入mysql后,更改 “mysql” 数据库里的 “user” 表里的 “host” 项,从”localhost”改称”%”.
    修改完成命令行执行> flush privileges;即可立即生效。

  • 授权法

    A:你想mysql账户myuser使用密码mypassword从任何主机连接到mysql服务器的话,那就在mySQL命令行下输入:
    GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;若上面那条命令还没有奏效,那就使用下面的命令,一定成功!

    如果你想允许想mysql账户myuser从ip为192.168.1.3的主机连接到mysql服务器,并使用mypassword作为密码,那就在mySQL命令行下输入:
    GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'192.168.1.3' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;