1) time() 获取当前的系统时间戳
int time(void) :
返回当前的 Unix 时间戳 (返回自从 Unix 纪元(格林威治时间 1970 年 1 月 1 日 00:00:00)到当前时间的秒数。 )
自 PHP 5.1 起在 $_SERVER['REQUEST_TIME'] 中保存了发起该请求时刻的时间戳。
$_SERVER["REQUEST_TIME"] :The timestamp of the start of the request. Available since PHP 5.1.0. 一看解释就都明白了
2) $_SERVER["REQUEST_TIME"] 得到请求开始时的时间戳
实例代码:
代码如下 | 复制代码 |
<?php date_default_timezone_set('PRC'); sleep(5);//php脚本睡5秒 echo date('Y-m-d H:i:s',time());//获取当前系统时间的时间戳 echo '<hr />'; echo date('Y-m-d H:i:s',$_SERVER['REQUEST_TIME']);//得到请求此php脚本时的时间戳 ?> |
输出结果截图如下:
结论:
因为sleep(5)睡了5秒,之后用time()获取系统的时间戳,$_SERVER['REQUEST_TIME']则记录了发起此请求时刻的时间戳。所以$_SERVER['REQUEST_TIME']比用time()获取的时间戳早5秒
Ajax多图片上传效果界面
我们在页面上放置一个form表单,使用post提交到后台php处理程序upload.php,注意enctype属性设置要支持文件上传。#preview用来显示上传完毕后的图片。关于css样式设置本文不加说明,请参照下载包的源码。
代码如下 | 复制代码 |
<form id="imageform" method="post" enctype="multipart/form-data" action="upload.php"> <div id="up_status" style="display:none"><img" width=100% src="loader.gif" alt="uploading"/></div> <div id="up_btn" class="btn"> <span>添加图片</span> <input id="photoimg" type="file" name="photoimg"> </div> </form> <p>最大100KB,支持jpg,gif,png格式。</p> <div id="preview"></div> |
本实例基于jQuery,因此必须在页面中载入jquery库以及jquery.wallform.js。
<script type="text/javascript"" width=100% src="jquery.min.js"></script>
<script type="text/javascript"" width=100% src="jquery.wallform.js"></script>
当点击按钮“添加图片”后,弹出选择文件对话框,选择要上传的图片后,触发change事件。然后表单#imageform调用jquery.wallform.js的ajaxForm()方法,将表单数据提交给后台PHP处理,并根据返回结果处理页面元素的展示。如果上传成功,图片会一张张排列显示在页面上。关于ajaxForm()的使用可以参照本站文章:Ajax表单提交插件jqery form。
代码如下 | 复制代码 |
$(function(){ $('#photoimg').die('click').live('change', function(){ var status = $("#up_status"); var btn = $("#up_btn"); $("#imageform").ajaxForm({ target: '#preview', beforeSubmit:function(){ status.show(); btn.hide(); }, success:function(){ status.hide(); btn.show(); }, error:function(){ status.hide(); btn.show(); } }).submit(); }); }); |
upload.php处理图片上传,并将上传好的图片保存在uploads/目录,注意该目录要有写权限。首先需要检测是否为POST方式提交,然后判断图片格式、图片大小是否符合要求,然后使用move_uploaded_file()上传图片,并将图片重命名,格式为:time().rand(100,999)。
代码如下 | 复制代码 |
$path = "uploads/"; $extArr = array("jpg", "png", "gif"); if(isset($_POST) and $_SERVER['REQUEST_METHOD'] == "POST"){ $name = $_FILES['photoimg']['name']; $size = $_FILES['photoimg']['size']; if(empty($name)){ echo '请选择要上传的图片'; exit; } $ext = extend($name); if(!in_array($ext,$extArr)){ echo '图片格式错误!'; exit; } if($size>(100*1024)){ echo '图片大小不能超过100KB'; exit; } $image_name = time().rand(100,999).".".$ext; $tmp = $_FILES['photoimg']['tmp_name']; if(move_uploaded_file($tmp, $path.$image_name)){ echo '<img" width=100% src="'.$path.$image_name.'" class="preview">'; }else{ echo '上传出错了!'; } exit; } //获取文件类型后缀 function extend($file_name){ $extend = pathinfo($file_name); $extend = strtolower($extend["extension"]); return $extend; } |
<?php include 'ganon.php'; $html = file_get_dom('http://www.111cn.net/'); foreach($html('div[class="focus"]') as $element) { echo $element->class, "<br>n"; } ?>
<?php include 'phpQuery/phpQuery.php'; phpQuery::newDocumentFile('http://www.111cn.net/'); $artlist = pq("article"); foreach($artlist as $title){ echo pq($title)->find('h2')->html()."<br/>"; } ?>
文档: http://simplehtmldom.sourceforge.net/manual.htm
<?php include 'simple_html_dom.php'; //使用url和file都可以创建DOM $html = file_get_html('http://www.111cn.net/'); //找到所有图片 // foreach($html->find('img') as $element) // echo $element->src . '<br>'; //找到所有链接 foreach($html->find('a') as $element) echo $element->href . '<br>'; ?>
<?php include("Snoopy.class.php"); $url = "http://www.111cn.net"; $snoopy = new Snoopy; $snoopy->fetch($url); //获取所有内容 echo $snoopy->results; //显示结果 // echo $snoopy->fetchtext ;//获取文本内容(去掉html代码) // echo $snoopy->fetchlinks($url) ;//获取链接 // $snoopy->fetchform ;//获取表单 ?>
如果编写能力ok,可以手写一个网页爬虫,实现网页抓取。网上有千篇一律的介绍此方法的文章,LZ就不赘述了。有兴趣了解的,可以百度 php 网页抓取。
七、开源爬虫软件汇总
发语言
|
软件名称
|
软件介绍
|
许可证
|
Java
|
Arachnid
|
微型爬虫框架,含有一个小型HTML解析器
|
GPL
|
crawlzilla
|
安装简易,拥有中文分词功能
|
Apache2
|
|
Ex-Crawler
|
由守护进程执行,使用数据库存储网页信息
|
GPLv3
|
|
Heritrix
|
严格遵照robots文件的排除指示和META robots标签
|
LGPL
|
|
heyDr
|
轻量级开源多线程垂直检索爬虫框架
|
GPLv3
|
|
ItSucks
|
提供swing GUI操作界面
|
不详
|
|
jcrawl
|
轻量、性能优良,可以从网页抓取各种类型的文件
|
Apache
|
|
JSpider
|
功能强大,容易扩展
|
LGPL
|
|
Leopdo
|
包括全文和分类垂直搜索,以及分词系统
|
Apache
|
|
MetaSeeker
|
网页抓取、信息提取、数据抽取工具包,操作简单
|
不详
|
|
Playfish
|
通过XML配置文件实现高度可定制性与可扩展性
|
MIT
|
|
Spiderman
|
灵活、扩展性强,微内核+插件式架构,通过简单的配置就可以完成数据抓取,无需编写一句代码
|
Apache
|
|
webmagic
|
功能覆盖整个爬虫生命周期,使用Xpath和正则表达式进行链接和内容的提取
|
Apache
|
|
Web-Harvest
|
运用XSLT、XQuery、正则表达式等技术来实现对Text或XML的操作,具有可视化的界面
|
BSD
|
|
WebSPHINX
|
由两部分组成:爬虫工作平台和WebSPHINX类包
|
Apache
|
|
YaCy
|
基于P2P的分布式Webseo/seo.html" target="_blank">搜索引擎
|
GPL
|
|
Python
|
QuickRecon
|
具有查找子域名名称、收集电子邮件地址并寻找人际关系等功能
|
GPLv3
|
PyRailgun
|
简洁、轻量、高效的网页抓取框架
|
MIT
|
|
Scrapy
|
基于Twisted的异步处理框架,文档齐全
|
BSD
|
|
C++
|
hispider
|
支持多机分布式下载, 支持网站定向下载
|
BSD
|
larbin
|
高性能的爬虫软件,只负责抓取不负责解析
|
GPL
|
|
Methabot
|
经过速度优化、可抓取WEB、FTP及本地文件系统
|
不详
|
|
Methanol
|
模块化、可定制的网页爬虫,速度快
|
不详
|
|
C#
|
NWebCrawler
|
统计信息、执行过程可视化
|
GPLv2
|
Sinawler
|
国内第一个针对微博数据的爬虫程序,功能强大
|
GPLv3
|
|
spidernet
|
以递归树为模型的多线程web爬虫程序,支持以GBK (gb2312)和utf8编码的资源,使用sqlite存储数据
|
MIT
|
|
Web Crawler
|
多线程,支持抓取PDF/DOC/EXCEL等文档来源
|
LGPL
|
|
网络矿工
|
功能丰富,毫不逊色于商业软件
|
BSD
|
|
PHP
|
OpenWebSpider
|
开源多线程网络爬虫,有许多有趣的功能
|
不详
|
PhpDig
|
适用于专业化强、层次更深的个性化搜索引擎
|
GPL
|
|
Snoopy
|
具有采集网页内容、提交表单功能
|
GPL
|
|
ThinkUp
|
采集推特、脸谱等社交网络数据的社会媒体视角引擎,可进行交互分析并将结果以可视化形式展现
|
GPL
|
|
微购
|
可采集淘宝、京东、当当等300多家电子商务数据
|
GPL
|
|
ErLang
|
Ebot
|
可伸缩的分布式网页爬虫
|
GPLv3
|
Ruby
|
Spidr
|
可将一个或多个网站、某个链接完全抓取到本地
|
MIT
|
在工作项目中有一个需求,要把数一些数据转成数组,然后再存到数库库一个字段中,个人目前知道两种方法,一种是用序列化函数serialize($arr);,还有一种是用php的json扩展自带的函数json_encode($arr);。
要把数一个数组,存到数据库的一个字段中,有两种方法,一种是用序列化函数serialize($arr);还有一种是用php的json扩展自带的函数json_encode($arr);如果json_encode对含有中文的字符进行编码时,会自动转换成unicode编码。就像这样:a:2:{s:4:”code”;s:1:”1″;s:3:”msg”;s:9:”PHP日志”;},虽然js上能正常处理,但是看起来还是不那爽,在PHP的官方网站上面找到一个函数,可以解决这个问题,也就是将数据转换json,而且中文不会被转换为unicode码。
代码如下 | 复制代码 |
<?php function php2js($a=false) { if (is_null($a)) return 'null'; if ($a === false) return 'false'; if ($a === true) return 'true'; if (is_scalar($a)) { if (is_float($a)) { // Always use "." for floats. $a = str_replace(",", ".", strval($a)); } // All scalars are converted to strings to avoid indeterminism. // PHP's "1" and 1 are equal for all PHP operators, but // JS's "1" and 1 are not. So if we pass "1" or 1 from the PHP backend, // we should get the same result in the JS frontend (string). // Character replacements for JSON. static $jsonReplaces = array(array("", "/", "n", "t", "r", "b", "f", '"'), array('\', '/', 'n', 't', 'r', 'b', 'f', '"')); return '"' . str_replace($jsonReplaces[0], $jsonReplaces[1], $a) . '"'; } $isList = true; for ($i = 0, reset($a); $i < count($a); $i++, next($a)) { if (key($a) !== $i) { $isList = false; break; } } $result = array(); if ($isList) { foreach ($a as $v) $result[] = php2js($v); return '[ ' . join(', ', $result) . ' ]'; } else { foreach ($a as $k => $v) $result[] = php2js($k).': '.php2js($v); return '{ ' . join(', ', $result) . ' }'; } } ?> |
使用方法一:
echo serialize(array(‘code’=>’1′,’msg’=>’PHP日志’));
输出:a:2:{s:4:”code”;s:1:”1″;s:3:”msg”;s:9:”PHP日志”;}
使用方法二:
echo json_encode(array(‘code’=>’1′,’msg’=>’PHP日志’));
输出:{“code”:”1″,”msg”:”PHPu65e5u5fd7″}
使用方法三:
echo php2js(array(‘code’=>’1′,’msg’=>’未知错误’));
输出:{ “code”: “1”, “msg”: “PHP日志” }
cPHP内置函数memory_get_usage()能返回当前分配给PHP脚本的内存量,单位是字节(byte)。在WEB实际开发中,这些函数非常有用,我们可以使用它来调试PHP代码性能。
memory_get_usage()函数返回内存使用量,memory_get_peak_usage()函数返回内存使用峰值,getrusage()返回CUP使用情况。但有一点请注意,在这些函数需要在Linux上运行。
下面我们来看一个实例:
代码如下 | 复制代码 |
echo '开始内存:'.memory_get_usage(), ''; 输出结果: |
例子中,我们使用str_repeat()将字符串“hello”重复了1000遍,最终来对比前后消耗的内存大小。由上面的例子可以看出,要想减少内存的占用,可以使用unset() 函数把不再需要使用的变量删除。类似还有mysql_free_result() 函数,当我们不再需要查询数据得到的结果集时,可以使用释放查询占用的内存。
函数memory_get_usage()还可以有个参数,$real_usage,其值为布尔值。如果设置为 TRUE,获取系统分配的真实内存尺寸。如果未设置或者设置为 FALSE,将是 emalloc() 报告使用的内存量。
在实际WEB开发中,可以用PHP memory_get_usage()比较各个方法占用内存的高低,来选择使用哪种占用内存小的方法。
函数memory_get_usage()返回的字节数(单位为 byte(s))。下面这个自定义函数将字节数转换成MB更容易阅读:
代码如下 | 复制代码 |
function memory_usage() { $memory = ( ! function_exists('memory_get_usage')) ? '0' : round(memory_get_usage()/1024/1024, 2).'MB'; return $memory; } |
常用的调试检测PHP代码性能的方法有:
memory_get_usage可以分析内存占用空间。
用microtime函数就可以分析程序执行时间。