PHP 压缩字符串方法

最近帮朋友采集n多数据。bluehost的最大文件数量20w 也不小心就触顶了。

采集东西的时候,因为抓取网页的时间过长,所以担心数据采集漏缺,都把网页文件缓存到虚拟机。so~
决定将不用到的东西,都打包压缩,然后删了文件。但是网页文件相当多。如果删除,后续需要补充什么东西的话相当麻烦。 所以决定放数据库里。bluehost限制的是文件数量,大小是不怎么计较的,按官方的话说,主要担心潜在文件安全,而且最大的扩展也只到30w,所以还是老实清理系统,将html缓存文件和各种采集的特殊数据,都放数据库里。回到整体,就有今天的压缩啦~

顺便符上blushost的数据库大小说明:

https://my.bluehost.com/cgi/help/429

参考:http://www.open-open.com/bbs/view/1319888000999

原文有说过一个失真的情况。具体看应用。因为我这边主要针对文本(网页源文件),所以是最好压缩的。有兴趣去了解原理,就知道为什么图片除了缩小,都不太好压缩,而文本类,轻松就压缩剩几十分之一了。

测试代码:

<?php
$filename = 'test.html';
//文件大小 3.2 M 某某变态网站,不说明了。。。
$filecontent = file_get_contents ( $filename );
// 压缩率最低(gzip压缩算法) 生成结果可以直接写到.gz文件中
$gzencode = gzencode ( $filecontent, 9 );
file_put_contents ( "gzencode.txt", $gzencode );
// 压缩率居中
$gzcompress = gzcompress ( $filecontent, 9 );
file_put_contents ( "gzcompress.txt", $gzcompress );
// 压缩率并列最高
$gzdeflate = gzdeflate ( $filecontent, 9 );
file_put_contents ( "gzdeflate.txt", $gzdeflate );

// 压缩率并列最高
$bzcompress = bzcompress ( $filecontent, 9 );
file_put_contents ( "bzcompress.txt", $bzcompress );

//压缩结果,前三种,文件都压缩到111kb ,最后一种压缩到 79kb。

 

新概念二册复习(26-40)

原来的0基础链接失效,自己又找到了个很不错的地方学。

http://st.hujiang.com/mag/135852085/up/p4/

里面需要登录回复才能看到部分隐藏内容。所以我这边每次复习完一课,就将笔记占贴到下一课~

家里装修了3个月。。。终于快好了。。。

建筑工真的很辛苦,当年差些些就跑去做这行了。并不是轻视这行,是各行有各行的生活方式。每星期回家都做小工,真心累。星期一到星期五感觉和放假一样。老妈很辛苦。体力活,在普通情况下,拿得比脑力活多,还真不能算多。体力活,你在做什么,别人都看在眼里,不能停,能休息,但是不能太多,让人感觉你在偷懒。环境不是很好的,像家里贴瓷砖,墙壁白花需要用斧头一点点刨。怎么说呢,斧头6~7把。用砂轮片磨,光来磨的砂轮片就磨坏了两个。斧头6~7把,每天都得磨,轮着。专门搞这个的小哥,手臂一只大一只小,比例差了3~4分之一。。。。。看他搞高的太麻烦,送了他副泳镜。每天中午和晚上我都得洗一次。鼻子里的都是小沙尘,一块一块的。隔天喉咙就不舒服,戴面罩也一样。

各种折腾就不吐槽了,好好利用自己的空闲时间,努力提升自己~

preg_replace return NULL 解决

本来以为自己对正则已经很熟悉,最近又学到了一个,虽然是配置上的问题,不过也学习了。
使用preg_replace 处理长字符串时,返回null的原因

http://de.php.net/manual/de/pcre.configuration.php

官方文档

这些函数的行为受 php.ini 中的设置影响。

PCRE配置选项
名字	默认	可修改范围	更新日志
pcre.backtrack_limit	"100000"	PHP_INI_ALL	php 5.2.0可用.
pcre.

 

