Updates from 二月, 2010

  • 使用for循环合并提高效率

    shishirui 12:35 on 2010/02/28 | 0 Permalink | Reply

    在使用大量次的for循环时,往往由于循环次数较多而严重影响程序执行效率,这时,我们可以使用循环合并来解决这个问题。

    首先看一个普通的for循环,这个循环用于计算50000000次e的指数。

    <?php
    for ($i = 0; $i < 50000000; $i++) {
    exp(12);
    }

    我们看一下执行时间:

    $ time php for.php
    real    0m49.217s
    user    0m32.522s
    sys     0m0.280s

    可以看到,总共需要49s。这时,我们对for循环做一点改动:

    <?php
    for ($i = 0; $i < 50000000; $i++) {
    exp(12);
    $i++;
    exp(12);
    $i++;
    exp(12);
    $i++;
    exp(12);
    $i++;
    exp(12);
    }

    这样改动后,exp()函数依然被执行了50000000次,但for只会循环50000000 / 5 = 10000000 次。这时,再来看一下执行时间:

    $ time php for.php
    real    0m28.755s
    user    0m23.953s
    sys     0m0.204s

    可以看到,现在只需要28s,效率提高了大约42%,还是比较明显的。

     
  • php.curl详解

    shishirui 10:34 on 2009/08/12 | 0 Permalink | Reply

    PHP中的CURL函数库(Client URL Library Function)

    curl_close - 关闭一个curl会话
    curl_copy_handle - 拷贝一个curl连接资源的所有内容和参数
    curl_errno - 返回一个包含当前会话错误信息的数字编号
    curl_error - 返回一个包含当前会话错误信息的字符串
    curl_exec - 执行一个curl会话
    curl_getinfo - 获取一个curl连接资源句柄的信息
    curl_init - 初始化一个curl会话
    curl_multi_add_handle - 向curl批处理会话中添加单独的curl句柄资源
    curl_multi_close - 关闭一个批处理句柄资源
    curl_multi_exec - 解析一个curl批处理句柄
    curl_multi_getcontent - 返回获取的输出的文本流
    curl_multi_info_read - 获取当前解析的curl的相关传输信息
    curl_multi_init - 初始化一个curl批处理句柄资源
    curl_multi_remove_handle - 移除curl批处理句柄资源中的某个句柄资源
    curl_multi_select - Get all the sockets associated with the cURL extension, which can then be "selected"
    curl_setopt_array - 以数组的形式为一个curl设置会话参数
    curl_setopt - 为一个curl设置会话参数
    curl_version - 获取curl相关的版本信息

    curl_init()函数的作用初始化一个curl会话,curl_init()函数唯一的一个参数是可选的,表示一个url地址。
    curl_exec()函数的作用是执行一个curl会话,唯一的参数是curl_init()函数返回的句柄。
    curl_close()函数的作用是关闭一个curl会话,唯一的参数是curl_init()函数返回的句柄。

    <?php
    $ch = curl_init("http://www.baidu.com/");
    curl_exec($ch);
    curl_close($ch);
    ?>

    curl_version()函数的作用是获取curl相关的版本信息,curl_version()函数有一个参数,不清楚是做什么的
    (More ...)

     
  • 无法注释掉的php代码

    shishirui 18:58 on 2009/08/11 | 0 Permalink | Reply

    今天在测试一个正则时,想要用双斜线注释掉下面的代码:

    <?php
    //preg_match('/<img.*?src=[\'\"]?(http|https|ftp):\/\/([^\'\"]*?.(gif|jpg|png))[\'\" ]{1}.*?>/i', $a, $m);

    可是发现这样并不能成功,代码运行之后会打印出:

    /i', $a, $m);

    应该是代码中有 "?>" 符号的问题,换做这样注释就可以了。

    <?php
    /*
    preg_match('/<img.*?src=[\'\"]?(http|https|ftp):\/\/([^\'\"]*?.(gif|jpg|png))[\'\" ]{1}.*?>/i', $a, $m);
    */

     
  • 去掉a标签中无用的属性

    shishirui 17:49 on 2009/07/24 | 0 Permalink | Reply

    $data = preg_replace('/<a.*?href="(.*?)".*?>/i', '<a href="\\1">', $data);

     
  • echo "${${phpinfo()}}";

    shishirui 15:19 on 2009/07/21 | 0 Permalink | Reply

    echo "${${phpinfo()}}";

    这句将导致phpinfo()被执行,在某些情况下,可能会导致安全漏洞。

     
  • 正则表达式的模式修正符

    shishirui 20:04 on 2009/07/17 | 0 Permalink | Reply

    今天因为没搞清楚一个模式修正符而捣鼓了半天,所以特此记录。

    下面列出了当前在 PCRE 中可能使用的修正符。括号中是这些修正符的内部 PCRE 名。修正符中的空格和换行被忽略,其它字符会导致错误。

    i (PCRE_CASELESS)
    如果设定此修正符,模式中的字符将同时匹配大小写字母。

    m(PCRE_MULTILINE)
    默认情况下,PCRE 将目标字符串作为单一的一“行”字符所组成的(甚至其中包含有换行符也是如此)。“行起始”元字符(^)仅仅匹配字符串的起始,“行结束”元字符($)仅仅匹配字符串的结束,或者最后一个字符是换行符时其前面(除非设定了 D 修正符)。这和 Perl 是一样的。

    当设定了此修正符,“行起始”和“行结束”除了匹配整个字符串开头和结束外,还分别匹配其中的换行符的之后和之前。这和 Perl 的 /m 修正符是等效的。如果目标字符串中没有“\n”字符或者模式中没有 ^ 或 $,则设定此修正符没有任何效果。

    s(PCRE_DOTALL)
    如果设定了此修正符,模式中的圆点元字符(.)匹配所有的字符,包括换行符。没有此设定的话,则不包括换行符。这和 Perl 的 /s 修正符是等效的。排除字符类例如 [^a] 总是匹配换行符的,无论是否设定了此修正符。

    x(PCRE_EXTENDED)
    如果设定了此修正符,模式中的空白字符除了被转义的或在字符类中的以外完全被忽略,在未转义的字符类之外的 # 以及下一个换行符之间的所有字符,包括两头,也都被忽略。这和 Perl 的 /x 修正符是等效的,使得可以在复杂的模式中加入注释。然而注意,这仅适用于数据字符。空白字符可能永远不会出现于模式中的特殊字符序列,例如引入条件子模式的序列 (?( 中间。

    e
    如果设定了此修正符,preg_replace() 在替换字符串中对逆向引用作正常的替换,将其作为 PHP 代码求值,并用其结果来替换所搜索的字符串。

    只有 preg_replace() 使用此修正符,其它 PCRE 函数将忽略之。

    注意: 本修正符在 PHP3 中不可用。

    A(PCRE_ANCHORED)
    如果设定了此修正符,模式被强制为“anchored”,即强制仅从目标字符串的开头开始匹配。此效果也可以通过适当的模式本身来实现(在 Perl 中实现的唯一方法)。

    D(PCRE_DOLLAR_ENDONLY)
    如果设定了此修正符,模式中的美元元字符仅匹配目标字符串的结尾。没有此选项时,如果最后一个字符是换行符的话,美元符号也会匹配此字符之前(但不会匹配任何其它换行符之前)。如果设定了 m 修正符则忽略此选项。Perl 中没有与其等价的修正符。

    S
    当一个模式将被使用若干次时,为加速匹配起见值得先对其进行分析。如果设定了此修正符则会进行额外的分析。目前,分析一个模式仅对没有单一固定起始字符的 non-anchored 模式有用。

    U(PCRE_UNGREEDY)
    本修正符反转了匹配数量的值使其不是默认的重复,而变成在后面跟上“?”才变得重复。这和 Perl 不兼容。也可以通过在模式之中设定 (?U) 修正符或者在数量符之后跟一个问号(如 .*?)来启用此选项。

    X(PCRE_EXTRA)
    此修正符启用了一个 PCRE 中与 Perl 不兼容的额外功能。模式中的任何反斜线后面跟上一个没有特殊意义的字母导致一个错误,从而保留此组合以备将来扩充。默认情况下,和 Perl 一样,一个反斜线后面跟一个没有特殊意义的字母被当成该字母本身。当前没有其它特性受此修正符控制。

    u(PCRE_UTF8)
    此修正符启用了一个 PCRE 中与 Perl 不兼容的额外功能。模式字符串被当成 UTF-8。本修正符在 Unix 下自 PHP 4.1.0 起可用,在 win32 下自 PHP 4.2.3 起可用。自 PHP 4.3.5 起开始检查模式的 UTF-8 合法性。

     
  • 一组不错的函数,分析http头、cookie串等

    shishirui 15:19 on 2009/07/09 | 0 Permalink | Reply

    http://cn2.php.net/http_parse_cookie

    需要安装PECL

     
  • php中的安全模式是指的什么?

    shishirui 14:51 on 2009/06/03 | 0 Permalink | Reply

    PHP 的安全模式是为了试图解决共享服务器(shared-server)安全问题而设立的。在结构上,试图在 PHP 层上解决这个问题是不合理的,但修改 WEB 服务器层和操作系统层显得非常不现实。因此许多人,特别是 ISP,目前使用安全模式。

    表格 24-1. 控制安全模式的设置选项有:

    设置选项 默认值
    safe_mode Off
    safe_mode_gid 0
    safe_mode_include_dir ""
    safe_mode_exec_dir 1
    open_basedir ""
    safe_mode_allowed_env_vars PHP_
    safe_mode_protected_env_vars LD_LIBRARY_PATH
    disable_functions ""

    当 safe_mode 设置为 on,PHP 将检查当前脚本的拥有者是否和将被文件函数操作的文件的拥有者相匹配。例如: -rw-rw-r-- 1 rasmus rasmus 33 Jul 1 19:20 script.php
    -rw-r--r-- 1 root root 1116 May 26 18:01 /etc/passwd

    运行 script.php

    <?php
    readfile(’/etc/passwd’);
    ?>

    如果安全模式被激活,则将会导致以下错误: Warning: SAFE MODE Restriction in effect. The script whose uid is 500 is not
    allowed to access /etc/passwd owned by uid 0 in /docroot/script.php on line 2

    同时,或许会存在这样的环境,在该环境下,宽松的 GID 检查已足够,但严格的 UID 检查反而是不适合的。你能用 safe_mode_gid 选项来控制这种检查。如果设置为 On 则进行宽松的 GID 检查;设置为 Off(默认值)则进行 UID 检查。

    除了 safe_mode 以外,如果你设置了 open_basedir 选项,则所有的文件操作将被限制在你指定的目录下。例如: <Directory /docroot>
    php_admin_value open_basedir /docroot
    </Directory>

    如果你在设置了 open_basedir 选项后运行同样的 script.php,则其结果会是: Warning: open_basedir restriction in effect. File is in wrong directory in
    /docroot/script.php on line 2

    你也能独立地屏蔽某些函数。请注意 disable_functions 选项不能在 php.ini 文件外部使用,也就是说你无法在 httpd.conf 文件的按不同虚拟主机或不同目录的方式来屏蔽函数。 如果我们将如下内容加入到 php.ini 文件: disable_functions readfile,system

    则我们会得到如下的输出: Warning: readfile() has been disabled for security reasons in
    /docroot/script.php on line 2

    被安全模式限制或屏蔽的函数
    以下安全模式列表可能不完整或不正确。

    安全模式限制函数

    函数名 限制
    dbmopen() 将检查你将要操作的文件/目录和正在执行的脚本是否有相同的 UID。
    dbase_open() 将检查你将要操作的文件/目录和正在执行的脚本是否有相同的 UID。
    filepro() 将检查你将要操作的文件/目录和正在执行的脚本是否有相同的 UID。
    filepro_rowcount() 将检查你将要操作的文件/目录和正在执行的脚本是否有相同的 UID。
    filepro_retrieve() 将检查你将要操作的文件/目录和正在执行的脚本是否有相同的 UID。
    ifx_*() sql_safe_mode 限制, (!= safe mode)
    ingres_*() sql_safe_mode 限制, (!= safe mode)
    mysql_*() sql_safe_mode 限制, (!= safe mode)
    pg_loimport() 将检查你将要操作的文件/目录和正在执行的脚本是否有相同的 UID。
    posix_mkfifo() 将检查你将要操作的目录和正在执行的脚本是否有相同的 UID。
    putenv() 遵循 ini 设置的 safe_mode_protected_env_vars 和 safe_mode_allowed_env_vars 选项。请参考 putenv() 函数的有关文件。
    move_uploaded_file() 将检查你将要操作的文件/目录和正在执行的脚本是否有相同的 UID。
    chdir() 将检查你将要操作的目录和正在执行的脚本是否有相同的 UID。
    dl() 该函数在安全模式中已被屏蔽。
    backtick operator 该函数在安全模式中已被屏蔽。
    shell_exec()(在功能上和 backticks 函数相同) 该函数在安全模式中已被屏蔽。
    exec() 你只能在 safe_mode_exec_dir 设置的目录下进行执行操作。基于某些原因,目前不能在可执行对象的路径中使用 ..。
    system() 你只能在 safe_mode_exec_dir 设置的目录下进行执行操作。基于某些原因,目前不能在可执行对象的路径中使用 ..。
    passthru() 你只能在 safe_mode_exec_dir 设置的目录下进行执行操作。基于某些原因,目前不能在可执行对象的路径中使用 ..。
    popen() 你只能在 safe_mode_exec_dir 设置的目录下进行执行操作。基于某些原因,目前不能在可执行对象的路径中使用 ..。
    mkdir() 将检查你将要操作的目录和正在执行的脚本是否有相同的 UID。
    rmdir() 将检查你将要操作的文件/目录和正在执行的脚本是否有相同的 UID。
    rename() 将检查你将要操作的文件/目录和正在执行的脚本是否有相同的 UID。 将检查你将要操作的目录和正在执行的脚本是否有相同的 UID。
    unlink() 将检查你将要操作的文件/目录和正在执行的脚本是否有相同的 UID。 将检查你将要操作的目录和正在执行的脚本是否有相同的 UID。
    copy() 将检查你将要操作的文件/目录和正在执行的脚本是否有相同的 UID。 将检查你将要操作的目录和正在执行的脚本是否有相同的 UID。 (on source and target)
    chgrp() 将检查你将要操作的文件/目录和正在执行的脚本是否有相同的 UID。
    chown() 将检查你将要操作的文件/目录和正在执行的脚本是否有相同的 UID。
    chmod() 将检查你将要操作的文件/目录和正在执行的脚本是否有相同的 UID。 另外,你不能设置 SUID、SGID 和 sticky bits
    touch() 将检查你将要操作的文件/目录和正在执行的脚本是否有相同的 UID。 将检查你将要操作的目录和正在执行的脚本是否有相同的 UID。
    symlink() 将检查你将要操作的文件/目录和正在执行的脚本是否有相同的 UID。 将检查你将要操作的目录和正在执行的脚本是否有相同的 UID。 (注意:仅测试 target)
    link() 将检查你将要操作的文件/目录和正在执行的脚本是否有相同的 UID。 将检查你将要操作的目录和正在执行的脚本是否有相同的 UID。 (注意:仅测试 target)
    getallheaders() 在安全模式下,以“authorization”(区分大小写)开头的头信息将不会被返回。警告:getallheaders() 无法在 aol-server 下实现!
    header() 在安全模式下,如果你设置了 WWW-Authenticate,当前脚本的 uid 将被添加到该头信息的 realm 部分。
    highlight_file(), show_source() 将检查你将要操作的文件/目录和正在执行的脚本是否有相同的 UID。 将检查你将要操作的目录和正在执行的脚本是否有相同的 UID。 (注意,仅在 4.2.1 版本后有效)
    parse_ini_file() 将检查你将要操作的文件/目录和正在执行的脚本是否有相同的 UID。 将检查你将要操作的目录和正在执行的脚本是否有相同的 UID。 (注意,仅在 4.2.1 版本后有效)

     
  • PHP:APC (Alternative PHP Cache)

    shishirui 12:54 on 2009/06/03 | 0 Permalink | Reply

    Alternative PHP Cache(APC)是 PHP 的一个免费公开的优化代码缓存。它用来提供免费,公开并且强健的架构来缓存和优化 PHP 的中间代码。

    http://cn.php.net/apc

     
  • 关于Memcache::get方法的返回值

    shishirui 15:36 on 2009/06/02 | 0 Permalink | Reply

    Memcache的get方法

    1. 如果参数是string 出错或缓存不存在会返回false
    2. 如果参数是数组,出错返回false, 缓存不存在会返回array();

    特殊类型的存储

    Memcache只能储存字符串,除此之外类型的数据都被转化之后(在PHP的实现中是通过序列化)储存,但是也有特殊情况:

    false => 空字符串       true => 字符串1
    null  => null           1    => 字符串1
    array => array()        "1"  => 字符串1
    0     => 字符串0
    “0”   => 字符串0
    0.0   => 字符串0
    "0.0" => “0.0”

    所以在使用的时候,一定要注意数据的类型。

     
c
撰写新文章
j
下一篇
k
上一篇
r
回复
e
编辑
o
显示/隐藏评论
t
返回顶部
esc
关闭