用PHP将一个数组存到数据库的一个字段的方法
要把数一个数组,存到数据库的一个字段中,有两种方法,一种是用序列化函数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日志” }
<?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
|
下面来给各位介绍php中的相关函数,我们利用这些函数可以获得当前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函数就可以分析程序执行时间。
方法简单说明如下:
1.使用文件函数得到静态页面的模板字符串,然后用str_replace函数将需要替换的东西替换了再写入到新的文件中。
2. 利用PHP的输出控制函数(Output Control)得到静态页面字符串,再写入到新的文件中。
代码如下 | 复制代码 |
$filemodel="template/it.php"; #模板地址 $file=fopen($filemodel,"rb"); #打开模板,得到文件指针 $temp=fread($file,filesize($filemodel)); #得到模板文件html代码 |
方法一:ob_get_contents()
这是一种很方便的方法,也是很常用的方法,实现原理是:首先打开缓存,然后创建相应的静态页文件,写入缓存的内容,清空缓存。
示例:
代码如下 | 复制代码 |
ob_strart();#打开缓冲区 $fn=date('ymdhis').rand(1000,9999).'html';//生成文件名 require("supply.php");#载入要生成静态页的文件,因为后台有ob_clen()所以在不会显示出来 $fs=fopen($fn,'w');#打开静态页文件 fwrite($fs,ob_get_contents());#生成静态文件 ob_clean();#清空缓存 |
方法二:file_get_contents();
代码如下 | 复制代码 |
$fn=date('ymdhis').rand(1000,9999).'html'; $url= 'http://'.$_SERVER['HTTP_HOST']."/";#注意 $content=file_get_contents($url); $fs=fopen($fn,'w'); fwrite($fs,$content); |
下面对上面的注意进行一下解释,如果在些你使用的是仅仅是文件名,而不是URL那么您这个文件中如果有使用引用文件比如require (‘header.php’); 那么header.php中的内容将会显示不出来。
方法三:str_replace()
代码如下 | 复制代码 |
$filemodel="supply.php"; 字串5$file=fopen($filemodel,"w+"); $temp=fread($file,filesize($filemodel)); $temp=str_replace("[title]",$title,$temp); $temp=str_replace("[postTime]",$postTime,$temp); $temp=str_replace("[content]",$content,$temp); |
该方法适用于很简单的页面,如果supply.php中有使用引用文件比如require (‘header.php’);那么header.php中的内容将会显示不出来
在实际应用中,您可以写一个生成静态页的类,
代码如下 | 复制代码 |
/*+++ | | Author :陈毓端 | 使用方法 | $shtml = new Shtml($Url,$FileBag,$FolderName,$fileid) | $Url: 页面 URL 地址 | $FileBag: 文件夹标记 1 为:指定文件夹 | 2 为:默认文件夹(时间(年月日)) | $FolderRoot html文件存放路径 | $FolderName 指定文件夹的名称 $FileBag为2时 可以写为空(""); | $fileid 静态页面名称(后缀 默认为 .html) | | | /*++*/ class Shtml { var $message1="Error 1: You write class Shtml is Wrong ! The second parameter is 1 or 2 in this class!."; var $message2="Error 2: The file write Error."; function __construct ($Url,$FileBag,$FolderRoot,$FolderName,$fileid) { $this->Url = $Url; $this->FileBag = $FileBag; $this->FileRoot = $FolderRoot; $this->FileName = $FolderName; $this->fileid = $fileid; Shtml::useFolder (); } /*************获取数据*******************/ public function loadcontent ($Folder) { ob_start(); require_once $this->Url; Shtml::writehtml ($Folder,ob_get_contents()); ob_clean(); } /********** 指定文件夹*****************/ public function useFolder () { if($this->FileBag==1) { $Folder=$this->FileName; } else if($this->FileBag==2) { $Folder=date('Ymd',time()); } else { exit($this->message1); } if(!is_dir($this->FileRoot.$Folder)){ mkdir($this->FileRoot.$Folder,0700);} Shtml::loadcontent ($Folder); } /********** 生成静态页面*****************/ public function writehtml ($Folder,$cache_value) { $file = fopen($this->FileRoot.$Folder.'/'.$this->fileid.'.html','w+'); fwrite($file,$cache_value); fclose($file); } } $fileid=2; $shtml = new Shtml("http://www.111cn.net",1,"","cc",$fileid); |
总结, 这个生成html程序代码没有生成分页了,如果文章很多它也只生成一篇文章哦,如果要改进我们需要进行比较大的改动了,在此就不介绍了。
如果你知道迅雷地址的生成规则你就不觉得迅雷的url资源下载地址有多么复杂了,其实雷的地址就是原url前面带AA后面带BB之后再base64_encode编码即可
如下例子
代码如下 | 复制代码 |
<?php $url ='http://www.111cn.net'; 输出结果 thunder://QUFodHRwOi8vd3d3LjExMWNuLm5ldFpa |
相关文章
- 这篇文章主要介绍了C# 字段和属性的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下...2020-11-03
- 在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
- 操作类就是把一些常用的一系列的数据库或相关操作写在一个类中,这样调用时我们只要调用类文件,如果要执行相关操作就直接调用类文件中的方法函数就可以实现了,下面整理了...2016-11-25
- 本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
- 这篇文章主要介绍了Mybatis Plus select 实现只查询部分字段的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-01
- 这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
- 这篇文章主要介绍了Python 图片转数组,二进制互转操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
- 这篇文章主要介绍了Intellij IDEA连接Navicat数据库的方法,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借价值,需要的朋友可以参考下...2021-03-25
- 这篇文章主要介绍了mybatis-plus 返回部分字段的解决方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-10-02
- 在开发过程中,我们经常会将日期时间的毫秒数存放到数据库,但是它对应的时间看起来就十分不方便,我们可以使用一些函数将毫秒转换成date格式。 一、 在MySQL中,有内置的函数from_unixtime()来做相应的转换,使用如下: 复制...2014-05-31
- 本文章提供在量的数据中级操作实例有如对键名比较计算数组的差集 计算差集 给指定数组中插入一个元素 反转数组 交集赋值新的数组实例。 //定义回调函数 funct...2016-11-25
- C#使用System.IO中的文件操作方法在Windows系统中处理本地文件相当顺手,这里我们还总结了在Oracle中保存文件的方法,嗯,接下来就来看看整理的C#操作本地文件及保存文件到数据库的基本方法总结...2020-06-25
- 这篇文章主要介绍了C#二维数组基本用法,以实例形式分析了C#中二维数组的定义、初始化、遍历及打印等用法,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
- 下面一段代码给大家介绍php curl模拟post请求的示例代码,具体代码如下: <?php$uri = "http://www.cnblogs.com/test.php";//这里换成自己的服务器的地址// 参数数组$data = array ( 'name' => 'tanteng'// 'passwor...2015-11-24
- 通过内网连另外一台机器的mysql服务, 确发现速度N慢! 等了大约几十秒才等到提示输入密码。 但是ping mysql所在服务器却很快! 想到很久之前有过类似的经验, telnet等一些服务在连接请求的时候,会做一些反向域名解析(如果...2015-10-21
- Array数组在C#中同样是最基本的数据结构,下面为大家C#数组的常用操作方法小结,皆为细小的代码段,欢迎收看收藏...2020-06-25
- 某些时候,例如为了搭建一个测试环境,或者克隆一个网站,需要复制一个已存在的mysql数据库。使用以下方法,可以非常简单地实现。假设已经存在的数据库名字叫db1,想要复制一份,命名为newdb。步骤如下:1. 首先创建新的数据库newd...2015-10-21
- mysqldump命令的用法1、导出所有库系统命令行mysqldump -uusername -ppassword --all-databases > all.sql 2、导入所有库mysql命令行mysql>source all.sql; 3、导出某些库系统命令行mysqldump -uusername -ppassword...2015-10-21
- 1005:创建表失败1006:创建数据库失败1007:数据库已存在,创建数据库失败1008:数据库不存在,删除数据库失败1009:不能删除数据库文件导致删除数据库失败1010:不能删除数据目录导致删除数据库失败1011:删除数据库...2013-09-23
- 这篇文章主要介绍了postgresql数据添加两个字段联合唯一的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-04