php生成html静态页面完整实例
addform.php文件
代码如下 | 复制代码 |
</textarea><br> <input type="submit" name="submit" value="提交"/> </form> |
add.php文件
代码如下 | 复制代码 |
<?php $title=$_POST['title'];
//以下用SQL语句添加数据至表 news //以下为关键之处,把从表单获得的数据替换模板中的{title},{content}标记 $handle=fopen($path,"w"); //写入方式打开新闻路径
|
mysql_inc.php数据库连接文件
代码如下 | 复制代码 |
<?php
function __construct($host,$name,$pass,$database,$ut){ }
function query($sql, $type = '') { function show($message = '', $sql = '') { function affected_rows() { function result($query, $row) { function num_rows($query) { function num_fields($query) { function free_result($query) { function insert_id() { function fetch_row($query) { function version() { function close() {
function htmtocode($content){ $db=new mysql("localhost","root","","database","utf8");
|
这几天工作有大量用curl,curl就是模拟浏览器来传输数据,他支持很多的协议HTPP,HTTPS,FTP….等等很多协议,在做采集和模拟用户来执行一些操作的时候非常有用的。
使用CURL主要是四个步骤:
1、初始化URL
2、设置请求的一些参数(COOKIE,HEAD…)
3、执行请求
4、关闭资源
先说一个简单的采集,一般在获取一个网页的内容的时候我们最方便就是使用file_get_contents()函数来获取,现在我们通过CURL来抓取一个网页的内容
代码如下 | 复制代码 |
$ch = curl_init();//初始化一个资源 |
注:重点在于curl_setopt()这个函数的第二个参数(下面会有一些常用的资料)
这样我们就可以得到这个网页的内容,如果只有CURL来做些这就大材小用了,CURL其实可以用来做更加神奇的东西。
最近刚到一家创业型的新公司(尼玛,选择这个公司真的是比较纠结,因为手里有好几个offer,但是这边给的工资待遇很低,因为创业型公司吗。我也不知道为什么会选择这家公司,反正是为了选择这家公司,朋友都很不解,其实我也不知道为什么会选择这家,其他公司的工资大概是这家公司的两倍,希望这次没有选错,不然.想死的心都会有,说了这么多废话),做的是现在比较火的微信公众平台的开发,因为微信现在开放的接口特别的少,所以通过接口得到的东西特别的少(尼玛,小马哥你什么时候多放的借口啊!),但是官方提供的操作平台有很多接口中没有数据所以,我们需要去自己去找一些数据了,好吧,主角上场CURL。
首先公众平台是要登录才能访问,那我就先登录吧(废话),首先需要抓包分析一下正常提交数据,这里我就不截图了(博客在bae平台上,编辑器还没有时间去理他,不太好使),通过抓包分析得出,微信的公众平台使用的是ajax登录,且密码在提交之前已经进行了md5加密(好像正规应该叫md5散列把,而且标准的MD5散列应该是128位的,不过为了方便存储和传输就现在最多的就是32和16位了,刚了解,惭愧),还有很重要一点就是,微信公众平台采用的是https协议进行登录的。最爽的一点就是不用验证码,sogay。不然老费劲了,分析到这就可以了。Come on !!!!
代码如下 | 复制代码 |
//这里的头信息都是必须要设置的,这些你都可以在刚才抓包的时候获取到
$ch = curl_init(); curl_setopt($ch,CURLOPT_COOKIEJAR,$cookie_file);//设置cookie的保存目录,这里很重要,你懂的(cookie你都不存,你以为你是麻花腾啊!) //获取到token的值 $loginData = json_decode($loginData,true); $token = explode("=",$loginData['ErrMsg']); $token = array_pop($token); echo "登录微信系统成功<br />";
|
上边就是登录微信公众平台的代码了,经测试十分好用+_+。
这几天微信公众平台接触的比较多,这个只是万里长征的第一步,后边我会分享一下如何将微信的fakeid 和 openid对应起来,实现自己可以自己的平台上显示用户的完整信息(据我了解,网上现在对于如何fakeid 和 openid对应来没有很好的解决方案,通过好几天的奋斗现在已经可以对应起来的,比较麻烦,且已有的用户是无法对起来的(其实这个理论上是可以的,但是没有做出来不乱说,其实是没有时间去做这个,有机会可以尝试,不过实现需要已有系统的支持,也就是你现在的系统必须记录了和用回的聊天记录(我说什么了?我什么都没有说!)))。
体育老师啊,你说你不好好带你的体育课,没有跑来教我们语文,这几天接触不少能写的东西太多了,所以想到那就写到那了,有点乱,几天主要用的是CURL,所以今天说点CURL的实例,正好就把手头的登录微信公众平台的东西写上来了,CURL到此结束,后边我可能会写更多关于微信公众平台的东西。
附:
选项 |
可选value值 |
备注 |
CURLOPT_AUTOREFERER |
当根据Location:重定向时,自动设置header中的Referer:信息。 |
|
CURLOPT_BINARYTRANSFER |
在启用CURLOPT_RETURNTRANSFER的时候,返回原生的(Raw)输出。 |
|
CURLOPT_COOKIESESSION |
启用时curl会仅仅传递一个session cookie,忽略其他的cookie,默认状况下cURL会将所有的cookie返回给服务端。session cookie是指那些用来判断服务器端的session是否有效而存在的cookie。 |
|
CURLOPT_CRLF |
启用时将Unix的换行符转换成回车换行符。 |
|
CURLOPT_DNS_USE_GLOBAL_CACHE |
启用时会启用一个全局的DNS缓存,此项为线程安全的,并且默认启用。 |
|
CURLOPT_FAILONERROR |
显示HTTP状态码,默认行为是忽略编号小于等于400的HTTP信息。 |
|
CURLOPT_FILETIME |
启用时会尝试修改远程文档中的信息。结果信息会通过curl_getinfo()函数的CURLINFO_FILETIME选项返回。 curl_getinfo(). |
|
CURLOPT_FOLLOWLOCATION |
启用时会将服务器服务器返回的"Location: "放在header中递归的返回给服务器,使用CURLOPT_MAXREDIRS可以限定递归返回的数量。 |
|
CURLOPT_FORBID_REUSE |
在完成交互以后强迫断开连接,不能重用。 |
|
CURLOPT_FRESH_CONNECT |
强制获取一个新的连接,替代缓存中的连接。 |
|
CURLOPT_FTP_USE_EPRT |
启用时当FTP下载时,使用EPRT (或 LPRT)命令。设置为FALSE时禁用EPRT和LPRT,使用PORT命令 only. |
|
CURLOPT_FTP_USE_EPSV |
启用时,在FTP传输过程中回复到PASV模式前首先尝试EPSV命令。设置为FALSE时禁用EPSV命令。 |
|
CURLOPT_FTPAPPEND |
启用时追加写入文件而不是覆盖它。 |
|
CURLOPT_FTPASCII |
CURLOPT_TRANSFERTEXT的别名。 |
|
CURLOPT_FTPLISTONLY |
启用时只列出FTP目录的名字。 |
|
CURLOPT_HEADER |
启用时会将头文件的信息作为数据流输出。 |
|
CURLINFO_HEADER_OUT |
启用时追踪句柄的请求字符串。 |
从 PHP 5.1.3 开始可用。CURLINFO_前缀是故意的(intentional)。 |
CURLOPT_HTTPGET |
启用时会设置HTTP的method为GET,因为GET是默认是,所以只在被修改的情况下使用。 |
|
CURLOPT_HTTPPROXYTUNNEL |
启用时会通过HTTP代理来传输。 |
|
CURLOPT_MUTE |
启用时将cURL函数中所有修改过的参数恢复默认值。 |
|
CURLOPT_NETRC |
在连接建立以后,访问~/.netrc文件获取用户名和密码信息连接远程站点。 |
|
CURLOPT_NOBODY |
启用时将不对HTML中的BODY部分进行输出。 |
|
CURLOPT_NOPROGRESS |
启用时关闭curl传输的进度条,此项的默认设置为启用。 Note:PHP自动地设置这个选项为TRUE,这个选项仅仅应当在以调试为目的时被改变。
|
|
CURLOPT_NOSIGNAL |
启用时忽略所有的curl传递给php进行的信号。在SAPI多线程传输时此项被默认启用。 |
cURL 7.10时被加入。 |
CURLOPT_POST |
启用时会发送一个常规的POST请求,类型为:application/x-www-form-urlencoded,就像表单提交的一样。 |
|
CURLOPT_PUT |
启用时允许HTTP发送文件,必须同时设置CURLOPT_INFILE和CURLOPT_INFILESIZE。 |
|
CURLOPT_RETURNTRANSFER |
将curl_exec()获取的信息以文件流的形式返回,而不是直接输出。 |
|
CURLOPT_SSL_VERIFYPEER |
禁用后cURL将终止从服务端进行验证。使用CURLOPT_CAINFO选项设置证书使用CURLOPT_CAPATH选项设置证书目录 如果CURLOPT_SSL_VERIFYPEER(默认值为2)被启用,CURLOPT_SSL_VERIFYHOST需要被设置成TRUE否则设置为FALSE。 |
自cURL 7.10开始默认为TRUE。从cURL 7.10开始默认绑定安装。 |
CURLOPT_TRANSFERTEXT |
启用后对FTP传输使用ASCII模式。对于LDAP,它检索纯文本信息而非HTML。在Windows系统上,系统不会把STDOUT设置成binary模式。 |
|
CURLOPT_UNRESTRICTED_AUTH |
在使用CURLOPT_FOLLOWLOCATION产生的header中的多个locations中持续追加用户名和密码信息,即使域名已发生改变。 |
|
CURLOPT_UPLOAD |
启用后允许文件上传。 |
|
CURLOPT_VERBOSE |
启用时会汇报所有的信息,存放在STDERR或指定的CURLOPT_STDERR中。 |
|
对于下面的这些option的可选参数,value应该被设置一个integer类型的值:
选项 |
可选value值 |
备注 |
CURLOPT_BUFFERSIZE |
每次获取的数据中读入缓存的大小,但是不保证这个值每次都会被填满。 |
在cURL 7.10中被加入。 |
CURLOPT_CLOSEPOLICY |
不是CURLCLOSEPOLICY_LEAST_RECENTLY_USED就是CURLCLOSEPOLICY_OLDEST,还存在另外三个CURLCLOSEPOLICY_,但是cURL暂时还不支持。 |
|
CURLOPT_CONNECTTIMEOUT |
在发起连接前等待的时间,如果设置为0,则无限等待。 |
|
CURLOPT_CONNECTTIMEOUT_MS |
尝试连接等待的时间,以毫秒为单位。如果设置为0,则无限等待。 |
在cURL 7.16.2中被加入。从PHP 5.2.3开始可用。 |
CURLOPT_DNS_CACHE_TIMEOUT |
设置在内存中保存DNS信息的时间,默认为120秒。 |
|
CURLOPT_FTPSSLAUTH |
FTP验证方式:CURLFTPAUTH_SSL (首先尝试SSL),CURLFTPAUTH_TLS (首先尝试TLS)或CURLFTPAUTH_DEFAULT (让cURL自动决定)。 |
在cURL 7.12.2中被加入。 |
CURLOPT_HTTP_VERSION |
CURL_HTTP_VERSION_NONE(默认值,让cURL自己判断使用哪个版本),CURL_HTTP_VERSION_1_0 (强制使用 HTTP/1.0)或CURL_HTTP_VERSION_1_1 (强制使用 HTTP/1.1)。 |
|
CURLOPT_HTTPAUTH |
使用的HTTP验证方法,可选的值有:CURLAUTH_BASIC、CURLAUTH_DIGEST、CURLAUTH_GSSNEGOTIATE、CURLAUTH_NTLM、CURLAUTH_ANY和CURLAUTH_ANYSAFE。 可以使用|位域(或)操作符分隔多个值,cURL让服务器选择一个支持最好的值。CURLAUTH_ANY等价于CURLAUTH_BASIC | CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM. CURLAUTH_ANYSAFE等价于CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM. |
|
CURLOPT_INFILESIZE |
设定上传文件的大小限制,字节(byte)为单位。 |
|
CURLOPT_LOW_SPEED_LIMIT |
当传输速度小于CURLOPT_LOW_SPEED_LIMIT时(bytes/sec),PHP会根据CURLOPT_LOW_SPEED_TIME来判断是否因太慢而取消传输。 |
|
CURLOPT_LOW_SPEED_TIME |
当传输速度小于CURLOPT_LOW_SPEED_LIMIT时(bytes/sec),PHP会根据CURLOPT_LOW_SPEED_TIME来判断是否因太慢而取消传输。 |
|
CURLOPT_MAXCONNECTS |
允许的最大连接数量,超过是会通过CURLOPT_CLOSEPOLICY决定应该停止哪些连接。 |
|
CURLOPT_MAXREDIRS |
指定最多的HTTP重定向的数量,这个选项是和CURLOPT_FOLLOWLOCATION一起使用的。 |
|
CURLOPT_PORT |
用来指定连接端口。(可选项) |
|
CURLOPT_PROTOCOLS |
CURLPROTO_*的位域指。如果被启用,位域值会限定libcurl在传输过程中有哪些可使用的协议。这将允许你在编译libcurl时支持众多协议,但是限制只是用它们中被允许使用的一个子集。默认libcurl将会使用全部它支持的协议。参见CURLOPT_REDIR_PROTOCOLS. 可用的协议选项为:CURLPROTO_HTTP、CURLPROTO_HTTPS、CURLPROTO_FTP、CURLPROTO_FTPS、CURLPROTO_SCP、CURLPROTO_SFTP、CURLPROTO_TELNET、CURLPROTO_LDAP、CURLPROTO_LDAPS、CURLPROTO_DICT、CURLPROTO_FILE、CURLPROTO_TFTP、CURLPROTO_ALL |
在cURL 7.19.4中被加入。 |
CURLOPT_PROXYAUTH |
HTTP代理连接的验证方式。使用在CURLOPT_HTTPAUTH中的位域标志来设置相应选项。对于代理验证只有CURLAUTH_BASIC和CURLAUTH_NTLM当前被支持。 |
在cURL 7.10.7中被加入。 |
CURLOPT_PROXYPORT |
代理服务器的端口。端口也可以在CURLOPT_PROXY中进行设置。 |
|
CURLOPT_PROXYTYPE |
不是CURLPROXY_HTTP (默认值) 就是CURLPROXY_SOCKS5。 |
在cURL 7.10中被加入。 |
CURLOPT_REDIR_PROTOCOLS |
CURLPROTO_*中的位域值。如果被启用,位域值将会限制传输线程在CURLOPT_FOLLOWLOCATION开启时跟随某个重定向时可使用的协议。这将使你对重定向时限制传输线程使用被允许的协议子集默认libcurl将会允许除FILE和SCP之外的全部协议。这个和7.19.4预发布版本种无条件地跟随所有支持的协议有一些不同。关于协议常量,请参照CURLOPT_PROTOCOLS。 |
在cURL 7.19.4中被加入。 |
CURLOPT_RESUME_FROM |
在恢复传输时传递一个字节偏移量(用来断点续传)。 |
|
CURLOPT_SSL_VERIFYHOST |
1 检查服务器SSL证书中是否存在一个公用名(common name)。译者注:公用名(Common Name)一般来讲就是填写你将要申请SSL证书的域名 (domain)或子域名(sub domain)。2 检查公用名是否存在,并且是否与提供的主机名匹配。 |
|
CURLOPT_SSLVERSION |
使用的SSL版本(2 或 3)。默认情况下PHP会自己检测这个值,尽管有些情况下需要手动地进行设置。 |
|
CURLOPT_TIMECONDITION |
如果在CURLOPT_TIMEVALUE指定的某个时间以后被编辑过,则使用CURL_TIMECOND_IFMODSINCE返回页面,如果没有被修改过,并且CURLOPT_HEADER为true,则返回一个"304 Not Modified"的header, CURLOPT_HEADER为false,则使用CURL_TIMECOND_IFUNMODSINCE,默认值为CURL_TIMECOND_IFUNMODSINCE。 |
|
CURLOPT_TIMEOUT |
设置cURL允许执行的最长秒数。 |
|
CURLOPT_TIMEOUT_MS |
设置cURL允许执行的最长毫秒数。 |
在cURL 7.16.2中被加入。从PHP 5.2.3起可使用。 |
CURLOPT_TIMEVALUE |
设置一个CURLOPT_TIMECONDITION使用的时间戳,在默认状态下使用的是CURL_TIMECOND_IFMODSINCE。 |
|
对于下面的这些option的可选参数,value应该被设置一个string类型的值:
选项 |
可选value值 |
备注 |
CURLOPT_CAINFO |
一个保存着1个或多个用来让服务端验证的证书的文件名。这个参数仅仅在和CURLOPT_SSL_VERIFYPEER一起使用时才有意义。 . |
|
CURLOPT_CAPATH |
一个保存着多个CA证书的目录。这个选项是和CURLOPT_SSL_VERIFYPEER一起使用的。 |
|
CURLOPT_COOKIE |
设定HTTP请求中"Cookie: "部分的内容。多个cookie用分号分隔,分号后带一个空格(例如, "fruit=apple; colour=red")。 |
|
CURLOPT_COOKIEFILE |
包含cookie数据的文件名,cookie文件的格式可以是Netscape格式,或者只是纯HTTP头部信息存入文件。 |
|
CURLOPT_COOKIEJAR |
连接结束后保存cookie信息的文件。 |
|
CURLOPT_CUSTOMREQUEST |
使用一个自定义的请求信息来代替"GET"或"HEAD"作为HTTP请求。这对于执行"DELETE" 或者其他更隐蔽的HTTP请求。有效值如"GET","POST","CONNECT"等等。也就是说,不要在这里输入整个HTTP请求。例如输入"GET /index.html HTTP/1.0rnrn"是不正确的。 Note: 在确定服务器支持这个自定义请求的方法前不要使用。
|
|
CURLOPT_EGDSOCKET |
类似CURLOPT_RANDOM_FILE,除了一个Entropy Gathering Daemon套接字。 |
|
CURLOPT_ENCODING |
HTTP请求头中"Accept-Encoding: "的值。支持的编码有"identity","deflate"和"gzip"。如果为空字符串"",请求头会发送所有支持的编码类型。 |
在cURL 7.10中被加入。 |
CURLOPT_FTPPORT |
这个值将被用来获取供FTP"POST"指令所需要的IP地址。"POST"指令告诉远程服务器连接到我们指定的IP地址。这个字符串可以是纯文本的IP地址、主机名、一个网络接口名(UNIX下)或者只是一个'-'来使用默认的IP地址。 |
|
CURLOPT_INTERFACE |
网络发送接口名,可以是一个接口名、IP地址或者是一个主机名。 |
|
CURLOPT_KRB4LEVEL |
KRB4 (Kerberos 4) 安全级别。下面的任何值都是有效的(从低到高的顺序):"clear"、"safe"、"confidential"、"private".。如果字符串和这些都不匹配,将使用"private"。这个选项设置为NULL时将禁用KRB4 安全认证。目前KRB4 安全认证只能用于FTP传输。 |
|
CURLOPT_POSTFIELDS |
全部数据使用HTTP协议中的"POST"操作来发送。要发送文件,在文件名前面加上@前缀并使用完整路径。这个参数可以通过urlencoded后的字符串类似'para1=val1¶2=val2&…'或使用一个以字段名为键值,字段数据为值的数组。如果value是一个数组,Content-Type头将会被设置成multipart/form-data。 |
|
CURLOPT_PROXY |
HTTP代理通道。 |
|
CURLOPT_PROXYUSERPWD |
一个用来连接到代理的"[username]:[password]"格式的字符串。 |
|
CURLOPT_RANDOM_FILE |
一个被用来生成SSL随机数种子的文件名。 |
|
CURLOPT_RANGE |
以"X-Y"的形式,其中X和Y都是可选项获取数据的范围,以字节计。HTTP传输线程也支持几个这样的重复项中间用逗号分隔如"X-Y,N-M"。 |
|
CURLOPT_REFERER |
在HTTP请求头中"Referer: "的内容。 |
|
CURLOPT_SSL_CIPHER_LIST |
一个SSL的加密算法列表。例如RC4-SHA和TLSv1都是可用的加密列表。 |
|
CURLOPT_SSLCERT |
一个包含PEM格式证书的文件名。 |
|
CURLOPT_SSLCERTPASSWD |
使用CURLOPT_SSLCERT证书需要的密码。 |
|
CURLOPT_SSLCERTTYPE |
证书的类型。支持的格式有"PEM" (默认值), "DER"和"ENG"。 |
在cURL 7.9.3中被加入。 |
CURLOPT_SSLENGINE |
用来在CURLOPT_SSLKEY中指定的SSL私钥的加密引擎变量。 |
|
CURLOPT_SSLENGINE_DEFAULT |
用来做非对称加密操作的变量。 |
|
CURLOPT_SSLKEY |
包含SSL私钥的文件名。 |
|
CURLOPT_SSLKEYPASSWD |
在CURLOPT_SSLKEY中指定了的SSL私钥的密码。 Note: 由于这个选项包含了敏感的密码信息,记得保证这个PHP脚本的安全。
|
|
CURLOPT_SSLKEYTYPE |
CURLOPT_SSLKEY中规定的私钥的加密类型,支持的密钥类型为"PEM"(默认值)、"DER"和"ENG"。 |
|
CURLOPT_URL |
需要获取的URL地址,也可以在curl_init()函数中设置。 |
|
CURLOPT_USERAGENT |
在HTTP请求中包含一个"User-Agent: "头的字符串。 |
|
CURLOPT_USERPWD |
传递一个连接中需要的用户名和密码,格式为:"[username]:[password]"。 |
代码如下 | 复制代码 |
<?php $IDCard = new IDCard(); var_dump($IDCard::isCard($_GET['card'])); /** * 身份证处理类 */ class IDCard { //检证身份证是否正确 public static function isCard($card) { $card = self::to18Card($card); if (strlen($card) != 18) { return false; } $cardBase = substr($card, 0, 17); return (self::getVerifyNum($cardBase) == strtoupper(substr($card, 17, 1))); } //格式化15位身份证号码为18位 public static function to18Card($card) { $card = trim($card); if (strlen($card) == 18) { return $card; } if (strlen($card) != 15) { return false; } // 如果身份证顺序码是996 997 998 999,这些是为百岁以上老人的特殊编码 if (array_search(substr($card, 12, 3), array('996', '997', '998', '999')) !== false) { $card = substr($card, 0, 6) . '18' . substr($card, 6, 9); } else { $card = substr($card, 0, 6) . '19' . substr($card, 6, 9); } $card = $card . self::getVerifyNum($card); return $card; } // 计算身份证校验码,根据国家标准gb 11643-1999 private static function getVerifyNum($cardBase) { if (strlen($cardBase) != 17) { return false; } // 加权因子 $factor = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2); // 校验码对应值 $verify_number_list = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'); $checksum = 0; for ($i = 0; $i < strlen($cardBase); $i++) { $checksum += substr($cardBase, $i, 1) * $factor[$i]; } $mod = $checksum % 11; $verify_number = $verify_number_list[$mod]; return $verify_number; } } ?> |
要模拟浏览器访问网站,首选要学会观察浏览器是如何发送http报文的,以及网站服务器返回给浏览器 是什么样的内容。我推荐安装一个国外人开发的httpwatch的软件,最好搞个破解的版本,否则有些功能是使用不了的。这个软件安装完成之后是嵌入在 IE里的,启动Record,在地址栏输入网址后回车,它就会将浏览器和服务器之间的所有通讯扫描出来,让你一览无遗。关于这个软件的使用在本文不做介 绍。
模拟浏览器登陆应用开发,最关键的地方是突破登陆验证。CURL技术不只支持http,还支持https。区别就在多了一层SSL加密传输。如果是要登陆 https网站,php记得要支持openssl。还是先拿一个例子来分析。
代码如下 | 复制代码 |
<?php $post_fields = array(); //获取表单FORMHASH //POST数据,获取COOKIE,cookie文件放在网站的temp目录下 $ch = curl_init($login_url); //取到了关键的cookie文件就可以带着cookie文件去模拟发帖,fid为论坛的栏目ID
//这里的hash码和登陆窗口的hash码的正则不太一样,这里的hidden多了一个id属性
//清理cookie文件 |
CURL实现网站模拟登陆
代码如下 | 复制代码 |
<?php$cookie_file=tempnam('./temp','cookie');$login_url='/bbs/logging.php?action=login&loginsubmit=yes';$post_fields='username=用户名&password=用户密码&referer=index.php&formhash=24eca8af&loginfield=username&questionid=0&loginsubmit=登录';$ch = curl_init($login_url);curl_setopt($ch,CURLOPT_HEADER,0);curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);curl_setopt($ch,CURLOPT_POST,1);curl_setopt($ch,CURLOPT_POSTFIELDS,$post_fields);curl_setopt($ch,CURLOPT_COOKIEJAR,$cookie_file);curl_exec($ch);curl_close($ch);$url='/bbs';$ch =curl_init($url);curl_setopt($ch,CURLOPT_HEADER,0);curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);curl_setopt($ch,CURLOPT_COOKIEFILE,$cookie_file);$contents=curl_exec($ch);echo $contents;curl_close($ch);?> |
一般读取文件我们用fopen 或者 file_get_contents ,前者可以循环读取,后者可以一次性读取,但都是将文件内容一次性加载来操作。如果加载的文件特别大时,如几百M,上G时,这时性能就降下来了,那么PHP里有没有对大文件的处理函数或者类呢? 答案是:有的。
PHP真的越来越“面向对象”了,一些原有的基础的SPL方法都开始陆续地实现出class了。
从 PHP 5.1.0 开始,SPL 库增加了 SplFileObject 与 SplFileInfo 两个标准的文件操作类。SplFileInfo 是从 PHP 5.1.2 开始实现的。
从字面意思理解看,可以看出 SplFileObject 要比 SplFileInfo 更为强大。
不错,SplFileInfo 仅用于获取文件的一些属性信息,如文件大小、文件访问时间、文件修改时间、后缀名等值,而 SplFileObject 是继承 SplFileInfo 这些功能的。
代码如下 | 复制代码 |
/** 返回文件从X行到Y行的内容(支持php5、php4) |
Ps: 上面都没加”读取到末尾的判断”:!$fp->eof() 或者 !feof($fp),加上这个判断影响效率,自己加上测试很多很多很多行的运行时间就晓得了,而且这里加上也完全没必要。
从上面的函数就可以看出来使用SplFileObject比下面的fgets要快多了,特别是文件行数非常多、并且要取后面的内容的时候。fgets要两个循环才可以,并且要循环$endLine次。
此方法花了不少功夫,测试了很多中写法,就是想得出效率最高的方法。哪位觉得有值得改进的欢迎赐教。
使用,返回35270行-35280行的内容:
代码如下 | 复制代码 |
echo '<pre>'; |
再看一个实例
代码如下 | 复制代码 |
function readBigFile($filename, $count = 20, $tag = "rn") { |
注意:通过使用PHP的fseek和fread相结合,即可做到随意读取文件中的某一部份数据,关于函数传入的变量$tag的值,根据系统不一样,传入的值也是有区别的:Windows用”rn”,linux/unix用”n”,Mac OS用”r”。
相关文章
- 本文介绍两种使用 php 生成二维码的方法。 (1)利用google生成二维码的开放接口,代码如下: /** * google api 二维码生成【QRcode可以存储最多4296个字母数字类型的任意文本,具体可以查看二维码数据格式】 * @param strin...2015-10-21
- 这篇文章主要介绍了Java生成随机姓名、性别和年龄的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-10-01
- 这篇文章主要介绍了C#生成随机数功能,涉及C#数学运算与字符串操作相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
- 关于生成唯一数字ID的问题,是不是需要使用rand生成一个随机数,然后去数据库查询是否有这个数呢?感觉这样的话有点费时间,有没有其他方法呢?当然不是,其实有两种方法可以解决。 1. 如果你只用php而不用数据库的话,那时间戳+随...2015-11-24
- 下面小编就为大家带来一篇jQuery为动态生成的select元素添加事件的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-09-01
- 经常制作开发不同的网站的后台,写过很多种不同的后台导航写法。 最终积累了这种最写法,算是最好的吧...2013-09-29
- js生成随机数主要用到了内置的Math对象的random()方法。用法如:Math.random()。它返回的是一个 0 ~ 1 之间的随机数。有了这么一个方法,那生成任意随机数就好理解了。比如实际中我们可能会有如下的需要: (1)生成一个 0 - 1...2015-10-21
- 验证码是一个现在WEB2.0中常见的一个功能了,像注册、登录又或者是留言页面,都需要注册码来验证当前操作者的合法性,我们会看到有些网站没有验证码,但那是更高级的验证了,...2016-11-25
- 复制代码 代码如下:function getTagStyle(){ $minFontSize=8; //最小字体大小,可根据需要自行更改 $maxFontSize=18; //最大字体大小,可根据需要自行更改 return 'font-size:'.($minFontSize+lcg_value()*(abs($maxFo...2013-10-04
- 解决办法:$str=”QB”.str_pad(($maxid[0]["max(id)"]+1),5,”0″,STR_PAD_LEFT ); 其中$maxid[0]["max(id)"]+1) 是利用max函数从数据库中找也ID最大的一个值, ID为主键,不会重复。 str_pad() 函数把字符串填充为指...2013-10-04
- 下面小编就为大家带来一篇JS生成某个范围的随机数【四种情况详解】。小编觉得挺不错的,现在分享给大家,也给大家做个参考,一起跟随小编过来看看吧...2016-04-22
- 这篇文章详细的介绍了C#中的静态,有需要的朋友可以参考一下...2020-06-25
- 这篇文章主要介绍了C#生成Word文档代码示例,本文直接给出代码实例,需要的朋友可以参考下...2020-06-25
- 本文主要介绍了Vue组件文档生成工具库的方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-08-11
- C#静态方法与非静态方法的区别不仅仅是概念上的,那么他们有什么具体的区别呢?让我们通过本文向大家介绍下C#中静态方法和非静态方法的区别,一起看看吧...2020-06-25
- 这篇文章主要介绍了PHP简单实现生成txt文件到指定目录的方法,简单对比分析了PHP中fwrite及file_put_contents等函数的使用方法,需要的朋友可以参考下...2016-04-28
- 今天在使用西部数码空间时发现里面有很多定义好的伪静态规则了,下面我来给大家介绍一下在后面主机面板中配置使用伪静态功能吧,希望文章对各位会带来帮助。...2016-10-10
- 这篇文章主要介绍了史上最简洁C# 生成条形码图片思路及示例分享,需要的朋友可以参考下...2020-06-25
- $doc = new domdocument('1.0'); // we want a nice output $doc->formatoutput = true; 代码如下 复制代码 $root = $doc->createelement('bo...2016-11-25
- PHPWord是一个可以把相关文件生成word文档的插件了,但由于是老外开发的对于gbk支持不好,所以我们在导出带有中文的word时会出现乱码问题,下面本文就PHPWord中文乱码问题...2016-11-25