json_encode

 json_encode默认对中文字符做unicode编码字符串化处理

PHP的json_encode来在处理到中文的时, 中文字符会被处理为:按中文字符对应的unicode的16进制编号前加上\u来表示。例如:”中文” 两个字被表示为\u4e2d\u6587。
这样的问题是增加了传输量,例如”中文” 的utf8编码占6个字节,”\u4e2d\u6587″占12个字节了,增加了一倍。

在PHP5.4中, 这个问题得以解决, json_encode增加了一个选项: JSON_UNESCAPED_UNICODE,意思是对中文字符不做unicode编码字符串化处理,保持其原编码字节内容。
示例:

echo json_encode("《程序员读》", JSON_UNESCAPED_UNICODE);

 json_encode的其它功能及选项

http://www.php.net/manual/ru/function.json-encode.php

提升苹果推送的中文字符长度

apple推送内容要求是json格式,长度限制为256字节内,若超过了256字节,fwrite函数就要返回false了。由于aps、deviceToken、json符号等会占用部分长度,真正文字内容部分大约占200字节以下。

  • 一个汉字的unicode编号串占6字节,200字节可以容纳33个汉字。
  • 一个汉字采用gbk或utf8占2到3个字节,200字节可以容纳66到100个汉字。

在php5.4及以上的版本,在这里使用JSON_UNESCAPED_UNICODE正当时

$body['aps'] = array('alert' =>'《程序员读》','sound' => 'default');
$payload = json_encode($body,JSON_UNESCAPED_UNICODE);

如果php版本低于5.4,以下代码强制让json中的unicode转成中文

$payload = json_encode($content);
$payload = preg_replace_callback(‘/\\\\u([0-9a-fA-F]{4})/u’, create_function(‘$match’, ‘return mb_convert_encoding(pack(“H*”, $match[1]), “utf-8″, “UTF-16BE”);’), $payload);

xampp之phpMyAdmin

phpMyAdmin 尝试连接到 MySQL 服务器,但服务器拒绝连接。您应该检查配置文件中的主机、用户名和密码,并确认这些信息与 MySQL 服务器管理员所给出的信息一致。

原因可能是修改了mysql登录密码,xampp中phpmyadmin默认是通过记录在配置文件的帐号密码来直接登陆,而不是通过登陆界面登陆。
修改phpmyadmin的登录方式为传统的登陆界面登陆,修改phpmyadmin根目录下的config.inc.php

//$cfg['Servers'][$i]['auth_type'] = 'config';
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['user'] = 'root';
$cfg['Servers'][$i]['password'] = '';
$cfg['Servers'][$i]['extension'] = 'mysql';
$cfg['Servers'][$i]['AllowNoPassword'] = true;
$cfg['Lang'] = '';

phpmyadmin 的登陆方式有4种,config、cookie、http 以及 signon。
config 是直接使用配置文件的信息登陆;
cookie 是使用最广泛的普通登陆方式登陆;
http 是使用 HTTP-Auth 模块来验证登陆,但局限性很大;
signon 是提供第三方接入来验证登陆。

无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装。

进入/Applications/XAMPP/xamppfiles/temp/,清空。

php 数组

1.数组合并
使用array_merge()或+
区别:用加号合并数组时,如果数组间存在同名的键,那么保留前面数组对应的键值,array_merge()函数正好相反。
当数组的键名是数字时,用array_merge()会将键名重置为0开始,而加号合并时,能够保留键名。

2.数组传递是值传递而非引用传递
在调用函数时通过将PHP数组作为实参赋给形参,在函数中修改,并不会影响到数组本身。此过程中的传递为值传递,数组变量并非是指向此数组本身的引用,PHP数组本身以值的形式存在,同时形参是对数组的拷贝。

xampp

mac中配置 xampp

下载 https://www.apachefriends.org/zh_cn/index.html
示例:
(1)把工程目录放到/Users/gzty1/p_workspace
(2)在/Applications/XAMPP/xamppfiles/etc/httpd.conf 尾部添加

<Directory "/Users/gzty1/p_workspace/mobile">
 Options Indexes FollowSymLinks ExecCGI Includes
 AllowOverride All
 Require all granted
</Directory>

(3)去掉 Include etc/extra/httpd-vhosts.conf 前面的#注释,引入 vhosts 虚拟主机配置文件。
(4)在/Applications/XAMPP/xamppfiles/etc/extra/httpd-vhosts.conf 尾部添加或者替换为

<VirtualHost *:80>
 DocumentRoot "/Applications/XAMPP/xamppfiles/htdocs"
 ServerName localhost
</VirtualHost>
<VirtualHost *:80>
DocumentRoot "/Users/gzty1/p_workspace/mobile"
ServerName www.mytest.com
ServerAlias  mytest.com
</VirtualHost>

(5)sudo vi /etc/hosts 配置域名映射
127.0.0.1 local.com

(6)重启apache。

windows中配置

hosts文件位于C:\Windows\System32\drivers\etc。其它步骤同上

php

