php中require_once()函数相对目录要谨慎

 更新时间:2016年11月25日 17:39  点击:1295
谈到了使用require_once 仍然告诉说类被重定义的问题。于是想起了前几天自己遇到的现象。在这里和大家说一下,今天才想起调查具体原因,如果大家不说的话就快忘了。看来自己凡事果然不经大脑,大脑的二级缓存,及内存,甚至是硬盘都小的可怜。嗯。

假设有如下三个文件, c.php a.php b.php 对应的存放目录为:localhost/ localhost/ localhost/demo

 代码如下 复制代码
c.php
require_once("a.php");
require_once("demo/b.php");
B::demo();a.php
class A
{
}

b.php的内容比较有意思,因为它自己要继承 CLASS A 所以自己把a.php也引入进去了

 代码如下 复制代码
require_once("../a.php");
class B extends A
{
    public static function demo()
    {
    echo "xx";
    }
}

执行localhost/c.php 系统报错,报错信息如下
Warning: require_once(../a.php) [function.require-once]: failed to open stream: No such file or directory in F:wwwdemob.php on line 2
Fatal error: require_once() [function.require]: Failed opening required '../a.php' (include_path='.;C:php5pear') in F:wwwdemob.php on line 2但是,惊奇的发现,如果去掉b.php里面的require_once语句,执行正常,那么一定是require_once语句定义多了吗?原因就是Class A重定义了两次?可是不会啊。如果我只在c.php里面加require_once(‘a.php’);这条语句,哪怕我写两遍也是没错的,那到底是咋回事呢?
原因就是,b.php定义的目录和c.php执行文件的目录层级不一致,导致在c.php里面require_once语句有两条。使其相当于

 代码如下 复制代码
require_once("a.php");
require_once("../a.php");
class B extends A
{
    public static function demo()
    {
    echo "xx";
    }
}
B::demo();

原因找到了,因为在c.php里面,其相对目录 “..”就是 c.php的上一层了,导致文件找不到报错。
所以,我们的结论是,在 PHP 里面,使用require_once的时候,存在不同层级关系,且有相对目录的使用那么一定要谨慎,小心。

一个常用的东西,php+CKFinder上传中文名文件乱码问题的解决方法 这种问题主要是上传中文文件名的图片时出现乱码的解决办法。

上传中文名文件乱码问题

在ckfinder/config.php中找到如下一段配置代码:

 

 代码如下 复制代码
/*
If you have iconv enabled (visit http://php.net/iconv for more information),
you can use this directive to specify the encoding of file names in your
system. Acceptable values can be found at:
http://www.gnu.org/software/libiconv/

Examples:
$config['FilesystemEncoding'] = 'CP1250';
$config['FilesystemEncoding'] = 'ISO-8859-2';
*/
$config['FilesystemEncoding'] = 'UTF-8';

将UTF-8修改为GB2312,上传后文件名正确了,但在CKEditor中显示的链接出现乱码,因为CKEditor所在页面使用的字符集是UTF-8,未去细究如何解决这个问题,采用了文件重命名的方案去替代解决。

上传文件重命名

修改ckfindercoreconnectorphpphp5CommandHandlerFileUpload.php

找到以下代码

 代码如下 复制代码
if ($sFileName != $sUnsafeFileName) {
  $iErrorNumber = CKFINDER_CONNECTOR_ERROR_UPLOADED_INVALID_NAME_RENAMED;
}
在这段代码之后添加
 代码如下 复制代码
$sExtension=CKFinder_Connector_Utils_FileSystem::getExtension($sFileName);
$sFileName=date('YmdHis').'.'.$sExtension;
php中session默认是30分钟超时,但是有的时间压根就没到30分钟就自动超时了,这对很多操作带来不便,下面我们来看看解决30分钟超时的办法。

第一种回答

那么, 最常见的一种回答是: 设置Session的过期时间, 也就是session.gc_maxlifetime, 这种回答是不正确的, 原因如下:

1. 首先, 这个PHP是用一定的概率来运行session的gc的, 也就是session.gc_probability和session.gc_divisor(介绍参看 深入理解PHP原理之Session Gc的一个小概率Notice), 这个默认的值分别是1和100, 也就是有1%的机会, PHP会在一个Session启动时, 运行Session gc. 不能保证到30分钟的时候一定会过期.

2. 那设置一个大概率的清理机会呢? 还是不妥, 为什么? 因为PHP使用stat Session文件的修改时间来判断是否过期, 如果增大这个概率一来会降低性能, 二来, PHP使用”一个”文件来保存和一个会话相关的Session变量, 假设我5分钟前设置了一个a=1的Session变量, 5分钟后又设置了一个b=2的Seesion变量, 那么这个Session文件的修改时间为添加b时刻的时间, 那么a就不能在30分钟的时候, 被清理了. 另外还有下面第三个原因.

3. PHP默认的(Linux为例), 是使用/tmp 作为Session的默认存储目录, 并且手册中也有如下的描述:

Note: 如果不同的脚本具有不同的 session.gc_maxlifetime 数值但是共享了同一个地方存储会话数据,则具有最小数值的脚本会清理数据。此情况下,与 session.save_path 一起使用本指令。

 

也就是说, 如果有俩个应用都没有指定自己独立的save_path, 一个设置了过期时间为2分钟(假设为A), 一个设置为30分钟(假设为B), 那么每次当A的Session gc运行的时候, 就会同时删除属于应用B的Session files.

所以, 第一种答案是不”完全严格”正确的.

第二种答案
还有一种常见的答案是: 设置Session ID的载体, Cookie的过期时间, 也就是session.cookie_lifetime. 这种回答也是不正确的, 原因如下:

这个过期只是Cookie过期, 换个说法这点就考察Cookie和Session的区别, Session过期是服务器过期, 而Cookie过期是客户端(浏览器)来保证的, 即使你设置了Cookie过期, 这个只能保证标准浏览器到期的时候, 不会发送这个Cookie(包含着Session ID), 而如果通过构造请求, 还是可以使用这个Session ID的值.

第三种答案
使用memcache, redis等, okey, 这种答案是一种正确答案. 不过, 很显然出题者肯定还会接着问你, 如果只是使用PHP呢?

第四种答案
当然, 面试不是为了难道你, 而是为了考察思考的周密性. 在这个过程中我会提示出这些陷阱, 所以一般来说, 符合题意的做法是:

1. 设置Cookie过期时间30分钟, 并设置Session的lifetime也为30分钟.

2. 自己为每一个Session值增加Time stamp.

3. 每次访问之前, 判断时间戳.

国外网站参考session.gc_maxlifetime

session.gc_maxlifetime specifies the number of seconds after which data will be seen as 'garbage' and potentially cleaned up. Garbage collection may occur during session start (depending on session.gc_probability and session.gc_divisor).
Note:

If different scripts have different values of session.gc_maxlifetime but share the same place for storing the session data then the script with the minimum value will be cleaning the data. In this case, use this directive together with session.save_path.


Note: If you are using the default file-based session handler, your filesystem must keep track of access times (atime). Windows FAT does not so you will have to come up with another way to handle garbage collecting your session if you are stuck with a FAT filesystem or any other filesystem where atime tracking is not available. Since PHP 4.2.3 it has used mtime (modified date) instead of atime. So, you won't have problems with filesystems where atime tracking is not available.

session.referer_check string
session.referer_check contains the substring you want to check each HTTP Referer for. If the Referer was sent by the client and the substring was not found, the embedded session id will be marked as invalid. Defaults to the empty string.
session.entropy_file string
session.entropy_file gives a path to an external resource (file) which will be used as an additional entropy source in the session id creation process. Examples are /dev/random or /dev/urandom which are available on many Unix systems. This feature is supported on Windows since PHP 5.3.3. Setting session.entropy_length to a non zero value will make PHP use the Windows Random API as entropy source.
session.entropy_length integer
session.entropy_length specifies the number of bytes which will be read from the file specified above. Defaults to 0 (disabled).
session.use_cookies boolean


PHP原理之Session Gc的一个小概率Notice

如果在ubuntu/Debian下, 采用apt安装的PHP, 那么在使用Session的时候, 就可能会有小概率遇到这个提示.

PHP Notice: session_start(): ps_files_cleanup_dir:

   opendir(/var/lib/php5) failed: Permission denied (13)

   in /home/laruence/www/htdocs/index.php on line 22< li>

 

这是因为, 在PHP中, 如果使用file_handler作为Session的save handler, 那么就有概率在每次session_start的时候运行Session的Gc过程.

文章介绍了关于php中正则表达式的子模式详解,有需要知道php中正则表达式的子模式的朋友可参考一下。

函数
mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit])

功能
在 subject 中搜索 pattern 模式的匹配项并替换为 replacement。如果指定了 limit,则仅替换 limit 个匹配,如果省略 limit 或者其值为 -1,则所有的匹配项都会被替换。
replacement可以包含\n形式或$n形式的逆向引用,n可以为0到99,\n表示匹配pattern第n个子模式的文本,\0表示匹配整个pattern的文本。

