PHP Some

来源:互联网 发布:端口110 编辑:程序博客网 时间:2024/06/01 08:25

register_globals boolean:决定是否将 EGPCS(Environment,GET,POST,Cookie,Server)变量注册为全局变量。

====================

PHP 输出缓存 (gzip)

====================


unset()一些

1、函数原型voidunset (mixed$var [,mixed$var [,$... ]] )
可以同时销毁多少变量,在php3.0时会有返回值,返回true(实际上是整型值1),PHP4后它不再是个函数,还是个语句,自然就没有返回值了。

unset() 在函数中的行为会依赖于想要销毁的变量的类型而有所不同。

2、如果在函数中 unset() 一个全局变量,则只是局部变量被销毁,而在调用环境中的变量将保持调用unset() 之前一样的值。

function destroy_foo() {
    global 
$foo;
    unset(
$foo);
}
$foo 'bar';
destroy_foo();
echo 
$foo;//输出bar

3、如果您想在函数中 unset() 一个全局变量,可使用 $GLOBALS 数组来实现:

function foo() {
    unset($GLOBALS['bar']);
}

$bar = "something";
foo();
echo $bar;//此时变量$bar 就不存在了,运行此行将报错


5、似乎unset对函数静态变量不起作用

function foo() {
    static 
$a;
    
$a++;
    echo 
"$a\n";
    unset(
$a);//有没有这行效果是一样的
}

foo();//输出1
foo();//输出2
foo();//输出3

====================


PHP定时执行

ignore_user_abort(true);
set_time_limit(0);

例如:

ignore_user_abort(true);
set_time_limit(0);
function write_txt(){
    if(!file_exists('test.txt')){
        $fp = fopen('test.txt','wb');
        fclose($fp);
    }
    $str = file_get_contents('test.txt');
    $str .= '----'.date('H:i:s').'----';
    $fp = fopen('test.txt','wb');
    fwrite($fp,$str);
    fclose($fp);
}
function do_cron(){
    usleep(5000000);
    write_txt();
}
while(1){
do_cron();
}

====================

使用PHP进行http认证(有两种方式):

使用PHP进行http认证,看到的效果是:直接在网页上弹出一个windows窗口,要求输入认证的用户名和密码,只有认证登录成功才能看到内容。

1、Apache身份认证配置

<Directory /home/MyMember>

  AuthType Basic

  AuthName MyMember

  AuthUserFile /usr/local/MyMember.txt

  Options Includes ExecCGI

  <Limit GET POST>

     require valid-user

  </Limit>

</Directory>

2、使用PHP程序进行验证:

其实就header('WWW-Authenticate: Basic realm="login"');

它是通过利用header()函数向客户端浏览器发送”Authentication Required”信息,强制其弹出一个用户名/密码输入窗口,当用户输入用户名和密码后,包含有URL的PHP脚本将会加上预定义变量PHP_AUTH_USER, PHP_AUTH_PW和AUTH_TYPE然后再次调用,这三个变量分别表示用户名,密码和认证类型(从PHP5.0.1起开始支持”Basic”和”Digest”两种认证方式),它们被保存在$_SERVER(从HP>>4.1.0起有效)或$HTTP_SERVER_VARS(从PHP3起有效)数组中具体应用时,我们可以把验证的几行代码写成函数,只要判断到用户变量不存在或验证不正确就一直执行该函数并弹出窗口,而且还可以设置错误登录几次就不允许该用户访问,具体的使用大家使劲的发散思考吧.

2.注意事项:
我们在使用PHP实现HTTP认证机制时还有几点问题我们是需要注意的:
1.这段代码必须放到程序的开始,且在其开始执行之前不能有任何输出(若有输出则
需要使用输出缓冲函数才行).
2.PHP的HTTP认证机制仅在PHP以Apache模块方式运行时才有效,这个容易理解,它本身是HTTP强制认证,肯定是不适合于CGI版本,不能在命令行下执行的.
3.header发送标头代码时请小心.为了对所有的客户端保证兼容性,关键字”Basic”的第一个字母必须大写为”B”,分界字符串必须用双引号引用(不能是单引号);在HTTP/1.0和401之间必须有且仅有一个空格.
4.在上面列子中,仅输出了用户名和密码,而在实际系统中则可按照登录验证流程进行与数据库或其他方式进行判断和验证.
5.从PHP4.3.0起,为防止有人通过编写脚本来从页面上获取密码,当外部认证对特定页面有效,并且安全模式被开启时,PHP_AUTH变量将不会被设置.可以用REMOTE_USER来辨别外部认证的用户,用AuthType指令来判断外部认证机制是否有效.
6.要想让HTTP认证能够在IIS下工作,PHP配置选项cgi.rfc2616_headers必须设置为0(默认值).


<?php
//session_start();
/* 检查变量 $PHP_AUTH_USER 和$PHP_AUTH_PW 的值
** 为了兼容不同版本用$_SERVER['PHP_AUTH_USER']
*/
if ((!isset($_SERVER['PHP_AUTH_USER'])) || (!isset($_SERVER['PHP_AUTH_PW']))) {
    /* 空值:发送产生显示文本框的数据头部*/
    header('WWW-Authenticate: Basic realm="login"');
    header('HTTP/1.0 401 Unauthorized');
    echo '登录失败.';
    exit;
} else if ((isset($_SERVER['PHP_AUTH_USER'])) && (isset($_SERVER['PHP_AUTH_PW']))){
    /* 变量值存在,检查其是否正确 */
    if (($_SERVER['PHP_AUTH_USER'] != 'admin') || ($_SERVER['PHP_AUTH_PW'] != '123456')) {
    /* 用户名输入错误或密码输入错误,发送产生显示文本框的数据头部*/
        header('WWW-Authenticate: Basic realm="login"');
        header('HTTP/1.0 401 Unauthorized');
        echo '登录失败.';
        exit;
    } else if (($_SERVER['PHP_AUTH_USER'] == 'admin') || ($_SERVER['PHP_AUTH_PW'] == '123456')){
        /* 用户名及密码都正确,输出成功信息 */
        echo '<P>oh.成功登录!</p>';
        //$_SESSION['name'] = 'admin';
        //header('Location: suss.php');
    }
}
?>

第一种方法:在用户少的时候,使用又简单又省事!但是一旦用户上万,乃至十万,就会发生整个服务器为了搜寻密码而拖垮!

第二种方法:感觉响应时间快,但是,是不是就可以这样,在最后认证成功后,来个header重定向一下



=================================

错误处理:

Warning: Call-time pass-by-reference has been deprecated - argument passed by value; If you would like to pass it by reference, modify the declaration of getimagesize(). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file. However, future versions may not support this any longer错误,后来才知道原因是此方法已不被赞成并在 PHP/Zend 未来的版本中很可能不再支持了。

第一种方法、 把php.ini的display_errors = on改成display_errors = off (不显示错误)

第二种方法、allow_call_time_pass_reference = Off 变成 allow_call_time_pass_reference = On