首页 > 编程技术 > php

解决file_get_contents遇到中文文件名无法打开问题

发布时间:2016-11-25 17:38

利用file_get_contents打开文件或采集远程服务器文件如果文名或url中碰到汉字中文那么会出现failed to open stream:Lnvalid argument in错误。

今天遇到一个很棘手的问题,客户用ftp向服务器传了一个文件,但是却无法被程序识别.查看代码后,没有发现问题,最后重演流程发现,客户上传的文件是中文命名的.于是小做测试发现,file_get_contents函数尽然不支持中文文件名文件.

       原有代码如下:

              $filename='哈.txt';

               echo file_get_contents('./'.$filename);

      执行以后显示结果:

       悲剧开始.

 

       之后试了不少判断方法,显示怀疑是不是编码问题,文件编码,代码编码一遍遍的排查,可是都是很匹配的啊.

       之后查了相关资料却没有找到,于是google了一下发现有人遇到这个问题,说是系统编码的问题,于是开始对文件名进行转码.

       文件用的是utf-8编码,但是系统默认为gbk.所以先把文件名转换gbk然后再读取.

       

              $filename='哈.txt';

               $filename=iconv('utf-8','gb2312',$filename);

               //echo file_get_contents(mb_convert_encoding('./哈.txt', 'gbk', 'utf-8')); (另一种方法)

               echo file_get_contents('./'.$filename);


       测试结果:

       读取成功.

       

       OK,大功告成.

安装好apache+php+mysql环境之后,安装一个cms提示数据库连接函数不可用,这个明示就是数据库没有配置好,php未支持mysql了,果断进入php.ini进入处理,步骤如下

今天在机器上配好apache2.0.x+php5+mysql5,部署帝国cms系统的时候,结果发现php5默认是不支持mysql的。

于是便打开php.ini文件,查找

extension=php_mysql.dll,把前面的分号去掉,

重启apache,报错找不到php_mysql.dll。这点困难吓不到我,

找到extension_dir指向到ext所在的目录,然后把libmysql.dll拷贝到系统system32目录下,重启apache,成功了。


好了推荐两处文章

Windows环境配置Apache+Mysql+PHP

windows2003配置IIS+FastCGI+PHP5.4.8图解:

 

有此在linux系统中使用PHP5.5的朋友会发现安装升级到PHP5.5后出现不能调用json_encode问题,这个不是版本问题是我们操作过程有误,解决办法很简单。

在ubuntu13.10上通过apt-get的方式安装了php5.5后,安装drupal,出现无法调用json_encode的错误,很是不解,php老早就内置了json,为何现在这样?

 代码如下 复制代码

sudo aptget php5-json

重启apache后正常!

file_get_contents文件是用来读写文件的,但我发现用file_get_contents 读取大文件出错提示Note: string can be as large as 2GB了,这个就是不能超过2G了,有没有办法解决呢,下面我来一起来看。

如果我读取一个 www.111cn.net文件

 代码如下 复制代码

$u ='www.111cn.net'; //此文件为100GB

$a =file_get_contents( $u );

运行提示

Note: string can be as large as 2GB

不能大于2GB了,我们去官方看此函数参考


string file_get_contents ( string $filename [, bool $use_include_path = false [, resource $context [, int $offset = -1 [, int $maxlen ]]]] )

发现有个

 file_get_contents() 把文件读入一个字符串。将在参数 offset 所指定的位置开始读取长度为 maxlen 的内容。如果失败, file_get_contents() 将返回 FALSE。


原来如此,这样我们对程序进行修改即可

 代码如下 复制代码

$u ='www.111cn.net'; //此文件为100GB

$a =file_get_contents( $u,100,1000 );

读取成功了

总结

file_get_contents如果正常返回,会把文件内容储存到某个字符串中,所以它不应该返回超过2G长度的字符串。

如果文件内容超过2G,不加offset和maxlen调用file_get_contents的话,肯定会返回false,

很多朋友发现使用phpmyadmin4.0或以上版本会发现打开比以前慢多了,这个如果使用过dedecms的朋友就会碰到相同的问题,解决dedecms是因加载了远程文件而phpmyadmin4同样这样操作了,所以我们只要找到代码删除即可。

很多人用了phpmyadmin4以后的版本发现速度好像慢了很多,总结下,提供解决方法。
1、修改本地化时间

原理: 本地化时间格式化需要gettext支持, 假如你的环境没有开启此功能, 将会返回乱码, 影响#phpmyadmin ajax的处理. 本测试在phpmyadmin 4.0.2 php 5.5.0 环境上验证通过.
修改:./libraries/Util.class.php 文件
 

 代码如下 复制代码
# 查找
return strftime($date, $timestamp);
 
# 替换成如下代码:
if(extension_loaded('gettext'))
  return strftime($date, $timestamp);
 
# 中国区这样设置.
date_default_timezone_set('UTC');
return gmdate('Y-m-d H:i:s', $timestamp + 28800);

2、屏蔽在线升级

原理: phpmyadmin官方网站被GFW了,自动检查更新的时间白白浪费在墙内等待,关闭即可
修改:./version_check.php 文件,将下面这些代码删除或者注释掉

 

 代码如下 复制代码
$save = true;
$file = 'http://www.phpmyadmin.net/home_page/version.json';
if (ini_get('allow_url_fopen')) {
    $response = file_get_contents($file);
} else if (function_exists('curl_init')) {
    $curl_handle = curl_init($file);
    curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
    $response = curl_exec($curl_handle);
}

现在退出后, 再登录访问, 看看是不是已经秒开了? 大家试试吧~

标签:[!--infotagslink--]

您可能感兴趣的文章: