读取文件操作

4 篇文章 0 订阅

Linux 管道

管道是进程间通信的主要手段之一。一个管道实际上就是个只存在于内存中的文件,
对这个文件的操作要通过两个已经打开文件进行,它们分别代表管道的两端。

shell脚本读取文件到PHP

用shell打开并读取文件 通过管道将读取的内容输送给PHP

$1是shell的脚本的第一个参数,是一个要导入的文件名,管道后面是laravel的PHP脚本执行方式

在此处,管道会将cat的导入的文件按流读取出来给PHP脚本的标准输入

#!/bin/bash
cat $1 | /bin/php  项目目录/artisan 脚本名:send

PHP代码接收标准输入:

$f = fopen( 'php://stdin', 'r' );
 while( $line = fgets( $f ) ) {
            $priceList[] = explode(',', $line);
 }

将标准输入里面的行以文件读取的方式读取出来进行业务操作。

经测试:3000条数据的时候占用内存12M。12万条数据的时候占用内存也是12M,所以不用担心内存溢出的问题。

按行读取文件进行PHP处理

$file = fopen("test.txt","r");
while(! feof($file))
{
    echo fgets($file). "<br />";    //此处按行读取
}
fclose($file);

此例是一行行读,多大文件都不会溢出。

经测试:条数不管是3000还是12万,占用内存的大小不会变化。

直接读取全部文件内容到PHP处理

$file_path = "test.csv";
if(file_exists($file_path)){
	$fp=fopen($file_path,'rb');
	$str = fread($fp,filesize($file_path));
    $str = iconv('gbk', 'UTF-8', $str);
    echo $str;
}

此例是直接读取整个文件到内存,因为csv文件是以逗号分隔的,所以十万级的文件还是很小的,全部读入内存也不会导致内存溢出,但是数据量特别特别大,文件本身就很大的话,全部读入内存还是会导致内存溢出的。

检测脚本的内存占用

Log::info("初始: ".memory_get_usage()."B");
Log::info("使用: ".memory_get_usage()."B");
Log::info("释放: ".memory_get_usage()."B");
Log::info("峰值: ".memory_get_peak_usage()."B");

Linux输入输出

Shell会自动为我们打开和关闭0、1、2这三个文件描述符,我们不需要显式地打开或关闭它们。标准输入(0)是命令的输入,默认指向键盘;标准输出(1)是命令的输出,默认指向屏幕;标准错误(2)是命令错误信息的输出,默认指向屏幕。

shell脚本中常见的:1>/dev/null 2>&1

1>/dev/null 表示将标准输出重定向到空设备文件,/dev/null 为空设备文件
2>&1 表示将标准错误输出重定向等同于标准输出,标准输出重定向到空设备文件,则标准错误输出也重定向到了空设备文件。

在大文件读取处理的时候,一定要谨防内存溢出的情况

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值