子模式
$pattern参数中被圆括号括起来的正则表达式,子模式的数目即从左到右圆括号的数目。(pattern即模式)

首先,我们先看一段PHP代码:

 代码如下 复制代码

<?php
    $time = date ("Y-m-d H:i:s");
    $pattern = "/d{4}-d{2}-d{2} d{2}:d{2}:d{2}/i";
    if(preg_match($pattern,$time,$arr)){
    echo "<pre>";
    print_r($arr);       
    echo "</pre>";
    }
?>

显示结果:

Array
(
    [0] => 2012-06-23 03:08:45
)有没有注意到,显示的结果只有一条数据,即符合匹配模式的时间格式,那如果只有一条记录的话,为什么还要用数组保存呢?直接使用字符串保存不是更好?

带着这个问题,我们来看下正则表达式中的子模式。

在正则表达式中,可以使用“(”和“)”将模式中的子字符串括起来,以形成一个子模式。将子模式视为一个整体时,那么它就相当于一个单个字符。

比如,我们将以上的代码稍微修改下,改成如下:

 

 代码如下 复制代码

<?php
    $time = date ("Y-m-d H:i:s");
    $pattern = "/(d{4})-(d{2})-(d{2}) (d{2}):(d{2}):(d{2})/i";
    if(preg_match($pattern,$time,$arr)){
    echo "<pre>";
    print_r($arr);       
    echo "</pre>";
    }
?>

注意:我只修改了$pattern,在匹配模式中,使用了括号()

执行结果:


Array
(
    [0] => 2012-06-23 03:19:23
    [1] => 2012
    [2] => 06
    [3] => 23
    [4] => 03
    [5] => 19
    [6] => 23
)
总结:我们可以使用小括号给整个匹配模式进行分组,默认情况下,每个分组会自动拥有一个组号,规则是,从左到右,以分组的左括号为标志,第一个出现的分组为组号1,第二个为组号2,以此类推。其中,分组0对应整个正则表达式。对整个正则匹配模式进行了分组以后,就可以进一步使用“向后引用”来重复搜索前面的某个分组匹配的文本。例如:1代表分组1匹配的文本,2代表分组2匹配的文本等等我们可以进一步修改下代码,如下所示:

 代码如下 复制代码
<?php
    $time = date ("Y-m-d H:i:s");
    $pattern = "/(d{4})-(d{2})-(d{2}) (d{2}):(d{2}):(d{2})/i";
    $replacement = "$time格式为:$0<BR>替换后的格式为:\1年\2月\3日 \4时\5分\6秒";
    print preg_replace($pattern, $replacement, $time);
    if(preg_match($pattern,$time,$arr)){
        echo "<pre>";
        print_r($arr);       
        echo "</pre>";
    }
?>

 

注意:

因为是在双引号中,所以使用分组的时候应该使用两个反斜杠,如:\1,而如果在单引号中,则使用一个反斜杠就可以了,如:1
\1用于捕获分组一种的内容:2012,\6用于捕获分组6中的内容          
执行结果:


$time格式为:2012-06-23 03:30:31
替换后的格式为:2012年06月23日 03时30分31秒
Array
(
    [0] => 2012-06-23 03:30:31
    [1] => 2012
    [2] => 06
    [3] => 23
    [4] => 03
    [5] => 30
    [6] => 31
)