include中的文件名要大小写准确,在windows服务器上可能不敏感,在linux服务器上就敏感了。
获取内容时,$results=@file_get_contents( $url );也许不够用,用curl替代时,要测试需不需要agent头,或agent头是加的否不准确。

php emoji
http://blog.wpjam.com/article/emoji-for-php-mysql/
https://github.com/iamcal/php-emoji
http://www.easyapns.com/iphone-emoji-alerts

在php4中,类中的属性都用var声明,php5中增加了public、private、protected。var和public效果一样。
注意使用public、private、protected时,不需要再使用var。

在双引号字符串中使用对象属性值时要使用大括号,例如 “{$obj->name},{$obj->getName()}”,{$val1}大括号起的作用是告诉PHP括起来的要当成变量处理。
在字符串的变量的后面跟上大括号和中括号一样,都是把某个字符串变量当成数组处理
$str = ‘abcdefg’;
echo $str{4};

php允许动态给对象增加属性,所以拼写错属性不会带来编译和执行上的错误,但可能带来业务上的错误。但这在面向对象编程中不是一个良好的做法。

类中的函数称为方法,省略可见性关键字时,隐式是public的。

伪变量(pseudo variable)$this指向当前对象,而self指向当前类,例如:$this->name,self::$staticName。

在php5中,应该将构方法命名为: function __construct(参数…)
同样地,也提供了析构方法function __destruct(),显示销毁对象,可以unset($obj),
__call(),__destruct()这一系列方法也称为魔法方法,magic method.

php是弱类型语言,即不需要声明类型,但它也提供了一些is_开头的类型检查函数,例如is_null(),is_array()等。
instanceof操作符,例如:if($obj instanceof ClassA){}

在子类构造方法中调用父类的构造方法 parent::__construct();

常量用const声明,并且不带$符号,一般大写。常量类型只能是基本数据类型,和静态类型一样只能使用类访问符方法常量属性,例如:
ClassA::constA,ClassA::$staticB

以class关键字前面使用abstract关键字来定义一个抽象类,并且至少包含一个抽象方法,抽象方法也要用abstract声明,并且不包括方法体。

对象类型的变量可以加类型声明,例如:ClassA #a=NULL;

接口用关键字interface来声明,接口可能包含属性和方法声明,方法声明不能有方法体。

SimpleXMLElement

try catch throw

final 类不能被继承,final 方法不能被重写。

定义function __toString()方法,使用对象可以像字符串一样被输出,这对于日志和错误报告有用。

等值判断==,等值且都是对像===,但都不会判断两者指向同一个对象。
clone关键字会使用值复制方式生成一个新对象,例如:$second=clone $first;
可以重写function __clone()方法,在clone生成新对象后,__clone()会被调用。可以在__clone()方法中实现动态修改不要被默认复制的对象,及实现深复制。

反射,reflection,指的是程序对运行中的类自身进行检查。
file_exists(),class_exists(),method_exists(),动态方法名,例如:$method=”method1″;$this->$method();php允许使用字符串来动态的引用类。
拦截器方法,拦截对未定义的属性或方法的操作:__get(),__set(),__isset(),__unset(),__call(),
get_class($obj1)返回对象的类名,
检测对象中方法是否存在 if(in_array($method1,get_class_methods($obj1))){$obj1->$method1()}
is_callable()不仅检查方法是否存在,还检查是否可以调用。
可以使用文件系统来组织出php包,因为在包含文件时需要给出相对路径。

require()在调用文件发生错误时,会停止整个程序;include()在调用文件发生错误时,会生成警告,并停止执行包含文件,跳出代码后继续执行下面的代码。所以require更加安全,include适用于加载模板。它们都是语句不是函数,

PEAR,PHP扩展与应用库。

命名空间应用于文件级别,其声明应该是文件中的第一条语句。
声明命名空间:namespace namespace1::namespace11;
导入命名空间:import namespace1::namespace11 as aliasName1;

在php系统中设置include_path,例如在php.ini或.htaccess中配置。还可以在程序中使用set_include_path()动态的设置包含路径,例如set_include_path(get_include_path(),”:/path1″);,在unix环境中使用冒号分隔。

自动加载拦截器 function __autoload()
DIRECTORY_SEPARATOR

打印数组内容
print_r(get_class_methods($item));
print_r(get_class_vars($item));
get_parent_class(),
is_subclass_of()只查找类继续关系,不查找接口。查找接口用instanceof操作符。

call_user_func(),call_user_func_array()也可以达到使用字符串动态调用方法,

php反射api是强大的类测试工具,它包括一些Reflection开头的一些类。
应该经常使用它而少使用类和对象函数。反射的另一个用途是根据命名规则创建一个调用模板类中方法的框架。

正交:将职责相关的组件结合在一起,并与外部系统隔开,保持独立性。

php4不支持隐藏数据,不得不使用文档和命名惯例来说明数据的隐私性。例如,以下划线开头的属性通常是私有属性。

empty()