"100000" PHP_INI_ALL php 5.2.0可用. 有关 PHP_INI_* 样式的更多详情与定义,见 配置可被设定范围。 这是配置指令的简短说明。 pcre.backtrack_limit integer PCRE的回溯限制. pcre.recursion_limit integer PCRE的递归限制. 请注意, 如果 讲这个值设置为一个很大的数字, 你可能会消耗掉 所有的进程可用堆栈, 最终导致php崩溃(直到达到系统限制的堆栈大小).

由于在匹配到前,内容太多,回溯和匹配过多,导致NULL

所以只要

ini_set('pcre.backtrack_limit',1000000);
ini_set('pcre.recursion_limit',1000000);
//通常够用,不沟通,适当加大即可。

phpjquery & simpledomphp 比较

phpjquery

https://github.com/TobiaszCudnik/phpquery

simplehtmldom

http://simplehtmldom.sourceforge.net/

<?php

function gddebug() {
	$arrays = func_get_args ();
	echo "n<pre>";
	foreach ( $arrays as $value ) {
		echo "==============================================rn";
		if (is_array ( $value ) || is_object ( $value )) {
			ksort ( $value );
			echo htmlspecialchars ( print_r ( $value, true ) ) . "rn";
		} elseif (is_string ( $value )) {
			echo "string(" . strlen ( $value ) . ") "" . htmlspecialchars ( $value ) . ""rn";
		} else {
			var_dump ( $value );
		}
	}
	echo "</pre>";
}
gddebug ( 'init', memory_get_usage () );
require ('phpQuery/phpQuery.php');
gddebug ( 'load libs', memory_get_usage () );

// INITIALIZE IT
// phpQuery::newDocumentHTML($markup);
// phpQuery::newDocumentXML();
// phpQuery::newDocumentFileXHTML('test.html');
// phpQuery::newDocumentFilePHP('test.php');
// phpQuery::newDocument('test.xml', 'application/rss+xml');
// this one defaults to text/html in utf8
// 文件 内容
// //https://www.google.com.sg/search?hl=zh-CN&site=imghp&tbm=isch&source=hp&biw=1366&bih=653&q=271072+CC240+armani&oq=271072+CC240+armani&gs_l=img.12...5739.5739.0.6570.1.1.0.0.0.0.120.120.0j1.1.0....0...1ac..64.img..1.0.0.Md5Dux9zIdI
$doc = phpQuery::newDocumentFileHTML ( 'test.html' );

gddebug ( 'load file', memory_get_usage () );
$obj = $doc->find ( '.rg_di' );
gddebug ( 'load elements', memory_get_usage (), 'count', count ( $obj ) );

输出

==============================================
string(4) "init"
==============================================
int(62208)
==============================================
string(9) "load libs"
==============================================
int(1441040)
==============================================
string(9) "load file"
==============================================
int(1445448)
==============================================
string(13) "load elements"
==============================================
int(1469744)
==============================================
string(5) "count"
==============================================
int(100)

===========================simple html dom

<?php

function gddebug() {
	$arrays = func_get_args ();
	echo "n<pre>";
	foreach ( $arrays as $value ) {
		echo "==============================================rn";
		if (is_array ( $value ) || is_object ( $value )) {
			ksort ( $value );
			echo htmlspecialchars ( print_r ( $value, true ) ) . "rn";
		} elseif (is_string ( $value )) {
			echo "string(" . strlen ( $value ) . ") "" . htmlspecialchars ( $value ) . ""rn";
		} else {
			var_dump ( $value );
		}
	}
	echo "</pre>";
}
gddebug ( 'init', memory_get_usage () );
include 'simple_html_dom.php';
gddebug ( 'load libs', memory_get_usage () );

// INITIALIZE IT
// phpQuery::newDocumentHTML($markup);
// phpQuery::newDocumentXML();
// phpQuery::newDocumentFileXHTML('test.html');
// phpQuery::newDocumentFilePHP('test.php');
// phpQuery::newDocument('test.xml', 'application/rss+xml');
// this one defaults to text/html in utf8

