PHP 中 echo 与 print的区别

1. echo 可以使用逗号分隔连续输出多个字符串,如:
   echo ‘aaa’, ‘bbb’, ‘ccc’;
   // print ‘aaa’, ‘bbb’, ‘ccc’; 是错误的

2. echo 没有返回值,print有返回值,如:
   echo echo ‘aaa’;  // 语法错误
   echo print ‘aaa’; // 打印出 1

3. print可以以函数的形式使用,echo不可以,如:
   print(‘aaa’); // 可以, 注意:不能多个参数
   echo (‘aaa’); // 不可以,语法错误

4. echo 不是函数,是语法结构; print虽然能用函数形式使用,也有返回值,但是print也不是函数, 如:
   echo function_exists(‘echo’); // 返回false
   echo function_exists(‘print’); // 返回false

PEAR和PECL

PEAR (PHP Extension and Application  Repository)PHP扩展与应用程序库。

PEAR是“一个可重用PHP组件的框架和发布系统”。PEAR可以下载、安装、升级及删除PHP脚本。 使用PEAR包的时候,不必为了脚本的位置或者怎么找到它们而担心,扩展命令行接口(CLI)也很容易使用。
PEAR是一个由社区推动的PHP项目,官方发布的PHP中就包含了PEAR。

PECL (PHP 扩展库)的全称是 The PHP Extension Community Library ,是一个开放的并通过PEAR打包格式来打包安装的PHP 扩展库仓库。通过PEAR 的Package Manager可以对 PECL 模块进行下载和安装。

PEAR和PECL的区别:

Pear:是PHP的扩展代码包,所有的扩展均以PHP代码的形式出现,功能强大,安装简单,甚至可以改改就用。使用的时候,要在代码中进行Include才能够使用。

Pecl:是PHP的标准扩展,可以补充实际开发中所需的功能,所有的扩展都需要安装,在Windows下面以Dll的形式出现,在linux下面,需要单独进行编译,它的表现形式为根据PHP官方的标准用C语言写成,尽管源码开放但是一般人无法随意更改源码。

最直接的表述:Pear是PHP的上层扩展,Pecl是PHP的底层扩展。

在linux上,pear下载的包是直接放在目录 /usr/local/lib/php 下的; 而 pecl下载的包需要编译然后放到目录 /usr/local/lib/php/extensions/no-debug-non-zts-yyyymmdd/ 目录下。 pear下载的包需要 include后使用, pecl安装的包需要修改php.ini,添加extension=xxx.so才能使用。

上面提到pecl是使用pear的打包格式来打包的,其实pecl和pear是两个shell脚本,执行的基本是同一个PHP文件,pecl走的是pear的发布模式。

pear的频道信息保存在目录 /usr/local/lib/php/.channels/中;下载后的模块或包的信息保存在/usr/local/lib/php/.registry/目录中, 数据信息都是已PHP数组的序列化的方式来存储的,这样保存和查询都很方便

linux-利用sar进行性能监控

转自: http://www.51testing.com/?uid-130600-action-viewspace-itemid-220288

为了监控服务器性能
写了个shell脚本,监控服务器的:CPU、MEM、磁盘IO、负载四个指标
记录下来,以备不时之需

sar安装方法:
yum install sysstat

脚本内容如下:

#!/bin/bash
if (( $# != 2))
then
    echo "usage:num1-Please enter the number of script. execution"
    echo "usage:num2-Please enter a value for rest time"
    exit 1
fi

sar -d 0 | head -3 | tail -1 > dev8-0.log
sar -u 0 | head -3 | tail -1 > cpu.log
sar -r 0 | head -3 | tail -1 > mem.log
echo "" > loadAverage.log
for ((i=1;i<=$1;i++))
do
    sar -d 1 | grep dev8-0 | grep -v Average >> dev8-0.log
    sar -u 1 | head -4 | tail -1 >> cpu.log
    sar -r 1 | head -4 | tail -1 >> mem.log
    monitorDate=date +'%F %T'
    load=w | grep 'load average' | awk -F ',' {'print $4,$5,$6'}
    echo $monitorDate $load >> loadAverage.log
    sleep $2
done

脚本使用方法:
chmod +x monitor.sh(脚本名)
./monitor.sh 5 1
每1秒记录监控数据一次,共记录5次
注:每次运行脚本时,会把上一次的日志清空;

脚本内容解释:
sar -d 1:打印磁盘IO信息,采样间隔1秒
sar -u 1:打印CPU信息,采样间隔1秒
sar -r 1:打印MEM信息,采样间隔1秒
然后再利用一些grep/head/tail/awk等命令取得想要的部份信息;
(使用过程中发现,采样间隔使用0秒时,会出现打印出来的CPU和磁盘IO信息全一样,MEM会有所不同。。。)

脚本运行结果:
./monitor.sh 5 1
运行后,当前目录下会生成下面几个日志文件:

# cat cpu.log
02:21:24 PM       CPU     %user     %nice   %system   %iowait    %steal     %idle
02:21:24 PM       all      0.89      0.05      1.29      0.23      0.00     97.54
02:21:25 PM       all      0.89      0.05      1.29      0.23      0.00     97.54
02:21:26 PM       all      0.89      0.05      1.29      0.23      0.00     97.54
02:21:27 PM       all      0.89      0.05      1.29      0.23      0.00     97.54
02:21:28 PM       all      0.89      0.05      1.29      0.23      0.00     97.54
%user 在用户模式中运行进程所花的时间
%nice 运行正常进程所花的时间
%system 在内核模式(系统)中运行进程所花的时间
%iowait 没有进程在该CPU上执行时,处理器等待I/O完成的时间
%idle 没有进程在该CPU上执行的时间

#cat mem.log
02:21:24 PM kbmemfree kbmemused  %memused kbbuffers  kbcached kbswpfree kbswpused  %swpused  kbswpcad
02:21:24 PM   2884304   1267572     30.53    335216    795552   2048248         0      0.00         0
02:21:25 PM   2884428   1267448     30.53    335216    795552   2048248         0      0.00         0
02:21:26 PM   2884428   1267448     30.53    335216    795552   2048248         0      0.00         0
02:21:27 PM   2884428   1267448     30.53    335216    795552   2048248         0      0.00         0
02:21:28 PM   2884552   1267324     30.52    335216    795552   2048248         0      0.00         0
kbmemfree 空闲内存大小
kbmemused 内存使用量大小
%memused 内存使用量百分比
kbbuffers 内存buffers大小
kbcached 内存cached大小
kbswpfree 空闲swap大小
kbswpused swap使用量大小
%swpused swap使用量百分比

# cat dev8-0.log
02:21:24 PM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
02:21:24 PM    dev8-0      0.92      0.22     27.83     30.47      0.02     19.40      6.18      0.57
02:21:25 PM    dev8-0      0.92      0.22     27.83     30.47      0.02     19.40      6.18      0.57
02:21:26 PM    dev8-0      0.92      0.22     27.83     30.47      0.02     19.40      6.18      0.57
02:21:27 PM    dev8-0      0.92      0.22     27.83     30.47      0.02     19.40      6.18      0.57
02:21:28 PM    dev8-0      0.92      0.22     27.83     30.47      0.02     19.40      6.18      0.57
DEV  sar命令正在监视的块设备的名字。
tps  每秒传输数(或者每秒IO数)
rd_sec/s 每秒512字节读取数
wr_sec/s 每秒512字节写入数
%util  设备饱和度时,会发生此值接近100%。

# cat loadAverage.log

2010-09-16 14:21:24 load average: 0.14 0.14 0.15
2010-09-16 14:21:25 load average: 0.61 0.23 0.18
2010-09-16 14:21:26 load average: 0.61 0.23 0.18
2010-09-16 14:21:27 load average: 0.61 0.23 0.18
2010-09-16 14:21:28 load average: 0.61 0.23 0.18

Linux下查看与使用ISO文件

Linux下iso镜像文件可以直接用mount命令挂载到某个目录下,然后进行浏览操作,不需要专门的虚拟软件。

假设你的iso文件保存在 /data5/CentOS-5.6-i386-LiveCD.iso
  
1.创建一个目录作为挂载点(这个目录的位置随意,也可以直接使用根目录下的/mnt目录,这里我用/home/daniel/mnt为例)
$mkdir /home/junjie2/iso

2. 挂载iso文件
$sudo mount -o loop /data5/CentOS-5.6-i386-LiveCD.iso /home/junjie2/iso

3. 现在iso镜像里的文件都挂载到了/home/junjie2/iso目录下了,你到这个目录下看看就知道了
$ls
/home/junjie2/iso

linux中为何没有网卡设备文件

这个问题其实没有什么意思,知道了问题的答案能表明一个人技术水平有多高吗?不能!这个问题有答案以及有意义吗?答案都是没有!那我还为何一直对这 个问题死死揪住不放?这类问题可以提高一个人的素质以及了解一段关于网络和unix的历史,正是因为这些都很有趣,才如此值得关注。

在 unix中,一切io相关的实体都被抽象成了文件,之所以抽象成文件第一是为了接口统一,第二是为了操作统一,第三是为了策略隐藏,比如这样可以向用户屏 蔽掉具体设备的细节或者具体文件系统的细节,文件抽象有块抽象和字符抽象,对于块文件,你只需要知道它可以随机读写就可以完成大部分的工作而不用关注底层 具体的文件系统,比如ext3,ntfs,jfs之类,对于字符设备文件,你只需要知道他们是串行读写就可以了,而不必关心鼠标的电路安排,打印机的内部 机制等等,但是对于网卡,我们看看它是字符设备还是块设备。如果它是块设备,那么它能随机读写吗?看看网卡的特性,它的另一端是另一个世界,它更像是一个 管道,它更像是一个字符设备,因为对一个管道进行随机读写是没有意义的,那么它是一个字符设备吗?要知道网络协议多种多样,计算机仅仅负责按照协议加工数 据而不对协议本身做任何限制,因此如果将网卡作为字符设备,那么为了支持众多协议以及为了在传输之前绑定一个协议,就必须频繁调用ioctl之类的系统调 用,这样用户就必须知道网卡这个设备的更多的细节,否则用户怎么去ioctl这块网卡,这显然违背了unix文件抽象的初衷,另外怎么去同步这个设备,比 如多个进程同时需要打开这个设备传输网络数据,怎么能保证它们可以用最高的效率复用这个网卡,这个同步工作应该由谁来做,系统还是用户,如果由系统来做, 传统的文件同步接口将在网卡设备文件失效,如果由用户来完成,那么用户必须对网卡像驱动工程师一样熟悉,一个用户弄坏网卡的一个寄存器就会导致整个网卡 down掉…第三,如何支持网络协议,难道让用户自己进行协议封装然后write到网卡吗?协议栈在这种情况下必须在用户空间实现,如此一来,效率和 健壮性呢?安全性呢?协议栈显然受不到操作系统的内核空间特权级别的保护待遇,这违背了安全原则。综上,网卡不能被抽象成设备文件,因为将之抽象之后得不 到任何好处。

bsd套接字解决上文件抽象问题,为了使用文件接口,bsd套接字仍然使用文件接口,下层直接和内核空间的协议栈接口,所 有的同步以及协议规程都在协议栈完成,设备复用由协议栈和设备驱动共同完成,这个bsd套接字抽象简直就是一件艺术品,人们又回到了一切皆文件的美丽又和 谐的世界,bsd套接字通过一个新的系统调用socket来代替open从而可以实现诸如协议绑定之类的和open语义不相关的操作,另外connect 和accept也实现了自己的语义。当初为何不将网络设备作为文件抽象呢?实际上有一个本质的原因,那就是unix根本就不把网络通信作为IO,而是作为 IPC,实际上unix从一开始就将网络当成了计算机,否则它也不会将网络通信作为IPC,进程间通信可以在同一台机器,也可以在不同的机器,实际上机器 并不是界限。unix将网络通信当成了像共享内存,信号量之类的IPC机制了,只不过后者是同一台机器内部的机制,不需要硬件,而网络通过需要硬件实现, 硬件就是网卡之类的设备,unix仅仅将网络设别作为了实现IPC的手段罢了。

转自: http://blog.csdn.net/dog250/archive/2010/02/09/5303699.aspx

一个关于foxmail不能收取yahoo邮件的问题

我的foxmail有一个月不能收取yahoo邮件了,一直很忙,也没查是为什么,只以为是yahoo的问题。
今天抓包一下,发现欲连接的IP是: 192.168.100.210; 感觉奇怪; 更奇怪的是这个IP不是dns解析出来的,我更没有设置host,yahoo的pop3主机域名地址为: pop.mail.yahoo.com.cn ,dns解析为:
——————————————
>nslookup pop.mail.yahoo.com.cn
DNS request timed out.
    timeout was 2 seconds.
服务器:  UnKnown
Address:  219.239.26.42

非权威应答:
名称:    pop1.mail.vip.cnb.yahoo.com
Address:  203.209.228.241
——————————————-
当我设置host:
203.209.228.241        pop.mail.yahoo.com.cn

foxmail依然连接地址: 192.168.100.210

解决办法: 直接将yahoo的pop3地址设置为: 203.209.228.241  ; all is OK

==========================
至于foxmail错误地解析了域名地址,大概是曾经的一次意外的错误的解析被foxmail 给cache了吧? 但是我没有找见相应的设置,不去管它了, 没有意义

另外: 在写本文之前,我不能访问我的blog: http://phpor.net/
当我得知我同学可以访问时,我重新拨号,然后就好了; 呃…,好了就好了吧
Aliases:  pop.mail.yahoo.com.cn

关于ttulmgr命令的几点说明

ttulmgr

The command ttulmgr' is the utility to export and import the update log.  It is useful to filter the update log with such text utilities as grep‘ and sed'.  This command is used in the following format.  upath‘ specifies the update log directory.

ttulmgr export [-ts num] [-sid num] upath
Export the update log as TSV text data to the standard output.
ttulmgr import upath
Import TSV text data from the standard input to the update log.

Options feature the following.

  • -ts num : specify the beginning time stamp.
  • -sid num : specify the self server ID.

This command returns 0 on success, another on failure.

 

注意

1. 指定 sid 的作用不是说只查看sid产生的日志,而是说不要查看sid产生的日志,源码(ttulmgr.c,procexport函数)中是这么写的:  

2. 通过上图的189行可以知道,输出只能是16进制的个数,不能是ascii码的

3. 输入格式说明:

   1306566730093092        3101:3101       put     C8 10 00 00 00 43 00 00 00 4E 54

   其中:

      1306566730093092 是微妙级时间戳

      3101:3101 分别是 sid:mid   即: serverid ,masterid; 如果masterid没有,则为0

      put: 是指令的文本描述

      c8…: 这些就是指令参数的16进制表示了