首页 > 编程技术 > php

解决PHP中file_exists()判断中文文件名无效

发布时间:2016-11-25 16:46

php中判断文件是否存在我们会使用file_exists函数或is_file函数,但在使用file_exists时如果你文件名或路径是中文在uft8编码文档是是无效的那么如何解决此问题呢,下面我们一起来看看。

定义和用法

file_exists() 函数检查文件或目录是否存在。

如果指定的文件或目录存在则返回 true,否则返回 false。

例子1

 代码如下 复制代码

<?php
echo file_exists("test.txt");
?>

输出:

1

例子2

 代码如下 复制代码

$realname='中文.txt';


if(file_exists($realname)) {

   // 永远都进不了这里

}
else
{
  echo 'www.111cn.net 提醒你文件不存在了';
}

输出结果是 www.111cn.net 提醒你文件不存在了

但我很惊讶呀文件是存在了,并且路径也没有问题php文件与中文.txt在同一目录所以这样写是没有问题,于时想想会不会是中文问题于,我对编码进行转换

解决方案:

 代码如下 复制代码

$realname='中文.txt';

if(file_exists(iconv('UTF-8','GB2312',$realname))) {

   // 这样就可以支持了

}


结果显示1 ,问题解决了

一聚教程小编提醒你,在php中最好不要使用中文名字,像apache,linux,php这些对中文支持不怎么好,所以大家尽量使用英文哦。

 

用了好几年啦!觉得挺好的一个调试程序,主要是调用php的内部函数print_r(),其实print_r就是用来调试用的,只是有些地方不够好了,下面我来自定义一个函数可以满足我们的需求,下面大家一起来看看。

比如缩进关系,每次写还要在前面加上echo "<pre>" ,其实这很不爽的!还有内部的var_dump(),反正效果不怎么理想的,所以就自己写了这个,在配置文件中加上此函数、每次调用只要dump($var) $var不管是变量、数组、类库都能打印出来——爽呀!

 

 代码如下 复制代码
/**
 * 输出变量的内容,通常用于调试
 * @package Core
 * @param mixed $vars 要输出的变量
 * @param string $label
 * @param boolean $return
 */
function dump($vars, $label = '', $return = false) {
    if (ini_get('html_errors')) {
        $content = "<pre>n";
        if ($label != '') {
            $content .= "<STRONG>{$label} :</STRONG>n";
        }
        $content .= htmlspecialchars(print_r($vars, true));
        $content .= "n<pre>n";
    }else {
        $content = $label . " :n" . print_r($vars, true);
    }
    if($return) {
        return $content;
    }else {
        echo $content;
        return null;
    }
}

/**
 ** 温馨提示:本站所有文章均来自PHPma精心编辑,99%原创,转帖之人需保留本站的链接
 ** 本站所有文章仅代表本人观点,转帖概不负责

 **/

自动补足空白位数在php中str_pad函数可以帮我们实现哦,str_pad() 函数把字符串填充为指定的长度。

str_pad() 函数把字符串填充为指定的长度。

语法

str_pad(string,length,pad_string,pad_type)

参数 描述
string 必需。规定要填充的字符串。
length 必需。规定新字符串的长度。如果该值小于原始字符串的长度,则不进行任何操作。
pad_string 可选。规定供填充使用的字符串。默认是空白。
pad_type

可选。规定填充字符串的那边。

可能的值:

  • STR_PAD_BOTH - 填充到字符串的两头。如果不是偶数,则右侧获得额外的填充。
  • STR_PAD_LEFT - 填充到字符串的左侧。
  • STR_PAD_RIGHT - 填充到字符串的右侧。这是默认的。

 代码如下 复制代码

$cardCount = 10;
$arr = array();
for ($i = 1; $i <= $cardCount; $i++) {
$strCard = str_pad($i, 10, '0', STR_PAD_LEFT);
$arr[] = $strCard;
}

print_r($arr);

Array ( [0] => 0000000001 [1] => 0000000002 [2] => 0000000003 [3] => 0000000004 [4] => 0000000005

[5] =>0000000006 [6] => 0000000007 [7] => 0000000008 [8] => 0000000009 [9] => 0000000010 )

 

PHP 5.3 ereg() 无法正常使用,提示“Function ereg() is deprecated Error”是因为它长ereg 函数进行了升级处理哦,需要像preg_match使用/ /来规则了,当然也是php5.3把ereg给费掉的节奏了。

PHP 5.3 ereg() 无法正常使用,提示“Function ereg() is deprecated Error”。