// //https://www.google.com.sg/search?hl=zh-CN&site=imghp&tbm=isch&source=hp&biw=1366&bih=653&q=271072+CC240+armani&oq=271072+CC240+armani&gs_l=img.12...5739.5739.0.6570.1.1.0.0.0.0.120.120.0j1.1.0....0...1ac..64.img..1.0.0.Md5Dux9
$doc = file_get_html ( 'test.html' );

gddebug ( 'load file', memory_get_usage () );
$obj = $doc->find ( '.rg_di' );
gddebug ( 'load elements', memory_get_usage (), 'count', count ( $obj ) );

 

==============================================
string(4) "init"
==============================================
int(62072)
==============================================
string(9) "load libs"
==============================================
int(527136)
==============================================
string(9) "load file"
==============================================
int(5590512)
==============================================
string(13) "load elements"
==============================================
int(5596016)
==============================================
string(5) "count"
==============================================
int(100)

不用多言,内存使用上完败。。

还只是一个小页面,大页面,基本上simplehtmldom经常性抛出内存不足,需要很很好的进行clear()和unset 来释放内存。同时在解析目标元素时,需要通过正则将目标元素前后元素删除才不会占用过多内存。使用上,phpjquery更接近jquery,个人比较喜欢这类。

本来最近频繁帮朋友采集各种在线商店的商品数据,嫌simple太繁琐,准备自己写个脚本,分离出需要保留的元素来的(包含子节点)。后续研究下phpjquery有没有类似的,没有就自己写一个出来,先占位~

定位研究

最近公司不知道怎么接了一个猥亵的项目,通过手机安装软件来监控人的行动轨迹。整理下相关问题和不完善的解决方案.

软件肯定是以service 形式运行,界面关闭+ 开机运行。然后动态发送用户坐标到制定的服务器。当然,需要用户的设备信息做唯一标志。下面罗列各点问题。

定位工具:

http://developer.baidu.com/map/index.php?title=android-locsdk

注:研究早了几天,不知道是人品不好还是太好。研究的时候,需要的都没有。折腾了几天,突然发现又有了。主要离线定位和gprs定位不稳定。新版本6.0.5本身已经是启动服务版本了,所以不用通过编写service 等进行定时任务和触发.

Android如何保持程序一直运行:

http://abc20899.iteye.com/blog/1045537

深入了解 Android 系統 Wi-Fi 網路自動休眠機制運作方式:

http://mobileai.net/2013/06/17/android-wi-fi-sleep/

坐标数据需要进行特殊过滤:

61 : GPS定位结果,GPS定位成功。

62 : 无法获取有效定位依据,定位失败,请检查运营商网络或者wifi网络是否正常开启,尝试重新请求定位。

63 : 网络异常,没有成功向服务器发起请求,请确认当前测试手机网络是否通畅,尝试重新请求定位。

65 : 定位缓存的结果。

66 : 离线定位结果。通过requestOfflineLocaiton调用时对应的返回结果。

67 : 离线定位失败。通过requestOfflineLocaiton调用时对应的返回结果。

68 : 网络连接失败时,查找本地离线定位时对应的返回结果。

161: 网络定位结果,网络定位定位成功。

162: 请求串密文解析失败。

167: 服务端定位失败,请您检查是否禁用获取位置信息权限,尝试重新请求定位。

502: key参数错误,请按照说明文档重新申请KEY。

505: key不存在或者非法,请按照说明文档重新申请KEY。

601: key服务被开发者自己禁用,请按照说明文档重新申请KEY。

602: key mcode不匹配,您的ak配置过程中安全码设置有问题,请确保:sha1正确,“;”分号是英文状态;且包名是您当前运行应用的包名,请按照说明文档重新申请KEY。

501~700:key验证失败,请按照说明文档重新申请KEY。

