php中读写文件与读写数据库的效率
测试程序如下:
//说明1:由于读数据库语句调用简单的封包函数两次,所以把读文件也改成连续调用两次,数据库记录ID为1就在第一条,并且唯一索引。
代码如下 | 复制代码 |
//说明2:测试两次一次是4K数据,一次是整形数据 set_time_limit(0); function fnGet($filename) function fnGetContent($filename) $begin=fnGetMicroTime(); $begin=fnGetMicroTime(); $dbcon->mydb_free_results(); fnWriteCache('test.txt',$content); echo '直接读文件测试结果:<br/>'; //--------------------------------- $begin=fnGetMicroTime(); |
4K大小数据的查询结果:
fetch_row 100000 次时间:16.737720012665秒
fetch_array 100000 次时间:16.661195993423秒
fetch_object 100000 次时间:16.775065898895秒
直接读文件测试结果:
file_get_contents直接读100000次时间:5.4631857872009秒
fopen直接读100000次时间:11.463611125946秒
整形ID查询结果:
fetch_row 100000 次时间:12.812072038651秒
fetch_array 100000 次时间:12.667390108109秒
fetch_object 100000 次时间:12.988099098206秒
直接读文件测试结果:
file_get_contents直接读100000次时间:5.6616430282593秒
fopen直接读100000次时间:11.542816877365秒
测试结论:
1、直接读文件相比数据库查询效率更胜一筹,而且文中还没算上连接和断开的时间。
2、一次读取的内容越大,直接读文件的优势会越明显(读文件时间都是小幅增长,这跟文件存储的连续性和簇大小等有关系),这个结果恰恰跟天缘预料的相反,说明MYSQL对更大文件读取可能又附加了某些操作(两次时间增长了近30%),如果只是单纯的赋值转换应该是差异偏小才对。
3、写文件和INSERT几乎不用测试就可以推测出,数据库效率只会更差。
4、很小的配置文件如果不需要使用到数据库特性,更加适合放到独立文件里存取,无需单独创建数据表或记录,很大的文件比如图片、音乐等采用文件存储更为方便,只把路径或缩略图等索引信息放到数据库里更合理一些。
5、PHP上如果只是读文件,file_get_contents比fopen、fclose更有效率,不包括判断存在这个函数时间会少3秒左右。
6、fetch_row和fetch_object应该是从fetch_array转换而来的,天缘没看过PHP的源码,单从执行上就可以说明fetch_array效率更高,这跟网上的说法似乎相反。
本文章来给大家介绍二种利用php来实现页面跳转与跨站提交伪造Referer地址来源具体实现,方法主要用到了fsockopen,curl两个函数,有需要了解的朋友可进入参考。一、尝试过的URL跳转方法
代码如下 | 复制代码 |
echo '<meta http-equiv="refresh" content="0; URL='.$url.'">'; echo '<scrīpt language="Javascrīpt">window.location.href="'.$url.'";</scrīpt>'; echo '<script language="Javascrīpt">window.location.replace="'.$url.'";</ script>'; |
以上三种方法均无法传递REFERER地址。
二、使用PHP Socket函数伪造REFER
下面是PHP伪造REFERER代码部分,经过测试可以实现REFERER地址传递,其中$url是输入地址。
代码如下 | 复制代码 |
$uinfo = parse_url($url);//解析URL地址,比如http://111cn.net/archives/1.html if($uinfo['path']) // $data = $uinfo['path'];//这里得到/archives/1.html else $data = '/';//默认根 if(!$fsp = @fsockopen($uinfo['host'], (($uinfo['port']) ? $uinfo['port'] : "80"), $errno, $errstr, 12)){ echo "对不起对方网站暂时无法打开,请您稍后访问:".$uinfo['host']; exit; }else{ fputs($fsp, "GET “.$data .” HTTP/1.0rn");//如果是跨站POST提交,可使用POST方法 fputs($fsp, "Host: ".$uinfo['host']."rn"); fputs($fsp, "Referer: 111cn.netrn");//伪造REFERER地址 fputs($fsp, "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)rnrn"); $res=''; while(!feof($fsp)) { $res.=fgets($fsp, 128); if(strstr($res,"200 OK")) { header("Location:$url"); exit; } } } //如果是301或302状态码可以继续处理 //返回地址大概形式:HTTP/1.1 301 Moved PermanentlynContent-Length: 164nContent-Type: text/htmlnLocation: http://111cn.net/ $arr=explode("n",$res); $arr=explode(": ",$arr[3]);//Location后面是真实重定向地址 header("location:".$arr[0]);//跳转目标地址 exit; |
利用另一种方法 curl)伪造HTTP_REFERER
代码如下 | 复制代码 |
//PHP(前提是装了curl): //PHP(不装curl用sock) |
例如:下载时输出 下载文件大小,文件名等等
前提是.htaccess文件的配置需要添加一句
SetEnv no-gzip dont-vary
就是针对文件不进行压缩处理
例1
代码如下 | 复制代码 |
<?php |
例2
代码如下 | 复制代码 |
$fname = './MMLDZG.mp3'; $fp = fopen($fname,'rb'); $fsize = filesize($fname); if (isset($_SERVER['HTTP_RANGE']) && ($_SERVER['HTTP_RANGE'] != "") && preg_match("/^bytes=([0-9]+)-$/i", $_SERVER['HTTP_RANGE'], $match) && ($match[1] < $fsize)) { $start = $match[1]; } else { $start = 0; } @header("Cache-control: public"); @header("Pragma: public"); if ($star--> 0) { fseek($fp, $start); Header("HTTP/1.1 206 Partial Content"); Header("Content-Length: " . ($fsize - $start)); Header("Content-Ranges: bytes" . $start . "-" . ($fsize - 1) . "/" . $fsize); } else { header("Content-Length: $fsize"); Header("Accept-Ranges: bytes"); } @header("Content-Type: application/octet-stream"); @header("Content-Disposition: attachment;filename=mmdld.mp3"); fpassthru($fp); |
fpassthru() 函数输出文件指针处的所有剩余数据。
该函数将给定的文件指针从当前的位置读取到 EOF,并把结果写到输出缓冲区
上面两个实例对中文支持不好,下面这个函数很好的解决了这个问题
代码如下 | 复制代码 |
<?php /** * PHP-HTTP断点续传实现 * @param string $path: 文件所在路径 * @param string $file: 文件名 * @return void */ function download($path,$file) { $real = $path.'/'.$file; if(!file_exists($real)) { return false; } $size = filesize($real); $size2 = $size-1; $range = 0; if(isset($_SERVER['HTTP_RANGE'])) { header('HTTP /1.1 206 Partial Content'); $range = str_replace('=','-',$_SERVER['HTTP_RANGE']); $range = explode('-',$range); $range = trim($range[1]); header('Content-Length:'.$size); header('Content-Range: bytes '.$range.'-'.$size2.'/'.$size); } else { header('Content-Length:'.$size); header('Content-Range: bytes 0-'.$size2.'/'.$size); } header('Accenpt-Ranges: bytes'); header('application/octet-stream'); header("Cache-control: public"); header("Pragma: public"); //解决在IE中下载时中文乱码问题 $ua = $_SERVER['HTTP_USER_AGENT']; if(preg_match('/MSIE/',$ua)) { $ie_filename = str_replace('+','%20',urlencode($file)); header('Content-Dispositon:attachment; filename='.$ie_filename); } else { header('Content-Dispositon:attachment; filename='.$file); } $fp = fopen($real,'rb+'); fseek($fp,$range); while(!feof($fp)) { set_time_limit(0); print(fread($fp,1024)); flush(); ob_flush(); } fclose($fp); } /*End of PHP*/ |
最简单的实例如下
代码如下 | 复制代码 |
<form action="" method="post" enctype="multipart/form-data"> <?php
|
下面分享其它朋友的例子
例1
代码如下 | 复制代码 |
<? |
如果我们要动态不确定性的多文件上传怎么实现下面也有实例
文件上传代码
代码如下 | 复制代码 |
view plaincopy to clipboardprint? <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>文档上传</title> </head> <body> <script language="javascript"><!-- 动态添加文件选择控件--> function AddRow() { var eNewRow = tblData.insertRow(); for (var i=0;i<1;i++) { var eNewCell = eNewRow.insertCell(); eNewCell.innerHTML = "<tr><td><input type='file' name='filelist[]' size='50'/></td></tr>"; } } // --></script> <form name="myform" method="post" action="uploadfile.php" enctype="multipart/form-data" > <table id="tblData" width="400" border="0"> <!-- 将上传文件必须用post的方法和enctype="multipart/form-data" --> <!-- 将本页的网址传给uploadfile.php--> <input name="postadd" type="hidden" value="<?php echo "http://".$_SERVER['HTTP_HOST'].$_SERVER["PHP_SELF"]; ?>" /> <tr><td>文件上传列表 <input type="button" name="addfile" onclick="AddRow()" value="添加列表" /></td></tr> <!-- filelist[]必须是一个数组--> <tr><td><input type="file" name="filelist[]" size="50" /></td></tr> </table> <input type="submit" name="submitfile" value="提交文件" /> </form> </body> </html> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>文档上传</title> </head> <body> <script language="javascript"><!-- 动态添加文件选择控件--> function AddRow() { var eNewRow = tblData.insertRow(); for (var i=0;i<1;i++) { var eNewCell = eNewRow.insertCell(); eNewCell.innerHTML = "<tr><td><input type='file' name='filelist[]' size='50'/></td></tr>"; } } // --></script> <form name="myform" method="post" action="uploadfile.php" enctype="multipart/form-data" > <table id="tblData" width="400" border="0"> <!-- 将上传文件必须用post的方法和enctype="multipart/form-data" --> <!-- 将本页的网址传给uploadfile.php--> <input name="postadd" type="hidden" value="<?php echo "http://".$_SERVER['HTTP_HOST'].$_SERVER["PHP_SELF"]; ?>" /> <tr><td>文件上传列表 <input type="button" name="addfile" onclick="AddRow()" value="添加列表" /></td></tr> <!-- filelist[]必须是一个数组--> <tr><td><input type="file" name="filelist[]" size="50" /></td></tr> </table> <input type="submit" name="submitfile" value="提交文件" /> </form> </body> </html> 提交文件代码 view plaincopy to clipboardprint? <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>文件上传结果</title> </head> <body> <?php if ($_POST["submitfile"]!="") { $Path="./".date('Ym')."/"; if (!is_dir($Path))//创建路径 { mkdir($Path); } echo "<div>"; for ($i=0;$i<count($filelist);$i++) { //$_FILES["filelist"]["size"][$i]的排列顺序不可以变,因为fileist是一个二维数组 if ($_FILES["filelist"]["size"][$i]!=0) { $File=$Path.date('Ymdhm')."_".$_FILES["filelist"]["name"][$i]; if (move_uploaded_file($_FILES["filelist"]["tmp_name"][$i],$File)) { echo "文件上传成功 文件类型:".$_FILES["filelist"]["type"][$i]." "."文件名:" .$_FILES["filelist"]["name"][$i]."<br>"; } else { echo "文件名:".$_FILES["filelist"]["name"][$i]."上传失败</br>"; } } } echo "</div><br><a href="$postadd" href="$postadd">返回</a></div>"; } ?> </body> </html> |
另:错误信息说明
从 PHP 4.2.0 开始,PHP 将随文件信息数组一起返回一个对应的错误代码。该代码可以在文件上传时生成的文件数组中的 error 字段中被找到,也就是 $_FILES['userfile']['error']。
UPLOAD_ERR_OK
其值为 0,没有错误发生,文件上传成功。
UPLOAD_ERR_INI_SIZE
其值为 1,上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。
UPLOAD_ERR_FORM_SIZE
其值为 2,上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。 UPLOAD_ERR_PARTIAL
其值为 3,文件只有部分被上传。
UPLOAD_ERR_NO_FILE
其值为 4,没有文件被上传。
UPLOAD_ERR_NO_TMP_DIR
其值为 6,找不到临时文件夹。PHP 4.3.10 和 PHP 5.0.3 引进。
UPLOAD_ERR_CANT_WRITE
其值为 7,文件写入失败。PHP 5.1.0 引进。
注意: 以上值在 PHP 4.3.0 之后变成了 PHP 常量。
代码如下 | 复制代码 |
<?php |
使用方法
代码如下 | 复制代码 |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312" /><title>上传文件</title></head><body leftmargin="0" topmargin="0"><table cellpadding="2" cellspacing="1" border="0" height="100%" align="left"><form action='wend.php?action=upload' method='post' enctype='multipart/form-data'><tr ><td valign='middle'><input type='file' name='uploadfile'><input name='submit' type='submit' value='上传'></td></tr></form></table</body></html> |
php处理文件
调用上面的类文件,然后再如下操作
代码如下 | 复制代码 |
$action = addslashes($_GET['action']);
|
相关文章
- 下面小编来给大家演示几个php操作zip文件的实例,我们可以读取zip包中指定文件与删除zip包中指定文件,下面来给大这介绍一下。 从zip压缩文件中提取文件 代...2016-11-25
- 操作类就是把一些常用的一系列的数据库或相关操作写在一个类中,这样调用时我们只要调用类文件,如果要执行相关操作就直接调用类文件中的方法函数就可以实现了,下面整理了...2016-11-25
- 本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
Jupyter Notebook读取csv文件出现的问题及解决
这篇文章主要介绍了JupyterNotebook读取csv文件出现的问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2023-01-06- 这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
- 这篇文章主要介绍了Intellij IDEA连接Navicat数据库的方法,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借价值,需要的朋友可以参考下...2021-03-25
- 在开发过程中,我们经常会将日期时间的毫秒数存放到数据库,但是它对应的时间看起来就十分不方便,我们可以使用一些函数将毫秒转换成date格式。 一、 在MySQL中,有内置的函数from_unixtime()来做相应的转换,使用如下: 复制...2014-05-31
- 有时我们接受或下载到的PSD文件打开是空白的,那么我们要如何来解决这个 问题了,下面一聚教程小伙伴就为各位介绍Photoshop打开PSD文件空白解决办法。 1、如我们打开...2016-09-14
- C#使用System.IO中的文件操作方法在Windows系统中处理本地文件相当顺手,这里我们还总结了在Oracle中保存文件的方法,嗯,接下来就来看看整理的C#操作本地文件及保存文件到数据库的基本方法总结...2020-06-25
- 这篇文章主要介绍了解决python 使用openpyxl读写大文件的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-13
- 这篇文章主要介绍了C#实现HTTP下载文件的方法,包括了HTTP通信的创建、本地文件的写入等,非常具有实用价值,需要的朋友可以参考下...2020-06-25
- 这篇文章主要为大家详细介绍了SpringBoot实现excel文件生成和下载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-09
- 通过内网连另外一台机器的mysql服务, 确发现速度N慢! 等了大约几十秒才等到提示输入密码。 但是ping mysql所在服务器却很快! 想到很久之前有过类似的经验, telnet等一些服务在连接请求的时候,会做一些反向域名解析(如果...2015-10-21
- 某些时候,例如为了搭建一个测试环境,或者克隆一个网站,需要复制一个已存在的mysql数据库。使用以下方法,可以非常简单地实现。假设已经存在的数据库名字叫db1,想要复制一份,命名为newdb。步骤如下:1. 首先创建新的数据库newd...2015-10-21
php无刷新利用iframe实现页面无刷新上传文件(1/2)
利用form表单的target属性和iframe 一、上传文件的一个php教程方法。 该方法接受一个$file参数,该参数为从客户端获取的$_files变量,返回重新命名后的文件名,如果上传失...2016-11-25- 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
- 要替换字符串中的内容我们只要利用php相关函数,如strstr,str_replace,正则表达式了,那么我们要替换目录所有文件的内容就需要先遍历目录再打开文件再利用上面讲的函数替...2016-11-25
- 又码了一个周末的代码,这次在做一些关于文件上传的东西。(PHP UPLOAD)小有收获项目是一个BT种子列表,用户有权限上传自己的种子,然后配合BT TRACK服务器把种子的信息写出来...2016-11-25
- 这篇文章主要介绍了node.js如何操作MySQL数据库,帮助大家更好的进行web开发,感兴趣的朋友可以了解下...2020-10-29