问题根源是php中有两种正则表示方法,一个是posix,一个是perl,php6打算废除posix的正则表示方法所以后来就加了个preg_match。此问题解决办法很简单,在ereg前加个过滤提示信息符号即可:把ereg()变成@ereg()。这样屏蔽了提示信息,但根本问题还是没有解决,php在5.2版本以前ereg都使用正常,在5.3以后,就要用preg_match来代替ereg。所以就需要变成这样,

原来:ereg("^[0-9]*$",$page)变成:preg_match("/^[0-9]*$/",$page)

特别提醒:posix与perl的很明显的表达区别就是是否加斜杠,所以与ereg相比,后者在正则的前后分别增加了两个"/"符号,不能缺少。


改前:function inject_check($sql_str) {

 $sql_str = strtolower($sql_str);
 return eregi('fopen|post|eval|select|insert|and|or|update|delete|'|/*|*|../|./|union|into|load_file|outfile', $sql_str); // 进行过滤
}

解决方法:

找到代码所在的文件 位置

 

function inject_check($sql_str) {
 $sql_str = strtolower($sql_str);
 return preg_match('/fopen|post|eval|select|insert|and|or|update|delete|'|/*|*|../|./|union|into|load_file|outfile/', $sql_str); // 进行过滤
}
 

注意:一定要加'/'开头与结束哦。此段参考:http://www.111cn.net/phper/31/47360.htm


Tips:此问题在php5.2之前版本不会出现。

下面我们一看一篇关于php中file_get_contents()导致nginx出现504问题的解决办法,希望此方法对各位朋友有所帮助。

Nginx+PHP-CGI(php-fpm) 的Web环境
突然发现系统负载上升,top 查看后发现很多 php-cgi 进程 CPU 使用率接近100%
找其中一个 CPU 100% 的 php-cgi 进程的 PID,用strace -p 10747跟踪,结果发现以下结果:
select(7, [6], [6], [], {15, 0}) = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0) = 0 (Timeout)
select(7, [6], [6], [], {15, 0}) = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0) = 0 (Timeout)
select(7, [6], [6], [], {15, 0}) = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0) = 0 (Timeout)
select(7, [6], [6], [], {15, 0}) = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0) = 0 (Timeout)
select(7, [6], [6], [], {15, 0}) = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0) = 0 (Timeout)
select(7, [6], [6], [], {15, 0}) = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0) = 0 (Timeout)
select(7, [6], [6], [], {15, 0}) = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0) = 0 (Timeout)
select(7, [6], [6], [], {15, 0}) = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0) = 0 (Timeout)
select(7, [6], [6], [], {15, 0}) = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0) = 0 (Timeout)
select(7, [6], [6], [], {15, 0}) = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0) = 0 (Timeout)

几乎可以肯定是file_get_contents()导致的问题,
原因是:file_get_contents的目标网站如果反应过慢,file_get_contents就会一直卡在那里不会超时,
我们知道php.ini 里面max_execution_time 可以设置 PHP 脚本的最大执行时间,但是,在 php-cgi(php-fpm) 中,该参数不会起效。真正能够控制 PHP 脚本最大执行时间的是 php-fpm.conf 配置文件中的以下参数:

The timeout (in seconds) for serving a single request after which the worker process will be terminated 
Should be used when 'max_execution_time' ini option does not stop script execution for some reason 
'0s' means 'off' 
<value name="request_terminate_timeout">0s</value>  默认值为 0 秒,也就是说,PHP 脚本会一直执行下去。这样,当所有的 php-cgi 进程都卡在 file_get_contents() 函数时,这台 Nginx+PHP 的 WebServer 已经无法再处理新的 PHP 请求了,Nginx 将给用户返回“502 Bad Gateway”。修改该参数,设置一个 PHP 脚本最大执行时间是必要的,但是,治标不治本。例如改成 30s,如果发生 file_get_contents() 获取网页内容较慢的情况,这就意味着 150 个 php-cgi 进程,每秒钟只能处理 5 个请求,WebServer 同样很难避免“502 Bad Gateway”。

要做到彻底解决,不妨重新封装一下file_get_contents函数:

 代码如下 复制代码

function _file_get_content($str) {
$ctx = stream_context_create(array(  
   'http' => array(  
       'timeout' => 10 //设置一个超时时间,单位为秒  
       )  
   )  
);  
return file_get_contents($str, 0, $ctx);  
}

如此 用_file_get_content代替直接使用file_get_contents 问题解决。

标签:[!--infotagslink--]

您可能感兴趣的文章: