php遍历一个文件夹下的文件

在面试中我们经常遇到这个题目:php遍历一个文件夹下的所有文件和子文件夹。

  这个题目有好多种解决方法。但大致思路都一样。采用递归。

  •  $path = ’./filepath’;  
  •  function getfiles($path)  
  •  {  
  •      if(!is_dir($path)) return;  
  •     $handle  = opendir($path);  
  •     while( false !== ($file = readdir($handle)))  
  •     {  
  •         if($file != ’.'  &&  $file!=’..’)  
  •         {  
  •             $path2= $path.’/’.$file;  
  •             if(is_dir($path2))  
  •             {  
  •                 echo ’  
  • ‘;  
  •                 echo $file;  
  •                getfiles($path2);  
  •             }else 
  •             {  
  •                echo ’  
  • ‘;  
  •                 echo $file;  
  •             }  
  •         }  
  •     }  
  • }  
  •  
  •   print_r( getfiles($path));  
  •  
  • echo ’  
  • <HR>’;  
  •  
  • function getdir($path)  
  • {  
  •     if(!is_dir($path)) return;  
  •     $handle = dir($path);  
  •     while($file=$handle-&gt;read())  
  •     {  
  •         if($file!=’.' &amp;&amp; $file!=’..’)  
  •         {  
  •             $path2 = $path.’/’.$file;  
  •             if(is_dir($path2))  
  •             {  
  •                     echo $file.”\t”;  
  •                      getdir($path2);  
  •             }else 
  •             {  
  •                 echo $file.’  
  • ‘;  
  •             }  
  •         }  
  •     }  
  • }  
  •  getdir($path);  
  •  
  •  echo ’  
  • <HR>’;  
  •  
  •  function get_dir_scandir($path){  
  •  
  •     $tree = array();  
  •     foreach(scandir($path) as $single){  
  •         if($single!=’.' &amp;&amp; $single!=’..’)  
  •         {  
  •             $path2 = $path.’/’.$single;  
  •             if(is_dir($path2))  
  •             {  
  •                 echo  $single.”  
  • \r\n”;  
  •                  get_dir_scandir($path2);  
  •             }else 
  •             {  
  •                 echo $single.”  
  • \r\n”;  
  •             }  
  •         }  
  •     }  
  • }  
  • get_dir_scandir($path);  
  •  
  •   echo ’  
  • <HR>’;  
  •  
  • function get_dir_glob(){  
  •     $tree = array();  
  •     foreach(glob(‘./curl/*’) as $single){  
  •         echo $single.”  
  • \r\n”;  
  •     }  
  • }  
  • get_dir_glob();  
  •  
  •    echo ’  
  • <HR>’;  
  • function myscandir($path)  
  • {  
  •     if(!is_dir($path))  return;  
  •     foreach(scandir($path) as $file)  
  •     {  
  •         if($file!=’.'  &amp;&amp; $file!=’..’)  
  •         {  
  •             $path2= $path.’/’.$file;  
  •             if(is_dir($path2))  
  •             {  
  •                 echo $file;  
  •                 myscandir($path2);  
  •             }else 
  •             {  
  •                 echo $file.’  
  • ‘;  
  •             }  
  •         }  
  •     }  
  • }  
  •  
  • myscandir($path);  
  •  
  •    echo ’  
  • <HR>’;  
  •  
  • function myglob($path)  
  • {  
  •     $path_pattern = $path.’/*’;  
  •     foreach(glob($path_pattern) as $file)  
  •     {  
  •             if(is_dir($file))  
  •             {  
  •                 echo $file;  
  •                 myscandir($file);  
  •             }else 
  •             {  
  •                 echo $file.’  
  • ‘;  
  •             }  
  •     }  
  • }  
  •  
  • myglob($path);
  • 外部数据提交的处理-PHP安全

    规则 1:绝不要信任外部数据或输入

      关于 Web 应用程序安全性,必须认识到的第一件事是不应该信任外部数据。外部数据(outside data) 包括不是由程序员在 PHP 代码中直接输入的任何数据。在采取措施确保安全之前,来自任何其他来源(比如 GET 变量、表单 POST、数据库、配置文件、会话变量或 cookie)的任何数据都是不可信任的。

      例如,下面的数据元素可以被认为是安全的,因为它们是在 PHP 中设置的。

      清单 1. 安全无暇的代码

    以下为引用的内容: $myUsername = ‘tmyer’;$arrayUsers = array(‘tmyer’, ‘tom’, ‘tommy’);define(“GREETING”, ‘hello there’ . $myUsername);?>   但是,下面的数据元素都是有瑕疵的。

      清单 2. 不安全、有瑕疵的代码

    以下为引用的内容: $myUsername = $_POST['username']; //tainted! $arrayUsers = array($myUsername, ‘tom’, ‘tommy’); //tainted! define(“GREETING”, ‘hello there’ . $myUsername); //tainted! ?>   为什么第一个变量 $myUsername 是有瑕疵的?因为它直接来自表单 POST。用户可以在这个输入域中输入任何字符串,包括用来清除文件或运行以前上传的文件的恶意命令。您可能会问,“难道不能使用只接受字母 A-Z 的客户端(Javascrīpt)表单检验脚本来避免这种危险吗?”是的,这总是一个有好处的步骤,但是正如在后面会看到的,任何人都可以将任何表单下载 到自己的机器上,修改它,然后重新提交他们需要的任何内容。

      解决方案很简单:必须对 $_POST['username'] 运行清理代码。如果不这么做,那么在使用 $myUsername 的任何其他时候(比如在数组或常量中),就可能污染这些对象。

      对用户输入进行清理的一个简单方法是,使用正则表达式来处理它。在这个示例中,只希望接受字母。将字符串限制为特定数量的字符,或者要求所有字母都是小写的,这可能也是个好主意。

      清单 3. 使用户输入变得安全

    以下为引用的内容: $myUsername = cleanInput($_POST['username']); //clean! $arrayUsers = array($myUsername, ‘tom’, ‘tommy’); //clean! define(“GREETING”, ‘hello there’ . $myUsername); //clean! function cleanInput($input){ $clean = strtolower($input); $clean = preg_replace(“/[^a-z]/”, “”, $clean); $clean = substr($clean,0,12);return $clean; } ?>

    规则 2:禁用那些使安全性难以实施的 PHP 设置

      已经知道了不能信任用户输入,还应该知道不应该信任机器上配置 PHP 的方式。例如,要确保禁用 register_globals。如果启用了 register_globals,就可能做一些粗心的事情,比如使用 $variable 替换同名的 GET 或 POST 字符串。通过禁用这个设置,PHP 强迫您在正确的名称空间中引用正确的变量。要使用来自表单 POST 的变量,应该引用 $_POST['variable']。这样就不会将这个特定变量误会成 cookie、会话或 GET 变量。

    规则 3:如果不能理解它,就不能保护它

      一些开发人员使用奇怪的语法,或者将语句组织得很紧凑,形成简短但是含义模糊的代码。这种方式可能效率高,但是如果您不理解代码正在做什么,那么就无法决定如何保护它。

      例如,您喜欢下面两段代码中的哪一段?

      清单 4. 使代码容易得到保护

    以下为引用的内容: //obfuscated code $input = (isset($_POST['username']) ? $_POST['username']:”); //unobfuscated code $input = ”; if (isset($_POST['username'])){ $input = $_POST['username']; }else{ $input = ”; } ?>   在第二个比较清晰的代码段中,很容易看出 $input 是有瑕疵的,需要进行清理,然后才能安全地处理。
    规则 4:“纵深防御” 是新的法宝

      本教程将用示例来说明如何保护在线表单,同时在处理表单的 PHP 代码中采用必要的措施。同样,即使使用 PHP regex 来确保 GET 变量完全是数字的,仍然可以采取措施确保 SQL 查询使用转义的用户输入。

      纵深防御不只是一种好思想,它可以确保您不会陷入严重的麻烦。

      既然已经讨论了基本规则,现在就来研究第一种威胁:SQL 注入攻击。

      防止 SQL 注入攻击

      在 SQL 注入攻击 中,用户通过操纵表单或 GET 查询字符串,将信息添加到数据库查询中。例如,假设有一个简单的登录数据库。这个数据库中的每个记录都有一个用户名字段和一个密码字段。构建一个登录表单,让用户能够登录。




      这个表单接受用户输入的用户名和密码,并将用户输入提交给名为 verify.php 的文件。在这个文件中,PHP 处理来自登录表单的数据,如下所示:

      清单 6. 不安全的 PHP 表单处理代码

    以下为引用的内容: ctr == 1){ //they’re okay to enter the application! $okay = 1; } } if ($okay){ $_SESSION['loginokay'] = true; header(“index.php”); }else{ header(“login.php”); } ?>   这段代码看起来没问题,对吗?世界各地成百(甚至成千)的 PHP/MySQL 站点都在使用这样的代码。它错在哪里?好,记住 “不能信任用户输入”。这里没有对来自用户的任何信息进行转义,因此使应用程序容易受到攻击。具体来说,可能会出现任何类型的 SQL 注入攻击。

      例如,如果用户输入 foo 作为用户名,输入 ‘ or ’1′=’1 作为密码,那么实际上会将以下字符串传递给 PHP,然后将查询传递给 MySQL:

    以下为引用的内容:
    这个查询总是返回计数值 1,因此 PHP 会允许进行访问。通过在密码字符串的末尾注入某些恶意 SQL,黑客就能装扮成合法的用户。

      解 决这个问题的办法是,将 PHP 的内置 mysql_real_escape_string() 函数用作任何用户输入的包装器。这个函数对字符串中的字符进行转义,使字符串不可能传递撇号等特殊字符并让 MySQL 根据特殊字符进行操作。清单 7 展示了带转义处理的代码。

      清单 7. 安全的 PHP 表单处理代码

    以下为引用的内容: ctr == 1){ //they’re okay to enter the application! $okay = 1; } } if ($okay){ $_SESSION['loginokay'] = true; header(“index.php”); }else{ header(“login.php”); } ?>   使用 mysql_real_escape_string() 作为用户输入的包装器,就可以避免用户输入中的任何恶意 SQL 注入。如果用户尝试通过 SQL 注入传递畸形的密码,那么会将以下查询传递给数据库:

    以下为引用的内容: select count(*) as ctr from users where username=’foo’ and password=’\’ or \’1\’=\’1′ limit 1″

    大型网站架构问题

    这里的大型网站架构只包括高互动性高交互性的数据型大型网站,基于大家众所周知的原因,我们就不谈新闻类和一些依靠HTML静态化就可以实现的架构了,我们以高负载高数据交换高数据流动性的网站为例,比如海内,开心网等类似的web2.0系列架构。我们这里不讨论是PHP还是JSP或者.NET环境,我们从架构的方面去看问题,实现语言方面并不是问题,语言的优势在于实现而不是好坏,不论你选择任何语言,架构都是必须要面对的。

      这里讨论一下大型网站需要注意和考虑的问题

      1、海量数据的处理

      众所周知,对于一些相对小的站点来说,数据量并不是很大,select和update就可以解决我们面对的问题,本身负载量不是很大,最多再加几个索引就可以搞定。对于大型网站,每天的数据量可能就上百万,如果一个设计不好的多对多关系,在前期是没有任何问题的,但是随着用户的增长,数据量会是几何级的增长的。在这个时候我们对于一个表的select和update的时候(还不说多表联合查询)的成本的非常高的。

      2、数据并发的处理

      在一些时候,2.0的CTO都有个尚方宝剑,就是缓存。对于缓存,在高并发高处理的时候也是个大问题。在整个应用程序下,缓存是全局共享的,然而在我们进行修改的时候就,如果两个或者多个请求同时对缓存有更新的要求的情况下,应用程序会直接的死掉。这个时候,就需要一个好的数据并发处理策略以及缓存策略。

      另外,就是数据库的死锁问题,也许平时我们感觉不到,死锁在高并发的情况下的出现的概率是非常高的,磁盘缓存就是一个大问题。

      3、文件存贮的问题

      对于一些支持文件上传的2.0的站点,在庆幸硬盘容量越来越大的时候我们更多的应该考虑的是文件应该如何被存储并且被有效的索引。常见的方案是对文件按照日期和类型进行存贮。但是当文件量是海量的数据的情况下,如果一块硬盘存贮了500个G的琐碎文件,那么维护的时候和使用的时候磁盘的Io就是一个巨大的问题,哪怕你的带宽足够,但是你的磁盘也未必响应过来。如果这个时候还涉及上传,磁盘很容易就over了。

      也许用raid和专用存贮服务器能解决眼下的问题,但是还有个问题就是各地的访问问题,也许我们的服务器在北京,可能在云南或者新疆的访问速度如何解决?如果做分布式,那么我们的文件索引以及架构该如何规划。

      所以我们不得不承认,文件存贮是个很不容易的问题

      4、数据关系的处理

      我们可以很容易的规划出一个符合第三范式的数据库,里面布满了多对多关系,还能用GUID来替换INDENTIFY COLUMN 但是,多对多关系充斥的2.0时代,第三范式是第一个应该被抛弃的。必须有效的把多表联合查询降到最低。

      5、数据索引的问题

      众所周知,索引是提高数据库效率查询的最方面最廉价最容易实现的方案。但是,在高UPDATE的情况下,update和delete付出的成本会高的无法想想,笔者遇到过一个情况,在更新一个聚焦索引的时候需要10分钟来完成,那么对于站点来说,这些基本上是不可忍受的。

      索引和更新是一对天生的冤家,问题A,D,E这些是我们在做架构的时候不得不考虑的问题,并且也可能是花费时间最多的问题。

      6、分布式处理

      对于2.0网站由于其高互动性,CDN实现的效果基本上为0,内容是实时更新的,我们常规的处理。为了保证各地的访问速度,我们就需要面对一个绝大的问题,就是如何有效的实现数据同步和更新,实现各地服务器的实时通讯有是一个不得不需要考虑的问题。

      7、Ajax的利弊分析

      成也AJAX,败也AJAX,AJAX成为了主流趋势,突然发现基于XMLHTTP的post和get是如此的容易。客户端get或者post 到服务器数据,服务器接到数据请求之后返回来,这是一个很正常的AJAX请求。但是在AJAX处理的时候,如果我们使用一个抓包工具的话,对数据返回和处理是一目了然。对于一些计算量大的AJAX请求的话,我们可以构造一个发包机,很容易就可以把一个webserver干掉。

      8、数据安全性的分析

      对于HTTP协议来说,数据包都是明文传输的,也许我们可以说我们可以用加密啊,但是对于G问题来说的话,加密的过程就可能是明文了(比如我们知道的QQ,可以很容易的判断他的加密,并有效的写一个跟他一样的加密和解密方法出来的)。当你站点流量不是很大的时候没有人会在乎你,但是当你流量上来之后,那么所谓的外挂,所谓的群发就会接踵而来(从qq一开始的群发可见端倪)。也许我们可以很的意的说,我们可以采用更高级别的判断甚至HTTPS来实现,注意,当你做这些处理的时候付出的将是海量的database,io以及CPU的成本。对于一些群发,基本上是不可能的。笔者已经可以实现对于百度空间和qq空间的群发了。大家愿意试试,实际上并不是很难。

      9、数据同步和集群的处理的问题

      当我们的一台databaseserver不堪重负的时候,这个时候我们就需要做基于数据库的负载和集群了。而这个时候可能是最让人困扰的的问题了,数据基于网络传输根据数据库的设计的不同,数据延迟是很可怕的问题,也是不可避免的问题,这样的话,我们就需要通过另外的手段来保证在这延迟的几秒或者更长的几分钟时间内,实现有效的交互。比如数据散列,分割,内容处理等等问题。

      10、数据共享的渠道以及OPENAPI趋势

      Openapi已经成为一个不可避免的趋势,从google,facebook,myspace到海内校内,都在考虑这个问题,它可以更有效的留住用户并激发用户的更多的兴趣以及让更多的人帮助你做最有效的开发。这个时候一个有效的数据共享平台,数据开放平台就成为必不可少的途径了,而在开放的接口的情况保证数据的安全性和性能,又是一个我们必须要认真思考的问题了。

    迎接PHP5.3时代 停止更新PHP5.2

    在php官网上php5.2.x系列稳定版更新到php5.2.14,PHP5.3.x系列更新到PHP5.3.3。同时这个版本主要改进了PHP5.2.x系列的稳定性,修复60多个BUG,部分BUG与安全相关。这个版本标志着对PHP5.2系列更新的结束,在此版本之后不再积极更新PHP5.2x,其安全补丁可能以单个形式发布。

      PHP官网着重列出一个PHP5.3.3新的不兼容特性:在命名空间里,和类名一致的函数不再被作为一个构造函数。不过没有使用namespace的类不受影响。

      与此同时,PHP开发团队发布了PHP5.3.3,修复了近100个BUG,鼓励所有PHP5.2系列的用户升级到PHP5.3。 但是实际上国内很多PHP程序对PHP5.3的支持都有不少小问题。

      以下是PHP5.3.3的修复清单。 Rewrote var_export() to use smart_str rather than output buffering, prevents data disclosure if a fatal error occurs (CVE-2010-2531).

      Fixed a possible resource destruction issues in shm_put_var().

      Fixed a possible information leak because of interruption of XOR operator.

      Fixed a possible memory corruption because of unexpected call-time pass by refernce and following memory clobbering through callbacks.

      Fixed a possible memory corruption in ArrayObject::uasort().

      Fixed a possible memory corruption in parse_str().

      Fixed a possible memory corruption in pack().

      Fixed a possible memory corruption in substr_replace().

      Fixed a possible memory corruption in addcslashes().

      Fixed a possible stack exhaustion inside fnmatch().

      Fixed a possible dechunking filter buffer overflow.

      Fixed a possible arbitrary memory access inside sqlite extension.

      Fixed string format validation inside phar extension.

      Fixed handling of session variable serialization on certain prefix characters.

      Fixed a NULL pointer dereference when processing invalid XML-RPC requests (Fixes CVE-2010-0397, bug #51288).

      Fixed SplObjectStorage unserialization problems (CVE-2010-2225).

      Fixed possible buffer overflows in mysqlnd_list_fields, mysqlnd_change_user.

      Fixed possible buffer overflows when handling error packets in mysqlnd.

      Key enhancements in PHP 5.3.3 include:

      Upgraded bundled sqlite to version 3.6.23.1.

      Upgraded bundled PCRE to version 8.02.

      Added FastCGI Process Manager (FPM) SAPI.

      Added stream filter support to mcrypt extension.

      Added full_special_chars filter to ext/filter.

      Fixed a possible crash because of recursive GC invocation.

      Fixed bug #52238 (Crash when an Exception occured in iterator_to_array).

      Fixed bug #52041 (Memory leak when writing on uninitialized variable returned from function).

      Fixed bug #52060 (Memory leak when passing a closure to method_exists()).

      Fixed bug #52001 (Memory allocation problems after using variable variables).

      Fixed bug #51723 (Content-length header is limited to 32bit integer with Apache2 on Windows).

      Fixed bug #48930 (__COMPILER_HALT_OFFSET__ incorrect in PHP >= 5.3).

      For users upgrading from PHP 5.2 there is a migration guide available on http://php.net/migration53, detailing the changes between those releases and PHP 5.3.

      PHP5.2.14主要更新清单

      Rewrote var_export() to use smart_str rather than output buffering, prevents data disclosure if a fatal error occurs.

      Fixed a possible interruption array leak in strrchr().(CVE-2010-2484)

      Fixed a possible interruption array leak in strchr(), strstr(), substr(), chunk_split(), strtok(), addcslashes(), str_repeat(), trim().

      Fixed a possible memory corruption in substr_replace().

      Fixed SplObjectStorage unserialization problems (CVE-2010-2225).

      Fixed a possible stack exaustion inside fnmatch().

      Fixed a NULL pointer dereference when processing invalid XML-RPC requests (Fixes CVE-2010-0397, bug #51288).

      Fixed handling of session variable serialization on certain prefix characters.

      Fixed a possible arbitrary memory access inside sqlite extension. Reported by Mateusz Kocielski.

      Key enhancements in PHP 5.2.14 include:

      Upgraded bundled PCRE to version 8.02.

      Updated timezone database to version 2010.5.

      Fixed bug #52238 (Crash when an Exception occured in iterator_to_array).

      Fixed bug #52237 (Crash when passing the reference of the property of a non-object).

      Fixed bug #52041 (Memory leak when writing on uninitialized variable returned from function).

      Fixed bug #51822 (Segfault with strange __destruct() for static class variables).

      Fixed bug #51552 (debug_backtrace() causes segmentation fault and/or memory issues).

      Fixed bug #49267 (Linking fails for iconv on MacOS: “Undefined symbols: _libiconv”).

      下面列出的是PHP5.3已经不支持的相关函数:

      ereg();//直接用mb_ereg代替,或是preg_match代替,但是匹配规则需要用/包括起来

      eregi();//preg_match代替,在规则后加上i,如:preg_match(“/^(style|style_)(.*)*/i”, $file);

      ereg_replace();

      set_magic_quotes_runtime();

      split();

      mysql_close(); // 将不支持全部关闭, 需要改为:mysql_close($link);

    重命名为.htaccess提示为”必须键入文件名”解决方法

    最近在拟静态中的.htaccess文件无法创建,先在本地电脑上创建了一个记事本文件,重命名为.htaccess提示为”必须键入文件名”,无法创建。

    解决方法:
    第一种: 1. 打开Windows内建的记事本;
      2. 选取另存新文件“文件->另存为”;
      3. 在另存为的“保存类型”下拉选单中选取“所有文件”类型;
      4. 这时就可在“文件名”中输入.htaccess;
      5. 选取要另存的路径再按下保存,一个.htaccess 文件就新增完成了。
    第二种:
    可以用apache工具htpasswd.exe
    htpasswd -c .htaccess admin
    然后自己改里面的内容
    第三种:
    放在网站跟目录下即可,windowXP直接建立是不允许的,可以使用编辑器,或者FTP工具建立。

    推荐第一种解决方法。

    3种PHP生成静态html文件的方法

    介绍Php 生成静态html文件的三种方法 。

    1,下面使用模版的一个方法!

    <?php
    $fp = fopen ("templets.html","a");
    if ($fp){
    $fup = fread ($fp,filesize("templets.html"));
    $fp2 = fopen ("html.shtml","w");
    if ($fwrite ($fp2,$fup)){
    $fclose ($fp);
    $fcolse ($fp2);
    die ("写入模板成功");
    } else {
    fclose ($fp);
    die ("写入模板失败!");
    }
    }
    ?>
    

    简单的将模板写进一个文件中存为html.html

    2,按时间生成html文件名

    <?php
    $content = "这是一个以日期时间为文件名的静态生成网页的测试文件,
    文件名格式一般为年月日时分秒.html";
    $date = date('YmdHis');
    $fp = fopen (date('YmdHis') . '.html',"w");
    //本函数可用来打开本地或者远端的文件 'w' 开文件方式为写入,
    文件指针指到开始处,并将原文件的长度设为 0。若文件不存在,
    则建立新文件。
    if (fwrite ($fp,$content)){
    //格式是.int fwrite(int fp(文件名), string string(内容),
     int [length](长度));本函数将字符串 string 写入文件资料流的指针 fp 上。
    若有指定长度 length,则会写入指定长度字符串,或是写到字符串结束。
    fclose ($fp);//函数用来关闭已经打开的文件的指针 fp。
    成功返回 true,失败则返回 false。
    die ("写入模板成功");
    } else {
    fclose ($fp);
    die ("写入模板失败!");
    }
    echo ($content);
    ?>
    

    3,下面为转换文件名的一个方法

    <?php
    $s_fname = "93e.php";
    $o_fname = "93e.htm";
    ob_end_clean();
    ob_start();
    include($s_fname);
    $length = ob_get_length();
    $buffer = ob_get_contents();
    $buffer = eregi_replace("r","",$buffer);
    ob_end_clean(); 
    
    $fp = fopen($o_fname,"w+");
    fwrite($fp,$buffer);
    fclose($fp);
    ?>
    

    这样就可以把 93e.php转化为静态的HTML文件了 。要注意的是待转换的文件里不能有 ob_end_clean();和 ob_start();语句,且目录要有写权限。

    php之gzip压缩方法

    如果你的网站是php的,通过下面的方法将能加速你网站的访问速度,无论加速多少,哪怕是0.01秒,你的网站在用户体验上就更进了一步。
    在尝试用如下方法前请为你的FirrFox(没有FireFox?移步前往)装上由Yahoo开发的YSlow插件(YSlow是什么?),然后用它分析一下你网站现在的分值是多少.切入正题,开始gzip压缩(本文以压缩css文件为例).
    第一步,建立压缩所需的php文件
    复制如下代码,保存到要压缩的css文件同目录,命名为css.php,名称可根据你自己喜好命名,只要是php文件即可.

    <?php
    /**
    *@a.header(...这一行是设置压缩文件类型的,如果你要压缩js文件就将text/css改成text/javascript
    *@b.include(...此处包含你要压缩的文件,多个按你现在的顺序依次用include("...");调用
    */
    if(extension_loaded('zlib')){//检查服务器是否开启了zlib拓展
        ob_start('ob_gzhandler');
      }
      header ("content-type: text/css; charset: utf-8");//在这里设置要压缩的文件类型
      header ("cache-control: must-revalidate");
      $offset = 60 * 60 * 240;//文件的距离现在的过期时间,这里设置为一天
      $expire = "expires: " . gmdate ("D, d M Y H:i:s", time() + $offset) . " GMT";
      header ($expire);
      ob_start("compress");
      function compress($buffer) {//去除文件中的注释
          $buffer = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $buffer);
          return $buffer;
        }
      include("style.css");//在此处包含你所要压缩的文件,多个请用include包含后依次排列
      if(extension_loaded("zlib")){
        ob_end_flush();//输出buffer中的内容
    }
    ?>
    

    第二步,前台调用
    以本站为例. 原CSS调用为:

    
    

    gzip压缩后调用方式为:

    
    

    需要说明的是,如果你以前有多个css调用,那么,gzip后只须调用一个.当然,前提是你的压缩php文件中包含了所有要调用的css样式表.
    第三步,压缩完成,此时用我文章开始提到的YSlow插件再分析一下你的网站,对比一下两次的分值,相信一定会有惊喜.
    最后,要提醒一点的时,gzip的php文件中设置了缓存时间,如果你改过css文件,传上去后不是即时生效的,生效时间为上述gzip代码中$offset后面设置的值.解决方法其实也很简单,修改css后,同时修改一下样式调用路径中…/css.php?v=100415 100415的值(这个值可以随意取)即可.
    用户体验就是从最细微处做起,忘掉自己的行为模式,站在用户的角度为用户着想,你网站的用户体验就做到了一半.

    转载自:http://mrthink.net

    PHPer的不同阶段

    我对PHPer的定义: PHPer是工作/程序以编写PHP程序为主,其他方面略有涉猎的人.部分由C/C++ 转来的人,虽然也做php程序,但工作重点仍是C/C++.不能说是PHPer或者不能说是纯粹的PHPer.

    1 : 对PHPer的划分,我对PHPer划分为以下几个阶段.
    a: PHP 爱好者 (半个PHPer)
    b: PHP 初学者 (PHP Beginner)
    c: PHP 初级程序员 (Primary PHP Coder)
    d: PHP 中级程序员 (Junior PHP Coder)
    e: PHP 高級程序员 (Senior PHP Coder)
    f: PHP 工程师 (PHP Programmar)
    以下是对PHPer划分的具体描述:

    X: PHPer的共同特点:
    0: 会电脑,能上网.
    1: 知道w3c标准,
    2: 会html,会JS,会PHP.会MySQL.
    3: 知道linux.见过linux运行.
    不满足以上内容者别说自己是PHPer.

    以下对不同阶段的描述, 每一个高级阶段都需要掌握低级阶段的技能 . 他们之间具有继承关系. 在初级阶段,由于目前国内的情况.经常需要PHPer兼美工/网管的功能.所以也写了一部分其他技能.

    a: PHP 爱好者
    定义: 以PHP程序为业余爱好,建有或正维护着一个或几个使用PHP技术实现的网站/程序的人是PHP 爱好者.
    描述: 这些人一般不以PHP为谋生手段,他们的分布以网站站长及在校学生为主.
    特征: 1: 会用dreamweaver/frontpage等工具制作网页.
    2: 可以对现成PHP程序进行修改.
    3: 爱好PHP.
    技术要求: 无.

    b: PHP 初学者 (PHP Beginner)
    定义: 准备以PHP程序谋生,准备建设或正在维护一个或几个使用PHP技术实现的网站/程序的人是PHP 初学者 (PHP Beginner).
    描述: 这些人已经或即将以PHP为主要谋生手段,他们的分布以即将毕业的大学生及刚刚加入PHP 程序员行列的人为主
    特征: 1: 能够简单维护/操作/优化linux.
    2: 能够编写PHP程序.
    3: 会MySQL.
    4: 会html/js.
    5: 能够构建符合W3C标准的页面.
    6: 能够胜任简单的服务器维护工作.
    技术要求:
    1: 服务器运行系统:
    a: linux:
    I: 能够安装Linux系统、熟练使用Linux常用命令、知道Vim文本编辑器,会软件包管理.
    II: 能够实际操作用户管理、进程管理、文件系统管理、权限管理功能
    III: 知道并会使用Linux网络配置相关文件、基本配置命令、DHCP、VNC、DNS服务器、Samba服务器. 能成功配置并使以下服务平稳运行.SSH、FTP、Apache,站点登录控制、日志管理.
    IV: 能够使用shell对服务器进行维护.
    V: 能够进行Linux系统安全配置、Iptables、syslog日志管理

    b: windows:
    仅为初学者和初级程序员要求.
    I: 能够安装windows、熟练使用windows、能够对IIS进行优化.
    II: 能够正确配置防火墙、对服务器进行管理维护.
    III: 能够抵御普通的网络攻击.
    2 web页面技术及相关:
    其实这不应该算是PHP的技术.但实际工作中,大部分PHP初学者都需要兼前台/后台/网管的角色.故在此提出,仅供参考.
    I: 熟练掌握HTML, Dreamweaver、常用标签、图象地图、表格、分桢框架、表单,Header处理,CSS, 样式表的分类、样
    式则规器使用,常用的样式、层标签,JavaScript
    II: 各种事件及事件处理程序的应用、window对象、document对象、location对象、body对象、form对象、form表单字段元素对象
    III: ajax及其相关技术.能完成常见ajax页面制作

    3 MySQL技术
    I: 熟练掌握SQL语句.
    II: 熟练掌握MySQL的常用操作.包括安全、访问控制和权限、备份和恢复,复制、导入和导出记录.
    III: 熟练掌握 phpMyAdmin或任意一种MySQL管理维护工具.

    4 PHP技术
    I: 熟练掌握PHP语法,常用函数.
    II: 熟悉PHP的面向对象编程.并能实际使用面向对象思想进行程序写作.
    III: 熟悉PHP常用库.

    c: PHP 初级程序员 (Primary PHP Coder)
    定义: 正在以PHP程序谋生,正在建设或维护一个或几个使用PHP技术实现的网站/程序的人,PHP经验有限的人是PHP初级程序员.
    描述: 这些人已经以PHP为主要谋生手段,他们的分布以刚刚加入PHP 程序员行列的人为主,也有部分加入PHP行列若干年的人.
    特征: 1: 能够维护/操作/优化linux.
    2: 熟练编写PHP程序.
    3: 熟练掌握MySQL.
    4: 会html/js.
    5: 能够快速构建符合W3C标准的页面.
    6: 能够胜任大部分服务器维护工作.
    技术要求:
    1: 服务器运行系统:
    a: linux:
    I: 熟练安装Linux系统、熟练使用Linux常用命令和某些日常使用的命令、掌握软件包管理.
    II: 能够熟练操作用户管理、进程管理、文件系统管理、权限管理功能
    III: 能够熟练使用Linux网络配置相关文件、基本配置命令、DHCP、VNC、DNS服务器、Samba服务器. 能快速的配置并使

    以下服务平稳运行.SSH、FTP、Apache,站点登录控制、日志管理.
    IV: 能够对MySQL和Apache进行一定的优化以提升网站性能.
    V: 能够使用shell对服务器进行维护.熟练使用常用的维护工具.
    VI: 能够进行Linux系统安全配置、Iptables、syslog日志管理

    b: windows:
    仅为初学者和初级程序员要求.
    I: 能够安装windows、熟练使用windows、能够对IIS进行优化.
    II: 能够正确配置防火墙、对服务器进行管理维护.
    III: 能够抵御普通的网络攻击.
    2 web页面技术及相关:
    其实这不应该算是PHP的技术.但实际工作中,大部分初级PHP程序员在公司里都需要兼前台/后台/网管的角色.故在此提出,仅供参考.

    I: 熟练掌握HTML, Dreamweaver、常用标签、图象地图、表格、分桢框架、表单,Header处理,CSS, 样式表的分类、样式则规器使用,常用的样式、层标签,JavaScript
    II: 各种事件及事件处理程序的应用、window对象、document对象、location对象、body对象、form对象、form表单字段

    元素对象
    III: ajax及其相关技术.能完成常见ajax页面制作.
    IV: 会photoshop在内的一种或多种图片编辑软件

    3 MySQL技术
    I: 熟练掌握SQL语句.
    II: 熟练掌握MySQL的操作.包括安全、访问控制和权限、备份和恢复,复制、导入和导出记录.
    III: 熟练掌握 phpMyAdmin或任意一种MySQL管理维护工具.
    IV: 知道MySQL常见性能瓶颈的原因及解决方法.并能实际解决.

    4 PHP技术
    I: 熟练掌握PHP语法,常用函数.
    II: 熟悉PHP的面向对象编程.并能实际使用面向对象思想进行程序.
    III: 熟悉php面向对象的特性.能够根据实际运行环境选择开发方法.
    IV: 熟悉PHP常用库.能够使用常用的php库进行项目开发.
    V: 拥有良好的编码格式习惯,可以规范的进行代码编写.
    5 项目相关
    I: 实际完成过PHP项目.或全程参与过php网站开发与建设.
    II: 能够较为快速的进行项目开发.

    d: PHP 中级程序员 (Junior PHP Coder)
    定义: 正在以PHP程序谋生,正在建设或维护一个或几个使用PHP技术实现的网站/程序的人,有几年PHP经验但是尚未积累必要的代码库和

    快速开发工具的人是PHP 中级程序员 .
    描述: 这些人已经以PHP为主要谋生手段,他们的分布以加入PHP 程序员行列5年内的人为主,也有部分加入PHP行列更多年的人.
    特征:
    1: 能熟练维护/操作/优化linux.
    2: 快速编写结构清晰,代码格式优美的PHP程序.
    3: 熟练掌握MySQL的操作和常用优化.
    4: 熟悉程序性能的出现瓶颈的常见原因,并能在实际编写过程中避免出现性能瓶颈.
    5: 能够使用某些框架/类库加速项目开发进度.
    6: 能够胜任大部分服务器维护工作.
    技术要求:
    1: 服务器运行系统:
    a: linux:
    I: 熟悉操作一种版本linux,并能对此版本的linux进行一些调整优化
    II: 能够进行不停机维护升级.
    III: 能够熟练使用Linux命令行下操作.
    IV: 能够对MySQL和Apache进行优化以提升网站性能.
    V: 能够配置小型服务器集群(双服务器或三服务器).
    VI: 能够进行Linux系统安全配置、Iptables、syslog日志管理

    2 web页面技术及相关:
    到中级程序员,一般公司都有专门的美工和前台程序员配合工作.故页面制作技术要求同初级程序员.
    I: 熟悉常见的通信标准.可以根据手册编写出符合通信标准的程序.

    3 MySQL技术
    I: 熟练掌握SQL语句.
    II: 熟练掌握MySQL的操作.包括安全、访问控制和权限、备份和恢复,复制、导入和导出记录.
    III: 熟练掌握 phpMyAdmin或任意一种MySQL管理维护工具.
    IV: 知道MySQL性能瓶颈的原因及解决方法.并能实际解决.
    4 PHP技术
    I: 熟练掌握PHP语法,常用函数.
    II: 熟悉PHP的面向对象编程.并能实际使用面向对象思想进行程序.
    III: 熟悉php面向对象的特性.能够根据实际运行环境选择开发方法.
    IV: 熟悉PHP常用库.能够使用常用的php库进行项目开发.
    V: 拥有良好的编码格式习惯,可以规范的进行代码编写.
    5 项目相关
    I: 实际完成过PHP项目.或全程参与过php网站开发与建设.
    II: 能够较为快速的进行项目开发.
    III: 有自己的代码库.可以在项目中进行复用
    IV: 形成了良好的编码习惯,编写的程序代码清晰,注释清楚.
    V: 能够对项目中的难点与新技术进行攻关.

    e: PHP 高級程序员 (Senior PHP Coder)
    定义: 正在以PHP程序为主要工作,建设过多个PHP项目,正在建设或维护一个或几个使用PHP技术实现的网站/程序的人,有多年PHP经验,有自己的代码库和快速开发工具的人是PHP 高级程序员.
    描述: 这些人已经以PHP为主要谋生手段,他们的分布以加入PHP 程序员行列5年以上的人为主.高级程序员是PHP项目的核心力量.
    特征:
    1: 能熟练维护/操作/优化linux.
    2: 快速编写结构清晰,代码格式优美的PHP程序.
    3: 熟练掌握MySQL的操作/优化和多数据库.
    4: 能够快速查出程序性能的出现瓶颈的原因,并能根据实际情况进行调整.
    5: 能够使用框架/类库加速项目开发进度.
    6: 有自己的代码库.
    7: 能够胜任大部分服务器维护工作.
    技术要求:
    1: 服务器运行系统:
    a: linux:
    I: 熟悉操作一种版本linux,并能对此版本的linux进行一些调整优化
    II: 能够进行不停机维护升级.
    III: 能够熟练使用Linux命令行下操作.
    IV: 能够对MySQL和Apache进行优化以提升网站性能.
    V: 能够配置和优化服务器集群.
    VI: 能够进行Linux系统安全配置、Iptables、syslog日志管理

    2 MySQL技术
    I: 精通SQL语句.
    II: 熟练掌握MySQL的操作.
    III: 熟练掌握 phpMyAdmin或任意一种MySQL管理维护工具.
    IV: 能够根据实际运行情况对数据库瓶颈进行调整,并适时改变开发方法.
    4 PHP技术
    I: 精通PHP语法,常用函数.并有自己专注的方向.
    II: 熟练使用PHP的面向对象编程.并能实际使用面向对象思想进行程序.

    III: 熟悉php面向对象的特性.能够根据实际运行环境选择开发方法.
    IV: 实际使用工厂化开发等开发方法进行项目开发.能够使用PHP的特性提升开发速度和程序运行速度.
    V: 有自己的代码库,有自己熟悉兵精通的某些共用类库.
    VI: 拥有良好的编码格式习惯,可以规范的进行代码编写.
    5 项目相关
    I: 实际完成过多个不同方面的PHP项目.
    II: 能够快速的进行项目开发.
    III: 有自己的代码库.可以在项目中使用代码库进行快速开发.
    IV: 形成了良好的编码习惯,编写的程序代码清晰,注释清楚.
    V: 能够领导程序员对项目中的难点与新技术进行攻关.
    VI: 熟悉软件工程,能够根据实际情况选用适当的开发模式.
    f: PHP 工程师 (PHP Programmar)
    定义: 正在以PHP程序为主要工作,并正在进行新产品的研发.可以同时使用C+/perl等辅助提高PHP程序性能的人是PHP工程师.
    描述: PHP工程师是.
    特征:
    1: 精通一种或多种linux.
    2: 快速编写结构清晰,代码格式优美的PHP程序.
    3: 能够进行框架级通用程序的研发.
    4: 能够在程序开发初期就通过项目规划避免未来可能出现的性能瓶颈.
    5: 能够使用框架/类库
    加速项目开发进度.
    6: 有自己的代码库.
    7: 能够胜任大部分服务器和部分服务器集群优化工作.
    技术要求我就不说了.具体到PHP中级程序员之后,PHP程序员就开始选择发展方向进行分化了.能够到这一步的人,基本都对自己的职业规划有清晰的认识. 目前国内此类人才奇少.

    关于其他:
    1 PHP程序员从中级程序员阶段就开始分化,具体方向根据公司性质,工作条件,自己的兴趣等不一而同.因此需要擅长的详细技能也不太相同

    例如: 公司使用 joomla 构建网站, 这就要求程序员必须精通joomla. 如果公司使用自研CMS+discuz构建网站,这就要求程序员能够熟练进行DISCUZ的二次开发.强行要求程序员精通这精通那,意义不大.到高级程序员开始.PHP程序员由于自己的职业经历.肯定会有自己的专攻方向,有人擅长大负载下程序开发优化,有人擅长项目快速开发.到这个阶段,如果PHP程序员还需要看这篇文章规划自己的职业生涯.那么请自己列出自己擅长的PHP技术.并选择一种最擅长的技术专攻.

    2 关于coder和programmar. 字面上理解第一个是编码员,第二个是程序员.实际因为国内名词的混乱.第一个大多以程序员称呼,第二个目前

    大多处于项目核心领导层面.故本文暂以工程师称呼.
    coder 是进行少量创新的,大量重复工作的人.
    programmar 是进行新技术摸索开发,并实际领导/带领大中型项目开发的人.

    3 关于 C++ . PHP初期的语法(php3/4时代)和C几乎一样.我当初就是看一下午PHP速成+php手册入的门.但到一定深度之后.有些PHP的特性需要实际阅读 PHP源码才能理解(相关文档不全或者不好找到).有些实际项目功能使用C++开发远比PHP效率高.比如我现在做的项目需要爬虫持续海量抓取,当带宽足够的情况时,纯使用PHP实现效率不高.所以必须使用C++. 所以C++到需要用的时候自然而然的就要用了.不过如果有C/C++的基础,学习PHP要轻松很多.

    4 关于面向对象.面向对象还是很帅的,小型工程上使用意义不大,大中型工程可以极大的提升开发效率.在php4的时代对面向对象基本没什么要求,但是现在需要完整掌握面向对象.

    5 关于JAVA/Delphi 他们和php有关么? 我孤陋寡闻.请牛人指教.谢谢

    6 关于软件工程. 软件工程是一个实际使用中才能学懂的学科.我才疏学浅,在大学的时候楞没学懂.等实际领导项目了.才慢慢的明白其中的含义与奥妙.

    8 关于开发模式. 开发模式的好坏直接关系这项目开发的速度与项目的质量.初期死抠模式意义不大.建议有一定积累了再说.

    9 关于名气. 嗯…怎么说呢?高端PHP圈子很小,也就那么些人.水平到了,自然就认识那些人了.

    10 关于第三方库,初期学习掌握一些,比如smarty.到一定阶段需要决定到底是精通第三方库还是使用自行积累开发的库.总的来说,由于第三方库大多是外国人开发,所以国内想要时刻紧跟比较被动,phpBB中文的没落便是一例.如果使用自行积累开发的库,难度较大,要注意通用性和可扩展性.

    11 关于英文. 这个是废话.最低要求是流畅阅读英文文档.

    第一个php病毒PHP.Pirus

    PHP.Pirus是第一只被发现的用PHP写的病毒,它寻找扩展名为.php和.htm的文件,并插入代码去调用自己。这个病毒只能在以php为解释器的服务器上。访问一个被它感染的网页并不能感染上病毒。

    种类:病毒
    感染长度:718字节
    病毒发现时间:2000-11-13
    危害程度: 疯狂程度:低;
    破坏程度:低;
    传播:低
    疯狂程度:
    被感染的计算机:0-49
    被感染的站点:0-2
    地理分布: 低
    防范:容易
    消除:容易

    技术描述:
    这个病毒是用php写的,长度为718字节
    当发作时,它寻找当前目录中以.php和.htm结尾的文件,如果发现有可写文件,它先判断文件是否已感染,如果没被感染,它会在文件中插入一行,优先执行病毒文件

    消除:
    病毒文件名可能是变化的,所以完全消除它,必须:
    1. 删除原始病毒文件
    2. 去掉所有已感染的php和htm文件中的病毒代码
    如病毒文件名假设为virus.php,那么所有感染文件中的如下语句必须删除
    php学习之家
    include “virus.php”
    /php>

    linux下设置开机自动启动

    下面用自启动apache为例:

    有两种方法可以让Apache在系统启动时自动启动
    1. 在/etc/rc.d/rc.local中增加启动apache的命令,例如:/usr/local/httpd/bin/apachectl start

    2. 将apache注册为系统服务
    首先将apachectl命令拷贝至/etc/rc.d/init.d目录下,改名为httpd
    使用编辑器打开httpd文件,并在第一行#!/bin/sh下增加两行文字如下
    # chkconfig: 35 70 30
    # description: Apache

    接着注册该服务
    chkconfig –add httpd

    一切OK了,启动服务
    service httpd start

    其中所增加的第二行中三个数字第一个表示在运行级别3和5下启动apache,第二、三是关于启动和停止的优先级配置,无关紧要。

    在Red Hat linux中自动运行程序
    1.开机启动时自动运行程序
    Linux加载后, 它将初始化硬件和设备驱动, 然后运行第一个进程init。init根据配置文件继续引导过程,启动其它进程。通常情况下,修改放置在 /etc/rc或 /etc/rc.d 或 /etc/rc?.d 目录下的脚本文件,可以使init自动启动其它程序。例如:编辑 /etc/rc.d/rc.local 文件,在文件最末加上一行”xinit”或”startx”,可以在开机启动后直接进入X-Window。

    2.登录时自动运行程序
    用户登录时,bash首先自动执行系统管理员建立的全局登录script :/etc/PRofile。然后bash在用户起始目录下按顺序查找三个特殊文件中的一个:/.bash_profile、/.bash_login、 /.profile,但只执行最先找到的一个。
    因此,只需根据实际需要在上述文件中加入命令就可以实现用户登录时自动运行某些程序(类似于DOS下的Autoexec.bat)。

    3.退出登录时自动运行程序
    退出登录时,bash自动执行个人的退出登录脚本/.bash_logout。例如,在/.bash_logout中加入命令”tar -cvzf c.source.tgz *.c”,则在每次退出登录时自动执行 “tar” 命令备份 *.c 文件。

    4.定期自动运行程序
    Linux有一个称为crond的守护程序,主要功能是周期性地检查 /var/spool/cron目录下的一组命令文件的内容,并在设定的时间执行这些文件中的命令。用户可以通过crontab 命令来建立、修改、删除这些命令文件。
    例如,建立文件crondFile,内容为”00 9 23 Jan * HappyBirthday”,运行”crontab cronFile”命令后,每当元月23日上午9:00系统自动执行”HappyBirthday”的程序(”*”表示不管当天是星期几)。

    5.定时自动运行程序一次
    定时执行命令at 与crond 类似(但它只执行一次):命令在给定的时间执行,但不自动重复。at命令的一般格式为:at [ -f file ] time ,在指定的时间执行file文件中所给出的所有命令。也可直接从键盘输入命令:

    $ at 12:00
    at>mailto Roger -s ″Have a lunch″ < plan.txt
    at>Ctr-D
    Job 1 at 2000-11-09 12:00

    2000-11-09 12:00时候自动发一标题为”Have a lunch”,内容为plan.txt文件内容的邮件给Roger。
    #!/bin/bash
    RESTART=”……..” #里面写相应服务代码
    START=”…….”
    STOP=”……….”
    case “$1″ in
    restart)
    $RESTART
    echo “……”
    ;;
    start)
    $START
    echo “……”
    ;;
    STOP)
    $STOP
    echo “……”
    ;;
    *)
    echo “Usage: $0 {restart | start | stop}”
    exit 1
    esac

    exit 1

    脚本写完要修改一下权限 chmod u+x test.sh
    首先,linux随机启动的服务程序都在/etc/init.d这个文件夹里,里面的文件全部都是脚本文件(脚本程序简单的说就是把要运行的程序写 到一个 文件里让系统能够按顺序执行,类似windows下的autorun.dat文件),另外在/etc这个文件夹里还有诸如名为rc1.d, rc2.d一直到rc6.d的文件夹,这些都是linux不同的runlevel,我们一般进入的X windows多用户的运行级别是第5级,也就是rc5.d,在这个文件夹下的脚本文件就是运行第5级时要随机启动的服务程序。需要注意的是,在每个rc (1-6).d文件夹下的文件其实都是/etc/init.d文件夹下的文件的一个软连接(类似windows中的快捷方式),也就是说,在 /etc/init.d文件夹下是全部的服务程序,而每个rc(1-6).d只链接它自己启动需要的相应的服务程序!

    要启动scim(某一程序),我们首先要知道scim程序在哪里,用locate命令可以找到,scim在/usr/bin/scim这里,其中usr表 示是 属于用户的,bin在linux里表示可以执行的程序。这样,我就可以编写一个脚本程序,把它放到/etc/init.d里,然后在rc5.d里做一个相 应的软链接就可以了。
    这个脚本其实很简单,就两行:

    #!/bin/bash
    /usr/bin/scim

    第一行是声明用什么终端运行这个脚本,第二行就是要运行的命令。

    还需要注意的一点是,在rc5.d里,每个链接的名字都是以S或者K开头的,S开头的表示是系统启动是要随机启动的,K开头的是不随机启动的。这 样,你就可以知道,如果我要哪个服务随机启动,就把它名字第一个字母K改成S就可以了,当然,把S改成K后,这个服务就不能随机启动了。因此,我这个链接 还要起名为SXXX,这样系统才能让它随机启动。