/**
*求两个已知经纬度之间的距离,单位为米
*@param lng1,lng2 经度
*@param lat1,lat2 纬度
*@return float 距离,单位米
**/
function getdistance($lng1,$lat1,$lng2,$lat2)//根据经纬度计算距离
{
    //将角度转为狐度 
    $radLat1=deg2rad($lat1);
    $radLat2=deg2rad($lat2);
    $radLng1=deg2rad($lng1);
    $radLng2=deg2rad($lng2);
    $a=$radLat1-$radLat2;//两纬度之差,纬度<90
    $b=$radLng1-$radLng2;//两经度之差纬度<180
    $s=2*asin(sqrt(pow(sin($a/2),2)+cos($radLat1)*cos($radLat2)*pow(sin($b/2),2)))*6378.137*1000;
    return $s;
}

需要将除了gps 定位返回的坐标进行特殊识别。比如,相隔两点坐标,如果第一个为网络定位,离线定位等可能缓存的坐标。判断时间范围是否在30秒内,距离是否超过300米。如果是。则试为缓存,跳过.

gps 定位慢:

http://blog.csdn.net/u013227819/article/details/19494205

后台管理:

百度地图js显示行动路线时,点少于20个可以考虑行走路线 BMap.WalkingRoute  进行处理。超过这个。在搜索路线时,本身就比较。卡,其它软件产品则通过画线的形式,这边使用 Polyline 进行线条绘制,上百个点绘制无压力,秒出。

补绘制线条箭头:http://blog.csdn.net/baidulbs/article/details/8571961

修复线条箭头bug版本:http://www.bubuko.com/infodetail-802725.html

离线考虑:

离线的情况下,星历等,包括基站,wifi 数据等都有问题。定位本身只能依靠gps。同时可以考虑惯性导航做辅助。不过惯性也只能做普通辅助,毕竟各种影响也不少。需要将坐标保存到本地数据库中,然后等网络通的情况下,将坐标上传到服务器.

总结:

同类型跑酷软件,大都也是通过百度定位sdk获取数据。毕竟基站数据wifi数据,大公司是比较全的。不过我觉得如果不是谷歌被日,会有更好的解决方案。不过终究只是通过先有功能进行处理,线程被杀还是挺容易的,从c启动就不会那么容易被清理到。但是实现成本有些搞。暂时只研究到这里,后面有更好的解决方式再来记录.

【转】Android学习指南

http://www.apkbus.com/android-830-1-1.html

整理了一下这本《Android学习指南》的目录 


目录
第一讲:Android开发环境的搭建
第二讲:Android系统构架分析和应用程序目录结构分析
第三讲:Android模拟器的使用
第四讲:Activity入门指南
第五讲:用户界面 View(一)
第六讲:用户界面 View(二)
第七讲:用户界面 View(三)
第八讲:Intent入门指南
第九讲:用户界面 View(四)
第十讲:用户界面 View(五)
第十一讲:用户界面 View(六)
第十二讲:用户界面 View(七)
第十三讲:用户界面 View(八)
第十四讲:Service入门指南
第十五讲:SQLite入门指南
第十六讲:菜单 Android Menu
第十七讲:对话框 Android Dialog
第十八讲:Android SharedPreferences和File
第十九讲:Android Notification的使用入门
第二十讲:Content Provider 使用入门
第二十一讲:Broadcast Receiver 使用入门
第二十二讲:AIDL和远程Service调用
第二十三讲:Drawable使用入门
第二十四讲:Android动画入门(一)
第二十五讲:Android动画入门(二)
第二十六讲:Android中的GPS应用入门

第二十八讲:Android多媒体(Media)入门
音乐播放、视频播放、声音录制,窈窈录音
第三十讲:URLConnection和HttpClient使用入门
读取Google天气预报信息
解析Google天气预报信息
Style, Theme
自定义音乐播放器界面
火箭发射倒计时
Hello,App Widget! ,音乐播放器小部件
窈窈照相机
窈窈录音器
第三十八讲:Android手写输入和手势编程入门
未写
第三十九讲:Android语音识别编程入门
未写
第四十讲:Android Wifi编程入门
未写
第四十二讲:用户界面 View(九)
SlidingDrawer 仿造Home的应用程序列表
ExpandableListView  ExpandableListActivity
TabHost,TabWidget,Tabactivity
ImageSwitcher TextSwitcher
ViewFlipper ViewAnimator