Windows 下文件搜索命令

1. 按文件名搜索【相当于shell中的find命令】
题目:搜索d盘下所有php文件

dir d: /A /S /B *.php

2. 按文件内容搜索【相当于shell中的grep命令】
题目:搜索d盘下含有mail_user 函数 字符串的文件

findstr /D:d:  /S /C:"function mail_user" *.php
解释: /D:  指定要搜索的目录   /S 指定要搜索子目录  /C: 指定字符串为正常的字符串,不采用模式匹配

我比较郁闷的是模式匹配不是那么好用的,用知道的给留个言啊

解读配置文件 /etc/sysctl.conf

从文件名可以看出文件/etc/sysctl.conf 是系统级别的配置文件,而且是控制方面的,但是以前不知道里面都有哪些变量是可以配置的,这次不小心发现了配置文件/etc/sysctl.conf 与 /proc/sys/ 目录是有很大关系的,比如,文件/etc/sysctl.conf 中有配置net.ipv4.tcp_syncookies = 1

那么 /proc/sys/ 目录下就有子目录net ,net 目录下就有目录ipv4, ipv4 目录下又有文件tcp_syncookies ,当然如果配置文件里没有配置,也会有一些默认的目录和文件的,反过来说,只要是/proc/sys/ 下的目录和文件都是可以在配置文件/etc/sysctl.conf 中配置的,这样在机器启动时,就不再是默认值,而是我们配置过的值了,如果不重启系统,但是修改了此配置文件,可以用命令sysctl -p 命令使配置文件生效;

命令:ls -lR /proc/sys/ 可以知道我们可以配置些什么,至于这些配置都是什么意思,还得自己去查呀

注意
1.不要以为我们在/etc/sysctl.conf 中配置了a.b.c = 1 ;sysctl -p 之后就可以在/proc/sys/就生成对应的目录和文件,结果是error的

2. sysctl -p 不会重新载入未定义的配置的默认值的,只会更新配置文件中配置的内容,不会影响没有配置到的内容。

Eaccelerator 相关

由于apache+php 自从收养的Eaccelerator 之后就没个几天要出现一点问题,所以我不得不研究一下Eaccelerator了,环境:

[junjie2@login htdocs]$ php -v
PHP 5.1.5 (cli) (built: May 28 2007 11:31:05)
Copyright (c) 1997-2006 The PHP Group
Zend Engine v2.1.0, Copyright (c) 1998-2006 Zend Technologies
with eAccelerator v0.9.5.2, Copyright (c) 2004-2006 eAccelerator, by eAccelerator
[junjie2@login htdocs]$ /data1/apache/bin/httpd -v
Server version: Apache/1.3.33 (Unix)
Server built: Feb 2 2007 11:21:13
[junjie2@login htdocs]$

Eaccelerator 版本为0.9.5.2

问题为:每隔几天apache就无法访问,重启apache一切正常,没有明显有效的apache错误日志。

解决方法:

1. 使用gdb调试apache ,因为apache编译时没有指定-g 参数,所以没法gdb调试

2. strace apache的主进程,没发现什么有效信息

3. 研究一下Eaccelerator ,决定换个版本试试,因为0.9.5.2 对0.9.5 只针对php5.2 修改了一个bug,而我的php是5.1.5的,所以用0.9.5是可以的

 

相关发现:

1.php Eaccesleratror 本身也提供了session管理的功能,但是默认的编译时没有编译进去的,需要  –with-eaccelerator-sessions  来启用该功能

2. Eaccelerator 只能用于web,对命令行无效,但不会报错,而且PHP必须是以模块的方式运行在apache中的cgi的方式不行,PHP的另一个加速器APC也有此要求

3. Eaccelerator 中的调试选项:
eaccelerator.debug="1"
eaccelerator.log_file = "/var/log/httpd/eaccelerator_log"

没有发现该文件有多少有用的调试信息,简单测试发现信息基本如下:
EACCELERATOR cached: "/var/www/html/test.php"
EACCELERATOR cached: "/var/www/html/test.php"
EACCELERATOR hit: "/var/www/html/test.php"
EACCELERATOR hit: "/var/www/html/test.php"
EACCELERATOR hit: "/var/www/html/test.php"
EACCELERATOR hit: "/var/www/html/test.php"
EACCELERATOR hit: "/var/www/html/test.php"
EACCELERATOR hit: "/var/www/html/test.php"
EACCELERATOR hit: "/var/www/html/test.php"
EACCELERATOR hit: "/var/www/html/test.php"
EACCELERATOR cached: "/var/www/html/test2.php"
EACCELERATOR cached: "/var/www/html/test3.php"

—————————————————————————————————-
4. 关于编译选项:–with-eaccelerator-debug
加上之后没有发现更多的调试信息,eaccelerator_log 文件中还是除了 hit 就是cached的

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
eAccelerator配置选项
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


eaccelerator.shm_size
       指定 eAccelerator 能够使用的共享内存数量,单位:MB
       "0" 代表操作系统默认。默认值为 "0"。

eaccelerator.cache_dir
       用户磁盘缓存的目录。eAccelerator 在该目录中存储预编译代码、session 数据、内容等。
       相同的数据也可以存储于共享内存中(以获得更快的存取速度)。默认值为 "/tmp/eaccelerator"。

eaccelerator.enable
       开启或关闭 eAccelerator。"1" 为开启,"0" 为关闭。默认值为 "1"。

eaccelerator.optimizer
       开启或关闭内部优化器,可以提升代码执行速度。"1" 为开启,"0" 为关闭。默认值为 "1"。

eaccelerator.debug
       开启或关闭调试日志记录。"1" 为开启,"0" 为关闭。默认值为 "0"。

eaccelerator.check_mtime
       开启或关闭 PHP 文件改动检查。"1" 为开启,"0" 为关闭。如果您想要在修改后重新编译 PHP
       程序则需要设置为 "1"。默认值为 "1"。

eaccelerator.filter
       判断哪些 PHP 文件必须缓存。您可以指定缓存和不缓存的文件类型(如 "*.php *.phtml"等)
       如果参数以 "!" 开头,则匹配这些参数的文件被忽略缓存。默认值为 "",即,所有 PHP 文件
       都将被缓存。

eaccelerator.shm_max
       当使用 " eaccelerator_put() " 函数时禁止其向共享内存中存储过大的文件。该参数指定允许
       存储的最大值,单位:字节 (10240, 10K, 1M)。"0" 为不限制。默认值为 "0"

eaccelerator.shm_ttl
       当 eAccelerator 获取新脚本的共享内存大小失败时,它将从共享内存中删除所有在
       最后 "shm_ttl" 秒内无法存取的脚本缓存。默认值为 "0",即:不从共享内春中删除
       任何缓存文件。

eaccelerator.shm_prune_period
        eAccelerator 获取新脚本的共享内存大小失败时,他将试图从共享内存中删除早于
       "shm_prune_period" 秒的缓存脚本。默认值为 "0",即:不从共享内春中删除
       任何缓存文件。

eaccelerator.shm_only
       允许或禁止将已编译脚本缓存在磁盘上。该选项对 session 数据和内容缓存无效。默认
       值为 "0",即:使用磁盘和共享内存进行缓存。

eaccelerator.compress
       允许或禁止压缩内容缓存。默认值为 "1",即:允许压缩。

eaccelerator.compress_level
       指定内容缓存的压缩等级。默认值为 "9",为最高等级。

eaccelerator.name_sapce
       一个所有键(keys)的前缀字符串。如果设置该前缀字符串则允许 .htaccess 或者 主配置
       文件在相同主机上运行两个相同的键名。

eaccelerator.keys
eaccelerator.sessions
eaccelerator.content
       判断哪些键(keys)、session 数据和内容将被缓存。可用参数值为:
       "shm_and_disk" – 同时在共享内存和磁盘中缓存数据(默认值);
       "shm"          – 如果共享内存用尽或者数据容量大于 "eaccelerator.shm_max"
                        则在共享内存或磁盘中缓存数据;
       "shm_only"     – 仅在共享内存中缓存数据;
       "disk_only"    – 仅在磁盘中缓存数据;
       "none"         – 禁止缓存数据。


eAccelerator 应用程序接口(API)

eaccelerator_put($key, $value, $ttl=0)
       将 $value 存储在共享内存中,并存储 $tll 秒。

eaccelerator_get($key)
       从共享内存中返回 eaccelerator_put() 函数所存储的缓存数值,如果不存在或者已经
       过期,则返回 null。

eaccelerator_rm($key)
       从共享内存中删除 $key。

eaccelerator_gc()
       删除所有过期的键(keys)

eaccelerator_lock($lock)
       创建一个指定名称的锁(lock)。该锁可以通过 eaccelerator_unlock() 函数解除,在请求
       结束时也会自动解锁。例如:
       

<?php
               eaccelerator_lock("count");
               eaccelerator_put("count",eaccelerator_get("count")+1));
       ?>



eaccelerator_unlock($lock)
       解除指定名称的锁(lock)

eaccelerator_set_session_handlers()
       安装 eAccelerator session 句柄。
       从 PHP 4.2.0 以后,您可以通过设置 php.ini 中的 "session.save_handler=eaacelerator"
       安装 eAccelerator 句柄。

eaccelerator_cache_output($key, $eval_code, $ttl=0)
       在共享内存中缓存  $eval_code 的输出,缓存 $ttl 秒。
       可以调用 mmcach_rm() 函数删除相同 $key 的输出。例如:
       

<?php eaccelerator_cache_output(‘test’, ‘echo time(); phpinfo();’, 30); ?>



eaccelerator_cache_result($key, $eval_code, $ttl=0)
       在共享内存中缓存 $eval_code 的结果,缓存 $ttl 秒。
       可以调用 mmcach_rm() 函数删除相同 $key 的结果。例如:
       

<?php eaccelerator_cache_output(‘test’, ‘time()." Hello";’, 30); ?>



eaccelerator_cache_page($key, $ttl=0)
       缓存整个页面,且缓存 $ttl 秒。例如:

<?php
               eaccelerator_cache_page($_SERVER[‘PHP_SELF’].’?GET=’.serialize($_GET),30);
               echo time();
               phpinfo();
       ?>


eaccelerator_rm_page($key)
       从缓存中删除由 eaccelerator_cache_page() 函数创建的相同 $key 的页。

eaccelerator_encode($filename)
       返回 $filename 文件经过编译后的编码。

eaccelerator_load($code)
       加载被 eaccelerator_encode() 函数编码过的脚本。

PHP加速器官方网站:http://eaccelerator.net/ 页面内的每个链接点开都有很多需要了解的东西

什么是α、β测试

  事实上,软件开发人员不可能完全预见用户实际使用程序的情况。例如,用户可能错误的理解命令,或提供一些奇怪的数据组合,亦可能对设计者自认明了的输出信息迷惑不解,等等。因此,软件是否真正满足最终用户的要求,应由用户进行一系列“验收测试”。验收测试既可以是非正式的测试,也可以有计划、有系统的测试。有时,验收测试长达数周甚至数月,不断暴露错误,导致开发延期。一个软件产品,可能拥有众多用户,不可能由每个用户验收,此时多采用称为α、β测试的过程,以期发现那些似乎只有最终用户才能发现的问题。

  α测试是指软件开发公司组织内部人员模拟各类用户行对即将面市软件产品(称为α版本)进行测试,试图发现错误并修正。α测试的关键在于尽可能逼真地模拟实际运行环境和用户对软件产品的操作并尽最大努力涵盖所有可能的 用户操作方式。经过α测试调整的软件产品称为β版本。紧随其后的β测试是指软件开发公司组织各方面的典型用户在日常工作中实际使用β版本,并要求用户报告异常情况、提出批评意见。然后软件开发公司再对β版本进行改错和完善。

相关资料:http://www.itisedu.com/phrase/200602271215442.html

Apache 中用户身份

同一个apache的 不同虚拟主机可以运行在不同的用户权限,有趣的是并不是使用user group指令来设置,Apache1.3的virtualhost中支持user group指令,但是后来就不再支持了,取而代之的是SuexecUserGroup 指令,即指定了用户也指定了组,当然这条指令需要模块 mod_suexec的支持,还需要有程序 suexec 权限一定要正确:
-r-s–x— 1 root apache 10760 Apr 12 2005 /usr/sbin/suexec
root设置s位,任何非root用户不可写,只有同组用户可执行

相关资料:http://lamp.linux.gov.cn/Apache/ApacheMenu/suexec.html

urlecode 与 rawurlencode

    

        

            

        

    

            

$str = 'foo @+%/';
            echo $str;
            echo "\n";
            echo rawurlencode($str);
            echo "\n";
            echo urldecode(rawurlencode($str));
            echo "\n";
            echo urlencode($str);
            echo "\n";
            echo rawurldecode(urlencode($str));
            
            //结论:
            //1. rawurlencode() 比 urlencode() 做的编码的部分多,urldecode() 比 rawurldecode() 解码的部分多;
            //2. rawurlencode() 的结果用urldecode()来解,没有问题,php中对参数的解码看来是用urldecode()的;
            //3. urlencode() 的结果用rawurldecode()来解,可能有问题,urlencode() 可以把空格编成加号,而rawurldecode() 却不将加号解码成空格;
            //4. 对于url的东西用urlencode已经足够,但是用rawurlencode 也绝对没有问题,urlencode天生是为url编码准备的,而rawurlencode()
            
            // 参考资料:http://man.chinaunix.net/develop/rfc/RFC1738.txt
            exit;

            

 

 

输出:

 ———-PHP代码调试 ———-
foo @+%/
foo%20%40%2B%25%2F
foo @+%/
foo+%40%2B%25%2F
foo+@+%/
输出完成 (耗时 0 秒) – 正常终止

权限问题

   曾经有好几次调试程序的时候,因为命令行执行的结果和apache中执行的结果不一样,就怀疑是权限的问题,因为命令行中我们是一自己帐户的或root的帐户来执行命令的,而apache是以web帐户来执行的,当时就测试程序中涉及权限的地方,因为web帐户自从创建之后就没有人修改过密码,也就谁也不知道密码,所以直接从普通帐户su到web时不可能的,于是谁也没想到su到web来执行命令,实际上,因为我有root的权限,所以一切都不是问题,如果我先su到root,在su到web就不需要密码了,然后执行命令看看结果,与apache执行的结果比较,是不是权限的问题就一目了然了。

动一下脑子,事情就是这么简单!

SVN Server 入门

       觉得svn是个很有意思的东西,但是一直没时间研究这个东西,今天突然来了兴致,就像装一个服务器端,于是到官方网站下了安装包,Linux下的,别说装了,就那个INSTALL文件都看的头大,我看硬着来是不行了,还是找条近道先熟悉熟悉吧,还果然有Windows下的非常方便的svn服务器,就是VisualSVN,自己不妨去下一个装装玩玩,下载就是官方网站http://www.visualsvn.com/ ,安装基本就是 ‘下一步 -> 下一步 。。。’,所以,我就不多说了,等有了成果再续吧!

getopt函数的使用

一个程序往往会提供很多参数,如果仅是简单的几个参数也就罢了,如果是很多参数,仅根据参数的位置来分析,程序会给人一种“很烂”的感觉,其实每种语言基本都提供类似getopt的函数的,先从php说起吧。

例:

    

        

            

        

    

            

$arr_opt = getopt("a:b:cd");

            

print_r($arr_opt);

            

说明: ‘:’ 代表该选项需要值
用法: ./cmd -a valueofa  -b valueofb -c -d

注意: 该函数在Windows下没有实现,本来该函数还提供long option呢,只是也需要编译php时c的支持,所以我还没研究过

shell中的用法

    

        

            

        

    

            

#!/bin/sh
            

            #FileName: getopt.sh
            

            #Desc: Show how to use command getopts
            

            #Date: 2008-01-05
            

            #Auth: lijunjie
            

            
            args='o:i:th'
            
            function show_help(){
                echo "Usage: [" $args "]"
                exit 1
            }
            #if no any args then show_help
            

            if [ -z $1 ];then
                show_help
            fi
            while getopts $args var
            do
                case $var in
                'o') out_file="$OPTARG";;
                'i') in_file="$OPTARG";;
                't') title="hello";;
                'h') show_help;;
                *) exit 2;;
                esac
            done
            echo out_file : $out_file
            echo in_file : $in_file
            [ ! -z $title ] && echo $title
            exit 0

            

 

 

c语言中怎么用的呢?

    

        

            

        

    

            

#include <unistd.h>
            
            int main(int ac ,char** av){
                int c;
                /* process arguments */
                while ((c = getopt(ac, av, "a:b:c")) != -1) {
                    switch (c) {
                        case 'a':
                            printf("a:%s\n",optarg);
                            break;
                        case 'b':
                            printf("b:%d\n",atoi(optarg));
                            break;
                        case 'c':
                            printf("c is set\n");
                            break;
                        default:
                            printf("%c is invalidate argument\n",&c);
                            break;
                    }
                }
                
            }

            

 

c中long option 的用法:

    

        

            

        

    

            

#include <stdio.h> /* for printf */
            #include <stdlib.h> /* for exit */
            #include <getopt.h>
            
            int main (int argc, char **argv) {
                int c;
                int digit_optind = 0;
            
                while (1) {
                    int this_option_optind = optind ? optind : 1;
                    int option_index = 0;
                    static struct option long_options[] = {
                        {"add", 1, 0, 0},
                        {"append", 0, 0, 0},
                        {"delete", 1, 0, 0},
                        {"verbose", 0, 0, 0},
                        {"create", 1, 0, 'c'},
                        {"file", 1, 0, 0},
                        {0, 0, 0, 0}
                    };
            
                    c = getopt_long (argc, argv, "abc:d:012",
                             long_options, &option_index);
                    if (c == -1)
                        break;
            
                    switch (c) {
                    case 0:
                        printf ("option %s", long_options[option_index].name);
                        if (optarg)
                            printf (" with arg %s", optarg);
                        printf ("\n");
                        break;
            
                    case '0':
                    case '1':
                    case '2':
                        if (digit_optind != 0 && digit_optind != this_option_optind)
                          printf ("digits occur in two different argv-elements.\n");
                        digit_optind = this_option_optind;
                        printf ("option %c\n", c);
                        break;
            
                    case 'a':
                        printf ("option a\n");
                        break;
            
                    case 'b':
                        printf ("option b\n");
                        break;
            
                    case 'c':
                        printf ("option c with value : %s'\n", optarg);
                        break;
            
                    case 'd':
                        printf ("option d with value : %s'\n", optarg);
                        break;
            
                    case '?':
                        break;
            
                    default:
                        printf ("getopt returned character code :%o \n", c);
                    }
                }
            
                if (optind < argc) {
                    printf ("non-option ARGV-elements: ");
                    while (optind < argc)
                        printf ("%s ", argv[optind++]);
                    printf ("\n");
                }
            
                exit (0);
            }