ulimit 详解

ulimit [-SHacdflmnpstuv [limit]]
Provides control over the resources available to the shell and to processes started by it, on systems that
allow such control. The -H and -S options specify that the hard or soft limit is set for the given
resource. A hard limit cannot be increased once it is set; a soft limit may be increased up to the value of
the hard limit. If neither -H nor -S is specified, both the soft and hard limits are set. The value of
limit can be a number in the unit specified for the resource or one of the special values hard, soft, or
unlimited, which stand for the current hard limit, the current soft limit, and no limit, respectively. If
limit is omitted, the current value of the soft limit of the resource is printed, unless the -H option is
given. When more than one resource is specified, the limit name and unit are printed before the value.
Other options are interpreted as follows:
-a All current limits are reported
-c The maximum size of core files created
-d The maximum size of a process’s data segment
-f The maximum size of files created by the shell
-l The maximum size that may be locked into memory
-m The maximum resident set size
-n The maximum number of open file descriptors (most systems do not allow this value to be set)
-p The pipe size in 512-byte blocks (this may not be set)
-s The maximum stack size
-t The maximum amount of cpu time in seconds
-u The maximum number of processes available to a single user
-v The maximum amount of virtual memory available to the shell

If limit is given, it is the new value of the specified resource (the -a option is display only). If no
option is given, then -f is assumed. Values are in 1024-byte increments, except for -t, which is in sec-
onds, -p, which is in units of 512-byte blocks, and -n and -u, which are unscaled values. The return status
is 0 unless an invalid option or argument is supplied, or an error occurs while setting a new limit.

 

中文解释:

-H 设置硬限制.
-S 设置软限制.
-a 显示当前所有的资源限制.
-c size:设置core文件的最大值.单位:blocks
-d size:设置数据段的最大值.单位:kbytes
-f size:设置创建文件的最大值.单位:blocks
-l size:设置在内存中锁定进程的最大值.单位:kbytes
-m size:设置可以使用的常驻内存的最大值.单位:kbytes
-n size:设置内核可以同时打开的文件描述符的最大值.单位:n
-p size:设置管道缓冲区的最大值.单位:kbytes
-s size:设置堆栈的最大值.单位:kbytes
-t size:设置CPU使用时间的最大上限.单位:seconds
-v size:设置虚拟内存的最大值.单位:kbytes

 

配置文件: /etc/security/limits.conf 可以针对用户或组进行永久性 配置,使用命令的配置是临时的,针对当前用户的,不写文件的,退出当前shell就没有了的,写在配置文件中可以永久生效

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/ ,安装基本就是 ‘下一步 -> 下一步 。。。’,所以,我就不多说了,等有了成果再续吧!