php读取大文件(使用PHPExcel读取大文件(20M左右)时,报内存不足)

本文目录
- 使用PHPExcel读取大文件(20M左右)时,报内存不足
- 怎样用PHP逐行读取数G的大文件最有效率且不会搞爆内存
- 如何用PHPExcel读取超大excel文件
- PHP file_get_contents()读入文件问题
- php用splfileobject读写文件
- 关于php读取文件的操作的问题!
- php怎么写入文件并且读取,希望大佬们给我写一下讲一下原理谢谢
- php有规律大文件的读取与写入
使用PHPExcel读取大文件(20M左右)时,报内存不足
这个报错不是PHPExcel报的错,而是php本身报的,原因大概就是因为你读取的文件超过了php单次请求运算占有的内存值的最大值。所以光设置PHPExcel是不行的
解决办法有三个:
1,修改 php.ini 中 memory_limit的值,重启apache服务
2,在你读取文件的页面头部加入 ini_set(”memory_limit”,”100M”); (-1为不限)
3,修改.htaccess 文档,在文档中加上一句:php_value memory_limit 16M(或更大)
怎样用PHP逐行读取数G的大文件最有效率且不会搞爆内存
你需要安装php运行环境,才能解析php文件!百度phpstudy!一键安装,然后把php放在phpstudy的网站目录!然后就可以用sublime编写!然后测试! 要直接sublime+浏览器只可以运行html+script! 欢迎拍砖
如何用PHPExcel读取超大excel文件
上一篇文章介绍了php-excel-reader读取excel文件的方法,因为需要,将excel这样的数据: 新建数据库表如下: -- 数据库: `alumni` -- 表的结构 `alumni` CREATE TABLE IF NOT EXISTS `alumni` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `gid` varchar(20) DEFAULT NULL COMMENT ’档案编号’, `student_no` varchar(20) DEFAULT NULL COMMENT ’学号’, `name` varchar(32) DEFAULT NULL, PRIMARY KEY (`id`), KEY `gid` (`gid`), KEY `name` (`name`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; 导入后数据库结果如下: php源码如下:复制代码 代码如下: 《?php header("Content-Type:text/html;charset=utf-8"); require_once ’excel_reader2.php’; set_time_limit(20000); ini_set("memory_limit","2000M"); //使用pdo连接数据库 $dsn = "mysql:host=localhost;dbname=alumni;"; $user = "root"; $password = ""; try{ $dbh = new PDO($dsn,$user,$password); $dbh-》query(’set names utf8;’); }catch(PDOException $e){ echo "连接失败".$e-》getMessage(); } //pdo绑定参数操作 $stmt = $dbh-》prepare("insert into alumni(gid,student_no,name) values (:gid,:student_no,:name) "); $stmt-》bindParam(":gid", $gid,PDO::PARAM_STR); $stmt-》bindParam(":student_no", $student_no,PDO::PARAM_STR); $stmt-》bindParam(":name", $name,PDO::PARAM_STR); //使用php-excel-reader读取excel内容 $data = new Spreadsheet_Excel_Reader(); $data-》setOutputEncoding(’UTF-8’); $data-》read("stu.xls"); for ($i = 1; $i 《= $data-》sheets; } //将获取的excel内容插入到数据库 $stmt-》execute(); } echo "执行成功"; echo "最后插入的ID:".$dbh-》lastInsertId(); ?》 考虑到excel的量比较大,使用了PDO的绑定操作!
PHP file_get_contents()读入文件问题
因为explode得到数组key是0、1、2、3,因此无法使用array_key_exists来检查是否存在行,应该使用array_search来检测行的位置,另外读入再拆分可以直接使用file,建议代码为:
$arr=file(’str.txt’);
if (array_search(’刘二’,$arr)===FALSE) echo ’没有刘二’;
注意,array_search结果是找到的key,因此可能为0,没有找到返回的是FALSE,判断的时候要使用三个等号
此外,上面的思路只使用大文件中进行少量的搜索,如果是需要反复许多次这样搜索数组,效率更好的办法是使用array_flip把数组的键和值兑换,随后的搜索效率更高。
$arr=array(’陈一’,’刘二’,’李四’,’张三’);
print_r($arr);//0=》’陈一’,1=》’刘二’,2=》’李四’,3=》’张三’
$arr2=array_flip($arr);
print_r($arr2);//’陈一’=》0,’刘二’=》1,’李四’=》2,’张三’=》3
php用splfileobject读写文件
SplFileInfo 仅用于获取文件的一些属性信息,如文件大小、文件访问时间、文件修改时间、后缀名等值,而 SplFileObject 是继承 SplFileInfo 这些功能的。
参考代码如下:
SplFileInfo 仅用于获取文件的一些属性信息,如文件大小、文件访问时间、文件修改时间、后缀名等值,而 SplFileObject 是继承 SplFileInfo 这些功能的。
/** 返回文件从X行到Y行的内容(支持php5、php4)
* @param string $filename 文件名
* @param int $startLine 开始的行数
* @param int $endLine 结束的行数
* @return string
*/
function getFileLines($filename, $startLine = 1, $endLine=50, $method=’rb’) {
$content = array();
$count = $endLine - $startLine;
// 判断php版本(因为要用到SplFileObject,PHP》=5.1.0)
if(version_compare(PHP_VERSION, ’5.1.0’, ’》=’)){
$fp = new SplFileObject($filename, $method);
$fp-》seek($startLine-1);// 转到第N行, seek方法参数从0开始计数
for($i = 0; $i 《= $count; ++$i) {
$content=$fp-》current();// current()获取当前行内容
$fp-》next();// 下一行
}
}else{//PHP《5.1
$fp = fopen($filename, $method);
if(!$fp) return ’error:can not read file’;
for ($i=1;$i《$startLine;++$i) {// 跳过前$startLine行
fgets($fp);
}
for($i;$i《=$endLine;++$i){
$content=fgets($fp);// 读取文件行内容
}
fclose($fp);
}
return array_filter($content); // array_filter过滤:false,null,’’
}
关于php读取文件的操作的问题!
《?php
$handle = @fopen("/tmp/inputfile.txt", "r");
$contents = "";
if ($handle) {
while (($buffer = fgets($handle, 4096)) !== false) {
if(!preg_match("/\d/",$buffer))
{
$contents.=$buffer;
}
}
if (!feof($handle)) {
echo "Error: unexpected fgets() fail\n";
}
fclose($handle);
}
echo $contents;
//如果要写回文件需要重新打开文件
$handle = @fopen("/tmp/inputfile.txt", "w");//将文件大小截为0,即删除内容
fwrite($handle,$contents);
fclose($handle);
?》
php怎么写入文件并且读取,希望大佬们给我写一下讲一下原理谢谢
建议数据格式使用json,这样比较方便:
写入文件:
《?php
$json=array();
$json=4567;
$json=123456;
file_put_contents(’test.txt’,json_encode($json));
echo "文件已保存为test.txt";
?》
读取文件:
《?php
$json=json_decode(file_get_contents(’test.txt’),true);
echo "文件test.txt已读取,内容如下《br /》";
echo "as_a2=".$json."《br /》";
echo "as_a1=".$json;
?》
php有规律大文件的读取与写入
这几天在做一个东西 研究PHP读取行数较多的文件(大概上百万行) 考虑到效率问题 进行了简单的研究 总结如下
第一条 file()函数的效率问题
file()函数的效率很底下 如果是有规律的文件 比如每行一条相应数据 那么尽量不要是用file()函数
可以使用file_get_contents()然后用explode切割 这样效率会快三分之一
举个例子:
文件样式如下:
n
n
n
n
n
n
nnnnnnnnnnnn
如果用file($file)读入的话 耗时很长
可以用如下方法explode("n" file_get_contents($file));效率会快很多
第二条 数组的遍历方式
数据已经被读入数组了 下面就是遍历了
我所需要的是确定数组中有无一个值的存在 比如说 是否在数组中 首先想到的是in_array()
不过实验了下发现效率很低下 于是参考别人的代码想到一个办法 把数组翻转过来 变成所有值都为 原来的值变成了索引 那么只要我在if里写($arr== )去判断 果然效率高出很多
在数组的遍历过程中 如果数组个头非常大 并且数组中的数据并不是全能用到的话 最好把用来遍历的数组抽出来 这样会提高很多效率
第三条 数组的存储
把计算过后的数据保存起来 存在一个文件中 考虑了三种方法 一种是直接写成php文件 一种是serialize 一种是json串
第一种方式
直接写入文件 保存成PHP
需要的时候直接require进来
第二种方式 把变量serialize然后file_put_contents()进入文件 使用的时候unserialize就ok
第三种方式和第二种类似 只不过写成了json串
lishixinzhi/Article/program/PHP/201311/21126
本文相关文章:
access2010选项卡(access2010的功能区包括哪些选项卡每个选项卡包含哪些命令)
2026年8月29日 19:20
怎样下载sql server2012(怎么安装sql server 2012)
2026年8月12日 03:50
matlab中文帮助文档(MATLAB2014a的中文帮助文档怎么弄出来)
2026年8月1日 17:50
sql2008r2企业版(购买了sql server 2008 r2 企业版,如何查看是否已经激活)
2026年7月29日 09:00
更多文章:
androidapp源码免费下载(如何实现APK的反编译得到APK的源码)
2026年9月22日 18:00
service pack 3(操作系统版本升级(SP) Service Pack 3当中的“Service Pack 3”是什么意思)
2026年9月22日 10:20
html代码怎么写大佬教程(html网页的题来个大佬,写代码,题目在图上)
2026年9月22日 10:10
结构体内又一个struct(c++ 在结构体中再嵌入一个结构体如何调用)
2026年9月22日 09:40
cocos creator中文(cocoscreator和cocoscreator3d的区别)
2026年9月22日 02:30





