说明下:我的主机为 Centos 系统
vi apachemonitor.sh
1 |
|
然后执行: chmod +x apachemonitor.sh
添加开机启动项:
vi /etc/rc.d/rc.local
我的rc.local脚本内容为:
1 |
|
说明下:我的主机为 Centos 系统
vi apachemonitor.sh
1 | #!/bin/bash |
然后执行: chmod +x apachemonitor.sh
添加开机启动项:
vi /etc/rc.d/rc.local
我的rc.local脚本内容为:
1 |
|
转载的,里面有些内容可以借用。
1 | <?php |
GET用法:
1 | $curl = new Curl(); |
POST用法
1 | $curl = new Curl(); |
自己手工安装的lamp,所以需要有个脚本来控制服务器的停止与启动。
1 | #!/bin/bash |
LNMP一键安装包安装的MySQL默认是开启了日志文件的,如果数据操作比较频繁就会产生大量的日志,在/usr/local/mysql/var/下面产生mysql-bin.0000* 类似的文件,而且一般都在几十MB到几个GB,更甚会吃掉整个硬盘空间,从来导致mysql无法启动或报错,如vps论坛用户的反馈。
如何关闭MySQL的日志功能:
删除日志:
执行:/usr/local/mysql/bin/mysql -u root -p
输入密码登录后再执行:reset master;
再输入:quit 退出mysql命令模式。
彻底禁用MySQL日志:修改/etc/my.cnf 文件,找到
log-bin=mysql-bin
binlog_format=mixed
再这两行前面加上#,将其注释掉,再执行/etc/init.d/mysql restart即可。
注意如果你只注释:#log-bin=mysql-bin 重启mysql会出错错误: You need to use –log-bin to make –binlog-format work.
所以请把这两行都注释掉。
本文以LNMP一件安装包安装的环境为例除MySQL重启命令和配置文件路径可能略有不同,其他一样。
原文:http://www.vpser.net/manage/delete-mysql-mysql-bin-0000-logs.html
编辑 /etc/my.cnf
在 [mysqld]
最下面添加:skip-log-bin
重启mysql
1 | [root@localhost ~]# /etc/init.d/mysqld restart |
查看是否成功
1 | show variables like 'log_bin'; |
最近VPS上有个网站总是挂掉,应该是耗CPU太厉害了。因为是 wordpress mu 站。 但是重启httpd时,总是不成功。
提示 httpd dead but pid file exists
解决办法:
1 | tails -n 20 /var/log/httpd/error_log |
查看日志,看有什么错误 ,我的错误显示:
1 | [Mon Jun 25 17:54:02 2012] [emerg] (28)No space left on device: Couldn't create accept lock (/usr/local/apache/logs/accept.lock.3610) (5) |
解决办法:http://carlosrivero.com/fix-apache---no-space-left-on-device-couldnt-create-accept-lock
1 | ipcs -s | grep apache | perl -e 'while (<STDIN>) { @a=split(/\s+/); print `ipcrm sem $a[1]`}' |
然后再试试: service httpd start 应该就没问题了
网站又被别人注入恶意代码,在Google站长工具里会有提示,说我的网站被重定向到一个恶意网站上。
分析了自己的网站以前被注入恶意代码的过程,可以帮助一些人更快的找到它,并清除这些恶意代码。
我的网站是wordpress的,以前因为使用了timthumb, 由于它本身的漏洞,导致网站代码被随意更改。修复后,已经很少出现文件被修改情况。
一般一个网站被提示恶意代码,可以按以下步骤操作:
了解恶意代码的几种类型:
*恶意脚本
*.htaccess 重定向
*隐藏的 iframes
先查看网页源代码,看看有没有奇怪的script代码,如果有删除它。
然后再下载你的.htaccess, 看看有没有被人修改。
我一般都在ftp里,看文件的最近修改时间,如果在最近一段时间被人修改了,自己又没动什么,就可以确定是被别人恶意修改的。
更多信息:
PHP如何开启curl函数?
如果你使用的是XAMPP, 在安装目录下面的,php文件夹下。找到php.ini ,查找 php_curl.dll ,把前的注释 分号(;)去掉即可。
File_get_contents函数找开https url 时,会提示错误,没有安装openssl支持远程打开https文件。 如何解决?
找到php.ini 加上这段代码,或把此代码前面的注释去掉,XAMPP没有这句话,加上去即可。 把;extension=php_openssl.dll 改为 extension=php_openssl.dll
或者直接加上 extension=php_openssl.dll
last 显示系统开机以来获是从每月初登入者的讯息
-R 省略 hostname 的栏位
-num 展示前 num 个 如:last -3 展示前三行
username 展示 username 的登入讯息
tty 限制登入讯息包含终端机代号
范例:
1 | [root@elain ~]# last -R -2 |
1 | [root@elain ~]# last -2 root |
top 是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。
1 | top - 14:34:14 up 4 days, 16:20, 2 users, load average: 0.56, 0.23, 0.32 |
统计信息区前五行是系统整体的统计信息。
第一行是任务队列信息,同 uptime 命令的执行结果。其内容如下:
14:34:14 当前时间
up 4 days 系统已运行时间
2 users 当前登录用户数
0.56, 0.23, 0.32 系统负载,即任务队列的平均长度。三个数值分别为1分钟、5分钟、15分钟前到现在的平均值。
第二行为进程信息,内容如下:
Tasks: 75 total 进程总数
1 running 正在运行的进程数
74 sleeping 睡眠的进程数
0 stopped 停止的进程数
0 zombie 僵尸进程数
第三行为CPU信息,当有多个CPU时,这些内容可能会超过两行。内容如下:
Cpu(s): 0.0%us 用户空间占用CPU百分比
0.0% sy 内核空间占用CPU百分比
0.0% ni 用户进程空间内改变过优先级的进程占用CPU百分比
98.8% id 空闲CPU百分比
0.2% wa 等待输入输出(IO)的CPU时间百分比
0.0% hi cpu处理硬件中断的时间;
0.0% si cpu处理软中断的时间;
第四行为内存信息,内容如下:
Mem: 1026824k total 物理内存总量
917580k used 使用的物理内存总量
109244k free 空闲内存总量
124708k buffers 用作内核缓存的内存量
第五行为SWAP信息
Swap: 2096472k total 交换区总量
2096472k free 空闲交换区总量
664320k cached 缓冲的交换区总量。
第六行往后是进程列表,常见的这几列的意义分别为:
PID(进程号), USER(运行用户),PR(优先级),NI(任务nice值),VIRT(虚拟内存用量),RES(物理内存用量),
SHR(共享内存用量),S(进程状态),%CPU(CPU占用比),%MEM(内存占用比),TIME+(累计CPU占用时间)。
除了这些信息之外,top还提供了很多命令能帮我们更好的解读这些信息,例如按”M”键可以按内存用量进行排序;
按”P”可以按CPU使用量进行排序,这样一来对于分析系统瓶颈很有帮助;此外,按“f”可以进入交互页面,选择指定的列显示,
例如可以按“b”选择显示PPID,再按一次“b”即可取消显示。”r”可以改变一个进程的nice值;”k”可以向一个进程发信号;
”z”可以使用彩色显示。进程信息区统计信息区域的下方显示了各个进程的详细信息。首先来认识一下各列的含义。
序号 列名 含义
a PID 进程id
b PPID 父进程id
c RUSER Real user name
d UID 进程所有者的用户id
e USER 进程所有者的用户名
f GROUP 进程所有者的组名
g TTY 启动进程的终端名。不是从终端启动的进程则显示为 ?
h PR 优先级
i NI nice值。负值表示高优先级,正值表示低优先级
j P 最后使用的CPU,仅在多CPU环境下有意义
k %CPU 上次更新到现在的CPU时间占用百分比
l TIME 进程使用的CPU时间总计,单位秒
m TIME+ 进程使用的CPU时间总计,单位1/100秒
n %MEM 进程使用的物理内存百分比
o VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
p SWAP 进程使用的虚拟内存中,被换出的大小,单位kb。
q RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
r CODE 可执行代码占用的物理内存大小,单位kb
s DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
t SHR 共享内存大小,单位kb
u nFLT 页面错误次数
v nDRT 最后一次写入到现在,被修改过的页面数。
w S 进程状态。
x COMMAND 命令名/命令行
y WCHAN 若该进程在睡眠,则显示睡眠中的系统函数名
z Flags 任务标志,参考 sched.h
D=不可中断的睡眠状态
R=运行
S=睡眠
T=跟踪/停止
Z=僵尸进程
默认情况下仅显示比较重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。可以通过下面的快捷键来更改显示内容。
更改显示内容通过 f 键可以选择显示的内容。按 f 键之后会显示列的列表,按 a-z 即可显示或隐藏对应的列,最后按回车键确定。
按 o 键可以改变列的显示顺序。按小写的 a-z 可以将相应的列向右移动,而大写的 A-Z 可以将相应的列向左移动。最后按回车键确定。
按大写的 F 或 O 键,然后按 a-z 可以将进程按照相应的列进行排序。而大写的 R 键可以将当前的排序倒转。
1 | free |
第1行
total 内存总数: 1026824
used 已经使用的内存数: 917764
free 空闲的内存数: 109060
shared 当前已经废弃不用,总是0
buffers Buffer Cache内存数: 124908
cached Page Cache内存数: 664328
第2行
-/+ buffers/cache的意思相当于:
-buffers/cache 的内存数:1128528 (等于第1行的 used - buffers - cached)
+buffers/cache 的内存数: 2752124 (等于第1行的 free + buffers + cached)
第3行
total 交换分区总数: 2096472
used 已经使用的: 0
free 空闲的数: 2096472
free -m 大小以M来显示
1 | yum install -y dstat |
-c 显示CPU情况
-d 显示磁盘情况
-g 显示通信情况
-m 显示内存情况
-n 显示网络情况
-p 显示进程情况
-s 显示swap情况
-t 显示系统时钟
-y 显示系统统计
-f 使用 -C, -D, -I, -N and -S 显示
-v 使用-pmgdsc -D 显示
--ipc 报告IPC消息队列和信号量的使用情况
--lock enable lock stats
--raw enable raw stats
--tcp enable tcp stats
--udp enable udp stats
--unix enable unix stats
--mods stat1,stat2
--integer show integer values Bbs.Svn8.Com
--nocolor disable colors (implies --noupdate) Bbs.Svn8.Com
--noheaders 只显示一次表头以后就不显示了,使用重定向写入文件时很有用 Bbs.Svn8.Com
--noupdate disable intermediate updates Svn中文网
--output file 写入到CVS文件中
推荐使用 date && dstat -tclmdny 60
一分钟监视一次(注意调节显示的宽度,或去掉-t选项)。
# cat /proc/partitions
1 | [root@elain ~]# cat /proc/partitions |
major: 主设备号。8 代表 sda。
minor: 次设备号。5 代表 No.5 分区。
`#blocks`: 设备总块数
name: 设备名称。如 sda3。
1 | [root@elain ~]# iostat -x |
rrqm/s: 每秒进行 merge 的读操作数目。即 delta(rmerge)/s
wrqm/s: 每秒进行 merge 的写操作数目。即 delta(wmerge)/s
r/s: 每秒完成的读 I/O 设备次数。即 delta(rio)/s
w/s: 每秒完成的写 I/O 设备次数。即 delta(wio)/s
rsec/s: 每秒读扇区数。即 delta(rsect)/s
wsec/s: 每秒写扇区数。即 delta(wsect)/s
avgrq-sz: 平均每次设备I/O操作的数据大小 (扇区)。即 delta(rsect+wsect)/delta(rio+wio)
avgqu-sz: 平均I/O队列长度。即 delta(aveq)/s/1000 (因为aveq的单位为毫秒)。
await: 平均每次设备I/O操作的等待时间 (毫秒)。即 delta(ruse+wuse)/delta(rio+wio)
svctm: 平均每次设备I/O操作的服务时间 (毫秒)。即 delta(use)/delta(rio+wio)
%util: 一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的。
即 delta(use)/s/1000 (因为use的单位为毫秒)
如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。
svctm 一般要小于 await (因为同时等待的请求的等待时间被重复计算了),
svctm 的大小一般和磁盘性能有关,CPU/内存的负荷也会对其有影响,请求过多
也会间接导致 svctm 的增加。await 的大小一般取决于服务时间(svctm) 以及
I/O 队列的长度和 I/O 请求的发出模式。如果 svctm 比较接近 await,说明
I/O 几乎没有等待时间;如果 await 远大于 svctm,说明 I/O 队列太长,应用
得到的响应时间变慢,如果响应时间超过了用户可以容许的范围,这时可以考虑
更换更快的磁盘,调整内核 elevator 算法,优化应用,或者升级 CPU。
队列长度(avgqu-sz)也可作为衡量系统 I/O 负荷的指标,但由于 avgqu-sz 是
按照单位时间的平均值,所以不能反映瞬间的 I/O 洪水。
vmstat 命令报告虚拟内存统计信息和CPU负荷:页面调度,交换,任务交换,CPU利用率。命令的语法是:
vmstat
-swap 现时可用的交换内存(k表示)
-free 空闲的内存(k表示)
-disk 显示每秒的磁盘操作。 s表示scsi盘,0表示盘号
1 | [root@elain ~]# vmstat 1 3 [一秒刷新一次 总共3次] |
如果 r经常大于 4 ,且id经常少于40[空闲CPU],表示cpu的负荷很重。
目前说来,对于服务器监控有用处的度量主要有:
r(运行队列)
us(用户CPU)
sy(系统CPU)
id(空闲)
通过VMSTAT识别CPU瓶颈
r(运行队列)展示了正在执行和等待CPU资源的任务个数。当这个值超过了CPU数目,就会出现CPU瓶颈了。
获得CPU个数的命令(LINUX环境):
cat /proc/cpuinfo|grep processor|wc -l
当r值超过了CPU个数,就会出现CPU瓶颈,解决办法大体几种:
1. 最简单的就是增加CPU个数
2. 通过调整任务执行时间,如大任务放到系统不繁忙的情况下进行执行,进尔平衡系统任务
3. 调整已有任务的优先级
通过VMSTAT识别CPU满负荷
首先需要声明一点的是,vmstat中CPU的度量是百分比的。当us+sy的值接近100的时候,表示CPU正在接近满负荷工作。
但要注意的是,CPU 满负荷工作并不能说明什么,UNIX总是试图要CPU尽可能的繁忙,使得任务的吞吐量最大化。唯一能够确定CPU瓶颈的还是r(运行队列)的值。
通过VMSTAT识别RAM瓶颈
数据库服务器都只有有限的RAM,出现内存争用现象是Oracle的常见问题。
首先察看RAM的数量,命令如下(LINUX环境):
1 | [root@elain ~]# free |
当然可以使用top等其他命令来显示RAM。
当内存的需求大于RAM的数量,服务器启动了虚拟内存机制,通过虚拟内存,可以将RAM段移到SWAP DISK的特殊磁盘段上,
这样会出现虚拟内存的页导出和页导入现象,页导出并不能说明RAM瓶颈,虚拟内存系统经常会对内存段进行页导出,
但页导入操作就表明了服务器需要更多的内存了,页导入需要从SWAP DISK上将内存段复制回RAM,导致服务器速度变慢。
解决的办法有几种:
1. 最简单的,加大RAM
2. 改小SGA,使得对RAM需求减少
3. 减少RAM的需求(如:减少PGA)
vmstat各项:
procs:
r–>在运行队列中等待的进程数
b–>在等待io的进程数
w–>可以进入运行队列但被替换的进程
memoy
swap–>现时可用的交换内存(k表示)
free–>空闲的内存(k表示)
pages
re--》回收的页面
mf--》非严重错误的页面
pi--》进入页面数(k表示)
po--》出页面数(k表示)
fr--》空余的页面数(k表示)
de--》提前读入的页面中的未命中数
sr--》通过时钟算法扫描的页面
disk 显示每秒的磁盘操作。 s表示scsi盘,0表示盘号
fault 显示每秒的中断数
in--》设备中断
sy--》系统中断
cy--》cpu交换
cpu 表示cpu的使用状态
cs--》用户进程使用的时间
sy--》系统进程使用的时间
id--》cpu空闲的时间
如果 r经常大于 4 ,且id经常少于40,表示cpu的负荷很重。
如果pi,po 长期不等于0,表示内存不足。
如果disk 经常不等于0, 且在 b中的队列 大于3, 表示 io性能不好。
mpstat是MultiProcessor Statistics的缩写,是实时系统监控工具。其报告与CPU的一些统计信息,这些信息存放在/proc/stat文件中。
在多CPUs系统里,其不但能查看所有CPU的平均状况信息,而且能够查看特定CPU的信息。mpstat的语法如下:
1 | [root@elain ~]# mpstat |
%user
在internal时间段里,用户态的CPU时间(%),不包含 nice值为负 进程 (usr/total)100%nice
在internal时间段里,nice值为负进程的CPU时间(%) `(nice/total)100%sys
在internal时间段里,核心时间(%)
(system/total)100%iowait
在internal时间段里,硬盘IO等待时间(%)
(iowait/total)100%irq
在internal时间段里,硬中断时间(%)
(irq/total)100%soft
在internal时间段里,软中断时间(%)
(softirq/total)100%idle
在internal时间段里,CPU除去等待磁盘IO操作外的因为任何原因而空闲的时间闲置时间(%)
(idle/total)100%intr/s
在internal时间段里,每秒CPU接收的中断的次数
intr/total)100`
total_cur=user+system+nice+idle+iowait+irq+softirq
total_pre=pre_user+ pre_system+ pre_nice+ pre_idle+ pre_iowait+ pre_irq+ pre_softirq
user=user_cur – user_pre
total=total_cur-total_pre
其中_cur 表示当前值,_pre表示interval时间前的值。上表中的所有值可取到两位小数点。
实例: 每2秒产生了2个处理器的统计数据报告
下面的命令可以每2秒产生了2个处理器的统计数据报告,一共产生三个interval 的信息,然后再给出这三个interval的平
均信息。默认时,输出是按照CPU 号排序。第一个行给出了从系统引导以来的所有活跃数据。接下来每行对应一个处理器的
活跃状态。。
1 | [root@elain ~]# mpstat -P ALL 2 3 |
该命令是系统维护 的重要工具,主要帮助我们掌握系统资源的使用情况,特别是内存和CPU 的使用情况, 是UNIX系统使用者应该掌握的工具之 一。
sar
1 | -A:所有报告的总和。 |
实例1:每60秒采样一次,连续采样5次,观察CPU的使用情况,并将采样结果以二进制形式存入当前目录下的文件/sar中,需键入如下命令:
1 | [root@elain ~]# sar -u -o sar 60 5 |
在显示内容包括:%usr:
CPU处在用户模式下的时间百分比。%sys:
CPU处在系统模式下的时间百分比。%iowait:
CPU等待输入输出完成时间的百分比。%idle:
CPU空闲时间百分比。
我们应主要注意%wio
和%idle
,%wio
的值过高,表示硬盘存在I/O瓶颈,%idle
值高,表示CPU较空闲,如果%idle值高 但系统响应慢时,有可能是CPU等待分配内存,
此时应加大内存容量。%idle值如果持续低于10,那么系统的CPU处理能力相对较低,表明系统中最需要 解决的资源是CPU。
查看二进制文件sar中的内容,则需键入如下sar命令:
sar -u -f sar
实例2:每30秒采样一次,连续采样5次,观察核心表的状态,需键入如下命令:
1 | [root@elain ~]# sar -v 30 5 |
显示内容表示,核心使用完全正常,三个表没有出现溢出现象,核心参数不需调整,如果出现溢出时,要调整相应的核心参数,将对应的表项数加大。
小提示:
怀疑CPU存在瓶颈,可用sar -u 和sar -q来看,怀疑I/O存在 瓶颈,可用sar -b、sar -u和sar-d来看。
0、用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数”(译注:PHP手册中说echo是语言结构,不是真正的函数,故把函数加上了双引号)。
1、如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍。
2、$row[’id’] 的速度是$row[id]的7倍。
3、echo 比 print 快,并且使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接,比如echo $str1,$str2。
4、在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替。
5、注销那些不用的变量尤其是大数组,以便释放内存。
6、尽量避免使用get,set,__autoload。
7、require_once()代价昂贵。
8、include文件时尽量使用绝对路径,因为它避免了PHP去include_path里查找文件的速度,解析操作系统路径所需的时间会更少。
9、如果你想知道脚本开始执行(译注:即服务器端收到客户端请求)的时刻,使用$_SERVER[‘REQUEST_TIME’]要好于time()。
10、函数代替正则表达式完成相同功能。
11、str_replace函数比preg_replace函数快,但strtr函数的效率是str_replace函数的四倍。
12、如果一个字符串替换函数,可接受数组或字符作为参数,并且参数长度不太长,那么可以考虑额外写一段替换代码,使得每次传递参数是一个字符,而不是只写一行代码接受数组作为查询和替换的参数。
13、使用选择分支语句(译注:即switch case)好于使用多个if,else if语句。
14、用@屏蔽错误消息的做法非常低效,极其低效。
15、打开apache的mod_deflate模块,可以提高网页的浏览速度。 gizp压缩
16、数据库连接当使用完毕时应关掉,不要用长连接。
17、错误消息代价昂贵。
18、在方法中递增局部变量,速度是最快的。几乎与在函数中调用局部变量的速度相当。
19、递增一个全局变量要比递增一个局部变量慢2倍。
20、递增一个对象属性(如:$this->prop++)要比递增一个局部变量慢3倍。
21、递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。
22、仅定义一个局部变量而没在函数中调用它,同样会减慢速度(其程度相当于递增一个局部变量)。PHP大概会检查看是否存在全局变量。
23、方法调用看来与类中定义的方法的数量无关,因为我(在测试方法之前和之后都)添加了10个方法,但性能上没有变化。
24、派生类中的方法运行起来要快于在基类中定义的同样的方法。
25、调用带有一个参数的空函数,其花费的时间相当于执行7至8次的局部变量递增操作。类似的方法调用所花费的时间接近于15次的局部变量递增操作。
26、Apache解析一个PHP脚本的时间要比解析一个静态HTML页面慢2至10倍。尽量多用静态HTML页面,少用脚本。
27、除非脚本可以缓存,否则每次调用时都会重新编译一次。引入一套PHP缓存机制通常可以提升25%至100%的性能,以免除编译开销。
28、尽量做缓存,可使用memcached。memcached是一款高性能的内存对象缓存系统,可用来加速动态Web应用程序,减轻数据库负载。对运算码 (OP code)的缓存很有用,使得脚本不必为每个请求做重新编译。xcache apc eaccelerator
29、当操作字符串并需要检验其长度是否满足某种要求时,你想当然地会使用strlen()函数。此函数执行起来相当快,因为它不做任何计算,只返回在zval 结构(C的内置数据结构,用于存储PHP变量)中存储的已知字符串长度。但是,由于strlen()是函数,多多少少会有些慢,因为函数调用会经过诸多步骤,如字母小写化(译注:指函数名小写化,PHP不区分函数名大小写)、哈希查找,会跟随被调用的函数一起执行。在某些情况下,你可以使用isset() 技巧加速执行你的代码。
(举例如下)
if (strlen($foo) < 5) { echo “Foo is too short”$$ }
(与下面的技巧做比较)
if (!isset($foo{5})) { echo “Foo is too short”$$ }
调用isset()恰巧比strlen()快,因为与后者不同的是,isset()作为一种语言结构,意味着它的执行不需要函数查找和字母小写化。也就是说,实际上在检验字符串长度的顶层代码中你没有花太多开销。
34、当执行变量$i的递增或递减时,$i++会比++$i慢一些。这种差异是PHP特有的,并不适用于其他语言,所以请不要修改你的C或Java代码并指望它们能立即变快,没用的。++$i更快是因为它只需要3条指令(opcodes),$i++则需要4条指令。后置递增实际上会产生一个临时变量,这个临时变量随后被递增。而前置递增直接在原值上递增。这是最优化处理的一种,正如Zend的PHP优化器所作的那样。牢记这个优化处理不失为一个好主意,因为并不是所有的指令优化器都会做同样的优化处理,并且存在大量没有装配指令优化器的互联网服务提供商(ISPs)和服务器。
35、并不是事必面向对象(OOP),面向对象往往开销很大,每个方法和对象调用都会消耗很多内存。
36、并非要用类实现所有的数据结构,数组也很有用。
37、不要把方法细分得过多,仔细想想你真正打算重用的是哪些代码?
38、当你需要时,你总能把代码分解成方法。
39、尽量采用大量的PHP内置函数。
40、如果在代码中存在大量耗时的函数,你可以考虑用C扩展的方式实现它们。
41、评估检验(profile)你的代码。检验器会告诉你,代码的哪些部分消耗了多少时间。Xdebug调试器包含了检验程序,评估检验总体上可以显示出代码的瓶颈。
42、mod_zip可作为Apache模块,用来即时压缩你的数据,并可让数据传输量降低80%。
43、在可以用file_get_contents替代file、fopen、feof、fgets等系列方法的情况下,尽量用file_get_contents,因为他的效率高得多!但是要注意file_get_contents在打开一个URL文件时候的PHP版本问题;
44、尽量的少进行文件操作,虽然PHP的文件操作效率也不低的;
45、优化Select SQL语句,在可能的情况下尽量少的进行Insert、Update操作(在update上,我被恶批过);
46、尽可能的使用PHP内部函数(但是我却为了找个PHP里面不存在的函数,浪费了本可以写出一个自定义函数的时间,经验问题啊!);
47、循环内部不要声明变量,尤其是大变量:对象(这好像不只是PHP里面要注意的问题吧?);
48、多维数组尽量不要循环嵌套赋值;
49、在可以用PHP内部字符串操作函数的情况下,不要用正则表达式;
50、foreach效率更高,尽量用foreach代替while和for循环;
51、用单引号替代双引号引用字符串;
52、“用i+=1代替i=i+1。符合c/c++的习惯,效率还高”;
53、对global变量,应该用完就unset()掉;
提问
我循环用file_get_contents抓取一堆url,但总是会在不到第100个URL的时候停下,提示我:“Warning: file_get_contents(URL) [function.file-get-
contents]: failed to open stream: HTTP request failed! HTTP/1.0 500 Read timed out
in D:\website\extra.php on line 65”
我在程序的开始已经有set_time_limit(0);了啊,那上面的错误会是因为什么呢?
回答
set_time_limit只是设置你的PHP程序的超时时间,而不是file_get_contents函数读取URL的超时时间。
从警告信息来看,是被抓取的网页出现了服务器500错误,可能是他的程序出现超时了。
如果想改变file_get_contents的超时时间,可以用resource $context的timeout参数:
$opts = array(
‘http’=>array(
‘method’=>”GET”,
‘timeout’=>60,
)
);
$context = stream_context_create($opts);
$html =file_get_contents(‘http://www.example.com', false, $context);
fpassthru($fp);
参考资料:http://cn.php.net/manual/en/context.http.php
这样readfile函数的超时时间就设置成了10秒,如果你够细心的话,还会发现数组中还有一些其他的配置,第一维中的http是指定使用的网络协议,二维中的method批的是http的请求方法get,post,head等,timeout就是超时时间了。我想很多人会使用php内置的file_get_contents函数来下载网页,因为这个函数使用起来够简单。很多人也都很简单的使用它,只要传递一个链接它就可以自动的发送get请求,并将网页内容下载下来。如果比较复杂的情况,比如使用POST请求,使用代理下载,定义User-Agent等等,这时很多人就会认为这个函数做不了这样的事情,就会选择其他方式,如curl,来实现。实际上,这些事情file_get_contents也可以做到,
就是通过它的第三个参数,设置http请求的context。
支持的设置和使用方式见官方说明:http://www.php.net/manual/en/context.http.php
附:目前我知道的支持context参数的php内置函数有file_get_contents,file_put_contents,readfile,file,fopen,copy(估计这一类的函数都支持吧,待确认)。
function Post($url, $post = null)
{
$context = array();
if (is_array($post))
{
ksort($post);
$context[‘http’] = array
(
‘timeout’=>60,
‘method’ => ‘POST’,
‘content’ => http_build_query($post, ‘’, ‘&’),
);
}
return file_get_contents($url, false, stream_context_create($context));
}
$data = array
(
‘name’ => ‘test’,
‘email’ => 'test@gmail.com‘,
‘submit’ => ‘submit’,
);
echo Post(‘http://www.yifu.info', $data);
OK , 上面函数完美了,既解决了超时控制又解决了Post传值。再配合康盛的改良版RC4加密解密算法,做一个安全性很高的webservice就简单多了。