高级正则表达式

  除了 POSIX BRE 和 ERE 之外,libutilitis 还支持与TCL 8.2兼容的高级正则表达式语
  法(ARE)。 通过为 stRegEx 参数增加前缀 "***:" 就可以开启 ARE 模式,这个前缀覆
  盖 bExtended 选项。基本上讲,ARE 是 ERE 的超集。 它在 ERE 的基础上进行了如下几
  项扩展:

  1. 支持"懒惰匹配"(也叫"非贪婪匹配"或"最短匹配"):在 '?', '*', '+' 或 '{m,n}'
     后追加 '?' 符号就可以启用最短匹配,使得该正则表达式子句在满足条件的前提下匹
     配尽可能少的字符(默认是匹配尽可能多的字符)。例如:将 "a.*b" 作用于 "abab"
     时,将匹配整个串("abab"),若使用 "a.*?b",则将只匹配前两个字符("ab")。

  2. 支持子表达式的向前引用匹配:在 stRegEx 中,可以使用 'n' 向前引用曾经定义的
     子表达式。如:"(a.*)1" 可匹配 "abcabc" 等。

  3. 无名子表达式:使用 "(?:表达式)" 的方式创建一个无名表达式, 无名表达式不返回
     到一个 'n' 匹配。

  4. 向前预判:要命中匹配,必须向前满足指定条件。 向前预判分为肯定预判和否定预判
     两种。肯定预判的语法为:"(?=表达式)",例如:"bai.*(?=yang)" 匹配 "bai yang"
     中的前四个字符("bai "),但在匹配时保证字符串在 "bai.*" 后必须包含 "yang".
     否定判断的语法为:"(?!表达式)", 例如:"bai.*(?!yang)" 匹配 "bai shan" 的前
     四个字符,但在匹配是保证字符串在 "bai.*" 后不出现 "yang"。

  5. 支持模式切换前缀,在 "***:" 之后可以紧跟形如 "(?模式串)" 样式的模式串,模式
     串影响其后表达式的语义和行为。模式串可以是一下字符的组合:

     b - 切换至 POSIX BRE 模式,覆盖 bExtended 选项。
     e - 切换至 POSIX ERE 模式,覆盖 bExtended 选项。
     q - 切换至文本字面匹配模式, 表达式中的字符都作为文本进行搜索,取消一切正则
         语义。此模式将正则匹配退化为一次简单字符串查找。"***=" 前缀是其快捷表示
         方式,意即:"***=" 等同于 "***:(?q)"。

     c - 执行大小写敏感的匹配,覆盖 bNoCase 选项。
     i - 执行忽略大小写的匹配,覆盖 bNoCase 选项。

     n - 开启行敏感的匹配:'^' 和 '$' 匹配行首和行尾;'.' 和否定集('[^...]')不
         匹配换行符。此功能等同于 'pw' 模式串。覆盖 bNewLine 选项。
     m - 等同于 'n'。
     p - '^' 和 '$' 只匹配整个字符串的首尾,不匹配行;'.' 和否定集不匹配换行符。
         覆盖 bNewLine 选项。
     w - '^' 和 '$' 匹配行首和行尾;'.' 和否定集匹配换行符。覆盖 bNewLine 选项。
     s - '^' 和 '$' 只匹配整个字符串的首尾,不匹配行;'.' 和否定集匹配换行符。覆
         盖 bNewLine 选项。ARE 状态下默认使用此模式。

     x - 开启扩展模式:在扩展模式中,将忽略表达式中的空白符和注释符 '#' 后的内容
         例如:
         @code@
   (?x)
   s+ ([[:graph:]]+)      # first number
   s+ ([[:graph:]]+)      # second number
         @code@
         等同于 "s+([[:graph:]]+)s+([[:graph:]]+)"。
     t - 关闭扩展模式,不忽略空白符和注释符后的内容。ARE 状态下默认使用此模式。

  6. 与 BRE/ERE 模式不同的 Perl 风格字符类换码序列:

 perl类    等效POSIX表达式   描述
    ----------------------------------------------------------------------------
 a        -                 响铃字符
 A        -                 不论当前模式如何,仅匹配整个串的最开头
 b        -                 退格字符 ('x08')
 B        -                 转义字符本身 ('\')
 cX       -                 控制符-X (= X & 037)
 d        [[:digit:]]       10 进制数字 ('0' - '9')
 D        [^[:digit:]]      非数字
 e        -                 退出符 ('x1B')
 f        -                 换页符 ('x0C')
 m        [[:<:]]           单词开始位置
 M        [[:>:]]           单词结束位置
 n        -                 换行符 ('x0A')
 r        -                 回车符 ('x0D')
 s        [[:space:]]       空白符
 S        [^[:space:]]      非空白符
 t        -                 制表符 ('x09')
 uX       -                 16 位 UNICODE 字符 (X∈[0000 .. FFFF])
 UX       -                 32 位 UNICODE 字符 (X∈[00000000 .. FFFFFFFF])
 v        -                 纵向制表符 ('x0B')
 w        [[:alnum:]_]      组成单词的字符
 W        [^[:alnum:]_]     非单词字符
 xX       -                 8 位字符 (X∈[00 .. FF])
 y        -                 单词边界(m 或 M)
 Y        -                 非单词边界
 Z        -                 不论当前模式如何,仅匹配整个串的最尾部
         -                 NULL,空字符
 X        -                 子表达式向前引用 (X∈[1 .. 9])
 XX       -                 子表达式向前引用或 8 进制表示的 8 字符
 XXX      -                 子表达式向前引用或 8 进制表示的 8 字符
 

文章介绍了大家在 php开发中会常常碰到的一个关于require_once用法,有需要的朋友可参考一下。

wwwroot   //网站根目录 绝对路径为: F:/wwwroot

-- folder_a // 文件夹A

   file_a_a.php

   file_a_b.php

   file_a_c.php

-- folder_b // 文件夹B

   file_b_a.php

   file_b_b.php

   file_b_c.php

-- index.php

*************************************************************

这个目录层次已经很清楚了:

wwwroot为根目录,下面有index.php文件和folder_a,folder_b两个文件夹

这两个文件夹分别有3个php文件

先来看index.php文件的内容:

 代码如下 复制代码

<?php

     require_once("folder_a/file_a_a.php");

     echo "文件folder_a_a.php被包含成功";

?>

再来看folder_a/folder_a_a.php文件的内容:

 代码如下 复制代码

<?php

     require_once("../folder_b/file_b_a.php");

     $x = new X();

     $x.printInfo();

?>

最后再来看看folder_b/folder_b_a.php文件的内容:

 代码如下 复制代码

<?php

     class X{

          function printInfo(){

               echo 'success;

          }

     }

?>

ok 如果我现在直接运行 floder_a/file_a_a.php

那么会输出: success

如果我运行 wwwroot下的index.php

那么会报错,原因是找不到包含文件:file_b_a.php

但是如果我在所有的require_once()中加入 dirname(__FILE__).'/'

那么无论运行 file_a_a.php 还是 index.php 都可以正常输出

*********************************************************

问题:

我第一次使用的是相对路径,所以重复包含的时候就出错了

而我第二次使用的是绝对路径,所以不出错.可是我还是有点疑惑:

我先分析了以下使用相对路径会出错的原因:

我运行index.php,它能找到 folder_a目录,也能找到该目录下的file_a_a.php,于是它就把 folder_a/file_a_a.php 里的内容复制到了index.php 的第一行(包含语句的那行),然后再继续运行(也就是运行包含过来的内容),因此此时等于是在index.php中运行 file_a_a.php 中的require_once('../folder_b/file_b_a.php'); 它根据当前index.php的位置去找这个路径文件(file_b_a.php),当然找不到啦,所以它出错了.

可是我使用绝对路径的时候不是一样的道理吗?可为什么它就不出错?可能这句话大家有点不解了,我来详细说明(根据程序的运行顺序来说明).

程序先运行 index.php(注意此时我加上了 dirname(__FILE__),所以当前是绝对路径),

index.php先运行第一句代码:require_once(dirname(__FILE__).'/'.'folder_a/file_a_a.php');

dirname(__FILE__) 就是 f:/wwwroot/ 所以这句代码包含的路径也就是:

f:/wwwroot/folder_a/file_a_a.php

这个路径是正确的,因此没问题是吧

ok 第一步正确完成

然后它就把 file_a_a.php 中的代码复制到的 index.php 的这个地方:

然后仍然继续运行: 这是也就是在index.php 中运行file_a_a.php 中的所有代码,那么我们来看看它运行那些代码?

 代码如下 复制代码

<?php

     require_once(dirname(__FILE__).'/'."../folder_b/file_b_a.php");

     $x = new X();

     $x.printInfo();

?>

对就是这些,需要注意的是,这些代码已经被复制到了index.php,也就是说,现在index.php的内容实际上就变成了:

 代码如下 复制代码

<?php

     require_once(dirname(__FILE__).'/'."../folder_b/file_b_a.php");

     $x = new X();

     $x.printInfo();

     echo "文件folder_a_a.php被包含成功";

?>


我们来看个注意事项

假设有如下三个文件, c.php a.php b.php 对应的存放目录为:localhost/ localhost/ localhost/demo

 代码如下 复制代码

c.php

require_once("a.php");
require_once("demo/b.php");
B::demo();a.php
class A
{
}

b.php的内容比较有意思,因为它自己要继承 CLASS A 所以自己把a.php也引入进去了

 代码如下 复制代码

require_once("../a.php");
class B extends A
{
    public static function demo()
    {
    echo "xx";
    }
}

执行localhost/c.php 系统报错,报错信息如下
Warning: require_once(../a.php) [function.require-once]: failed to open stream: No such file or directory in F:wwwdemob.php on line 2
Fatal error: require_once() [function.require]: Failed opening required '../a.php' (include_path='.;C:php5pear') in F:wwwdemob.php on line 2但是,惊奇的发现,如果去掉b.php里面的require_once语句,执行正常,那么一定是require_once语句定义多了吗?原因就是Class A重定义了两次?可是不会啊。如果我只在c.php里面加require_once(‘a.php’);这条语句,哪怕我写两遍也是没错的,那到底是咋回事呢?
原因就是,b.php定义的目录和c.php执行文件的目录层级不一致,导致在c.php里面require_once语句有两条。使其相当于

 代码如下 复制代码

require_once("a.php");
require_once("../a.php");
class B extends A
{
    public static function demo()
    {
    echo "xx";
    }
}
B::demo();

原因找到了,因为在c.php里面,其相对目录 “..”就是 c.php的上一层了,导致文件找不到报错。
所以,我们的结论是,在 PHP 里面,使用require_once的时候,存在不同层级关系,且有相对目录的使用那么一定要谨慎,小心。


require_once很简单用但在使用时大家尽量使用绝对路径了。

[!--infotagslink--]

相关文章

  • php正确禁用eval函数与误区介绍

    eval函数在php中是一个函数并不是系统组件函数,我们在php.ini中的disable_functions是无法禁止它的,因这他不是一个php_function哦。 eval()针对php安全来说具有很...2016-11-25
  • php中eval()函数操作数组的方法

    在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
  • Python astype(np.float)函数使用方法解析

    这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08
  • Python中的imread()函数用法说明

    这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
  • C# 中如何取绝对值函数

    本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
  • C#学习笔记- 随机函数Random()的用法详解

    下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • 解决Pycharm的项目目录突然消失的问题

    今天小编就为大家分享一篇解决Pycharm的项目目录突然消失的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-22
  • 金额阿拉伯数字转换为中文的自定义函数

    CREATE FUNCTION ChangeBigSmall (@ChangeMoney money) RETURNS VarChar(100) AS BEGIN Declare @String1 char(20) Declare @String2 char...2016-11-25
  • Android开发中findViewById()函数用法与简化

    findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20
  • C++中 Sort函数详细解析

    这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
  • PHP用strstr()函数阻止垃圾评论(通过判断a标记)

    strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。该函数返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 false。语法:strstr(string,search)参数string,必需。规定被搜索的字符串。 参数sea...2013-10-04
  • PHP函数分享之curl方式取得数据、模拟登陆、POST数据

    废话不多说直接上代码复制代码 代码如下:/********************** curl 系列 ***********************///直接通过curl方式取得数据(包含POST、HEADER等)/* * $url: 如果非数组,则为http;如是数组,则为https * $header:...2014-06-07
  • php中的foreach函数的2种用法

    Foreach 函数(PHP4/PHP5)foreach 语法结构提供了遍历数组的简单方式。foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息。...2013-09-28
  • C#路径,文件,目录及IO常见操作汇总

    这篇文章主要介绍了C#路径,文件,目录及IO常见操作,较为详细的分析并汇总了C#关于路径,文件,目录及IO常见操作,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • C语言中free函数的使用详解

    free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。下面我们就来详细探讨下...2020-04-25
  • PHP函数strip_tags的一个bug浅析

    PHP 函数 strip_tags 提供了从字符串中去除 HTML 和 PHP 标记的功能,该函数尝试返回给定的字符串 str 去除空字符、HTML 和 PHP 标记后的结果。由于 strip_tags() 无法实际验证 HTML,不完整或者破损标签将导致更多的数...2014-05-31
  • SQL Server中row_number函数的常见用法示例详解

    这篇文章主要给大家介绍了关于SQL Server中row_number函数的常见用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-08
  • PHP加密解密函数详解

    分享一个PHP加密解密的函数,此函数实现了对部分变量值的加密的功能。 加密代码如下: /* *功能:对字符串进行加密处理 *参数一:需要加密的内容 *参数二:密钥 */ function passport_encrypt($str,$key){ //加密函数 srand(...2015-10-30
  • docker 启动elasticsearch镜像,挂载目录后报错的解决

    这篇文章主要介绍了docker 启动 elasticsearch镜像,挂载目录后报错的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-20
  • php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法

    最近遇到一个问题,就是在使用php的mail函数发送utf-8编码的中文邮件时标题出现乱码现象,而邮件正文却是正确的。最初以为是页面编码的问题,发现页面编码utf-8没有问题啊,找了半天原因,最后找到了问题所在。 1.使用 PEAR 的...2015-10-21