PDO是PHP 5新加入的一个重大功能,因为在PHP 5以前的php4/php3都是一堆的数据库扩展来跟各个数据库的连接和处理,什么 php_mysql.dll、php_pgsql.dll、php_mssql.dll、php_sqlite.dll等等扩展来连接MySQL、PostgreSQL、MS SQL Server、SQLite

#也可以注释单行
define()也可以定义常量。
php提供了大量的预定义变量

从php5开始,php新增了一些内置的标准扩展库和外部扩展库。

php 超时设置

php页面执行时间默认最大是30秒。
set_time_limit(0)可以修改为无超时限制。在linux环境中执行有效,但在windows环境中执行无效。
在windows环境中修改php.ini中的max_execution_time,不过这样就把所有php页面的最大执行时间都修改了,但是测试却也没起作用。
在windows环境中 ini_set(‘max_execution_time’, ‘0’);在页面中动态设置也没起作用。还好我的生产环境是linux。

php正则

php正则式尾部的 i,m,s,x,e 含义

  • i: 表示in-casesensitive,即大小写不敏感
  • s: PCRE_DOTALL,表示点号可以匹配换行符。
  • U: 表示PCRE_UNGREEDY,表示非贪婪,相当于perl/python语言的.*?,在匹配过程中,对于.*正则,一有匹配立即执行,而不是等.*消费了所有字符再一一回退

在实际使用中,常用的有i、e

php中全角空格替换

在php中用str_replace函数替换utf-8编码文本中的全角空格,下面几个表示全角空格的方法都不好用:
两个半角空格表示全角空格;
直接在代码里面输全角空格;
用\s空格表示全角空格;

解决方案:
全角空格的utf-8编码是0xe38080,gbk编码是0xa1a1。
在 utf-8编码编辑器中全角空格要写为$full_width_space = “\xe3\x80\x80”;
在非utf-8编码编辑器里全角空格要写为$full_width_space = iconv(‘gbk’, ‘utf-8’, “\xa1\xa1”);

含有正则的网页运行总失败的原因

正则压力太大,apache挂掉了,但是因为守护进程,所以挂掉了会马上自行恢复。
正则还是要写合理简单些,不然压力大了直接死给你看。

通常php会根据语境自动转换大多数基本数据类型
字符串转布尔
$b=preg_match(“/false|no|off/i”,”false”)?false:true;

用php代码分析各视频网站 m3u8 mp4 格式源

HTML5  video标签

html5中提供了新的video标签在移动设备上观看视频。简单的格式如下:

<video src='' poster=''></video>

需要提供一个视频地址和可选的一张缩略图地址。

video支持的视频格式有m3u8、mp4。普通网页上常只提供了flash格式视频播放地址,我们尝试做了一些探索分析后,常能找到它们对应的m3u8或mp4地址。下面分享一些分析出来的video地址。

优酷video地址

目前优酷m3u8地址规则相对简单,poster地址则要获取另一个页面内容分析。

示例:http://player.youku.com/player.php/sid/XMzA1NTQ2NjM2/v.swf

 $vid=preg_match("/.*?\/sid\/(\w+)(\/v\.swf)?/i",$src,$temp)?$temp[1]:"";
 $videoSrc="http://v.youku.com/player/getRealM3U8/vid/".$vid."/type//video.m3u8";
 $url="http://v.youku.com/player/getPlayList/VideoIDS/".$vid;
 $content=file_get_contents($url);
 $videoPoster=preg_match("/\"logo\":\"(.*?)\"/i",$jsonContent,$temp)?$temp[1]:"";
 $videoPoster=preg_replace("/\\\\\//","/",$videPoster);

补充:优酷后面又改版了,还没有分析成功。

土豆video地址

土豆src地址、poster地址要获取另一个页面内容分析。

示例:http://www.tudou.com/v/Gae2gWn4y7c/&bid=05&resourceId=0_05_05_99/v.swf

preg_match_all("/^.*?tudou.com\/v\/(.*?)\/.*?$/",$src,$icodes);
$icode=$icodes[1][0];
$url="http://www.tudou.com/programs/view/".$icode."/";
$content=file_get_contents($url);
preg_match("/.*?iid:(.*?)\n.*/i",$content,$iids);
$iid=$iids[1];
$iid=trim($iid);
$videoPoster=preg_match("/,pic:\s*\'(.*?)\'/i",$tudouPageContent,$temp)?$temp[1]:"";
$videoSrc="http://vr.tudou.com/v2proxy/v2.m3u8?it=".$iid;

PPS video地址

只定位到了poster,未能定位到src

示例:http://player.pps.tv/player/sid/3ELV05/v.swf

$vid=preg_match("/sid\/(.*?)\/v.swf/i",$src,$temp)?$temp[1]:"";
$url="http://v.pps.tv/play_$vid.html";//m.pps.tv
$pageContent=file_get_contents($url);
$voideoPoster=preg_match("/\"sharepic\":\"(.*?)\"/i",$pageContent,$temp)?$temp[1]:"";
$trans = array("\/"  => "/");
$videoPoster = strtr($posterImageSrc, $trans);

163 video地址