2011年4月29日星期五

FreeBSD下如何使用mutt连接gmail

我把这个帖子重新修改了一下,增加了一部分关于SSL协议的内容,然后把最新版本的写到freebsdchina的wiki上去了。

当前地址如下:


http://wiki.freebsdchina.org/doc/m/mutt_gmail_usage

--------------------------------------------------------------------------------------------------------------------------------------------

写在前面:

引用:
版权:gpl

首发linuxsir,转载注明出处以及作者,

常用id:fender/fender010/fender0107401
兄弟们,

我搞定了mutt+fetchmail+msmtp+procmail+vim+gnupg+gmail, 

以前虽然弄过一次,但是没有弄彻底,前几天升级evolution时实在是忍受不了了,编译的时间实在是长啊,碰上网络不好,再下载不到源代码就更痛苦了, 

mutt这个东西相当的好用,evolution和mutt相比的话,感觉就像是gedit和vim/gvim相比,并且evolution在FreeBSD上面启动有点慢,总之mutt是相当的爽! 

gmail是个好东西,但是总是登录网页就有点不爽了,用evolution的话实在是编译不起啊,所以应该mutt+gmail才好,

现在把过程写下来,和大家分享一下,喜欢的照猫画虎即可,但也不要只是看,有什么意见一定要提出来, 

这个是在FreeBSD上的配置过程,debian、gentoo也基本上大致如此,也就是包的名字稍微有点差异,

首先要明确几个概念:

引用:
fetchmail用来收邮件,

procmail用来在你自己的机器上分拣邮件,你可以指定那个邮件列表的投递到什么邮箱里面去,

msmtp这个用来发送邮件,

gnupg用来发邮件的时候进行数字签名或者是验证别人的电子签名,当然还能加密电子邮件,反正就是和安全有关的东西了,

mutt负责把这些东西组合起来,

vim自然是用来写邮件了,

freebsd里面配置过程如下:


1.安装openssl(没有这个你就不能执行c_rehash命令,我在FreeBSD里面whereis openssl发现基本系统里面有一个openssl命令,但是还是需要安装ports tree里面的openssl),安装mutt,安装gnupg,安装fetchmail,

这些都没有什么好说的,需要注意的是freebsd里面安装gnupg以后还需要安装pinentry-curses、pinentry-gtk、 pinentry-gtk2、pinentry-qt中的一个,只有这样才能正常使用gnupg,

fetchmail编译时需要加入openssl的支持,但是FreeBSD里面好像是默认就有了,

如果你是使用debian的话,那么维护fetchmail的dd估计已经加上了,如果使用gentoo的话,估计需要你自己加上,因为gentoo的定制行很强,估计开发者不会给你加上,不确认是不是加入了的话ldd命令可以帮你确认一下,


2.认证部分比较复杂,看仔细了,注意我也没有太弄明白,因为不懂ssl到底是怎么回事,谁明白最好说一下:


想彻底搞清楚的,看最后我给出的那个链接,

想简单的这样即可:
引用:
cd mail/.certs/
touch Thawte_Premium_Server_CA.pem
把下述内容复制进去
引用:
-----BEGIN CERTIFICATE-----
MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT
DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs
dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE
AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl
ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT
AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU
VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2
aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ
cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2
aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh
Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/
qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm
SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf
8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t
UCemDaYj+bvLpgcUQg==
-----END CERTIFICATE-----
touch Equifax_Secure_CA.pem
把下述内容复制进去
引用:
-----BEGIN CERTIFICATE-----
MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE
ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT
B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB
nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR
fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW
8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG
A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE
CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG
A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS
spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB
Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961
zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB
BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95
70+sB3c4
-----END CERTIFICATE-----
然后执行
引用:
c_rehash mail/.certs
认证部分就完成了。

3.安装msmtp,

这个也需要ssl支持,但是FrreeBSD的port maintainer没有把这个编译选项加进去,那就让我们来看看Makefile的内容,用vim打开以后搜索一下ssl,发现下述内容:
引用:
26 .if defined(WITH_GNUTLS)
27 LIB_DEPENDS+= gnutls.26:${PORTSDIR}/security/gnutls
28 CONFIGURE_ARGS+= --with-ssl=gnutls
29 .elif defined(WITH_OPENSSL)
30 USE_OPENSSL= yes
31 CONFIGURE_ARGS+= --with-ssl=openssl
32 .else
33 CONFIGURE_ARGS+= --without-ssl
34 .endif
所以,安装的时候应该这样:
引用:
make WITH_OPENSSL=yes configure
然后注意看最后的输出,你应该看到tls/ssl后面的内容了吧,注意没有这个发不出去邮件啊,
引用:
Install prefix ......... : /usr/local
TLS/SSL support ........ : yes (Library: OpenSSL)
GNU SASL support ....... : no
GNU Libidn support ..... : yes
NLS support ............ : yes
GNOME Keyring support .. : no
MacOS X Keychain support : no
配置msmtp,让msmtp能发送邮件到gmail的服务器上:

cat .msmtprc

引用:
account default

host smtp.gmail.com

port 587

from user_name@gmail.com

tls on

tls_starttls on

tls_trust_file /home/fender/mail/.certs/Thawte_Premium_Server_CA.pem

auth on

user user_name

password 123456

logfile /home/fender/mail/.msmtp.log
4.配置fetchmail,让fetchmail能从gmail的服务器上取回邮件:
cat .fetchmailrc

引用:
poll pop.gmail.com

port 995

proto POP3

user 'user_name@gmail.com'

password '123456'

# mda "/usr/local/bin/procmail -d %T"

options

no keep

ssl

sslcertck

sslcertpath /home/fender/mail/.certs/
5.配置procmail来把fetchmail取回来的电子邮件分拣到不同的本地邮箱:

cat .procmailrc

引用:
################################################################################
PATH=$HOME/bin:/usr/bin:/usr/local/bin:

MAILDIR=$HOME/mail

LOGFILE=$MAILDIR/.procmaillog

################################################################################
# FreeBSD mailing list:
:0
* ^List-Id:.*freebsd-announce
1_freebsd-announce

:0
* ^List-Id:.*freebsd-security-notifications
1_freebsd-security-notifications

:0
* ^List-Id:.*freebsd-amd64
1_freebsd-amd64

:0
* ^List-Id:.*freebsd-doc
1_freebsd-doc

:0
* ^List-Id:.*freebsd-gnome
1_freebsd-gnome

:0
* ^List-Id:.*freebsd-performance
1_freebsd-performance

:0
* ^List-Id:.*freebsd-security
1_freebsd-security

:0
* ^List-Id:.*cnproj-cvs
1_cnproj-cvs

:0
* ^List-Id:.*cnproj-submit
1_cnproj-submit

################################################################################
# Gnu Octave mailing list:

:0
* ^List-Id:.*bug-octave
2_bug-octave
:0
* ^List-Id:.*help-octave
2_help-octave
:0
* ^List-Id:.*octave-maintainers
2_octave-maintainers

################################################################################
:0
* .*
3_default

################################################################################
6.配置mutt,让mutt能调用fetchimal+procmail和msmtp来接受和发送邮件,当然还要让mutt调用vim和gnupg:
引用:
cat .muttrc
################################################################################
# Personal information
set hostname=PC-686.Workstation

set realname=Li

my_hdr From:user_name@gmail.com

################################################################################
# sendmail
set sendmail="/usr/local/bin/msmtp" # 发电子邮件全靠这个了!

################################################################################
# fetchmail and procmail
macro index G "!fetchmail -a -m 'procmail -d %T'\r" # 收电子邮件并且分发的格格邮箱全靠这个!

################################################################################
# GnuPG
source /home/fender/.mutt/gpg.rc # 想使用gnupg的话,/usr/local/share/examples/mutt/下面cp这个文件就好了,然后放到一个地方source一下,直接source也可以,但是我喜欢集中我的配置文件,

################################################################################
# Signature
set signature="/home/fender/.mutt/signature" # 发邮件时的个性签名位置,

################################################################################
# Folders
source /$HOME/.mutt/folder

################################################################################
# Aliases
set alias_file = /$HOME/.mutt/aliases

source /$HOME/.mutt/aliases # 电子邮件通讯录,

################################################################################
# Color
source /$HOME/.mutt/color

################################################################################
# Mailing list
source /$HOME/.mutt/subscription # 我定的邮件列表,

################################################################################
# Mailboxes
source /$HOME/.mutt/mailboxes # 让mutt监视的电子邮箱,有新邮件好报告我,截图里面显示N的就是有新邮件的,

################################################################################
# Header
source /$HOME/.mutt/header # 定制如何显示邮件头

################################################################################

set editor="vim" # 我可爱的vim编辑器,写啥都很爽,其实我这个帖子就是再gvim里面写的,

set sort=threads # 指定一个排列邮件的方法,看邮件列表的时候很有用

set pager_stop

set fast_reply

set pager_index_lines=10

set index_format="| %4C | %Z | %{%b %d} | %-15.15L | %s" # 定制一下index的显示方式,

set folder_format="| %2C | %t %N | %8s | %d | %f" # 定制一下邮箱的显示方式,一定要有%N,否则没法知道哪个有新邮件,

################################################################################

注意事项:


1.打开防火墙的相应端口,否则白忙活了,我现在用freebsd的ipfw,规则如下:
引用:
$cmd 00700 allow tcp from any to any 587 out via $nic setup $ks
$cmd 00800 allow tcp from any to any 995 out via $nic setup $ks
其他防火墙,自己写相应规则。

2.mutt的配置可以参考:http://www.davep.org/mutt/muttrc/

3.我是在自己的home下面建了一个mail,用这个目录来专门放电子邮件,mutt的配置文件是.muttrc,还有一些source了.mutt/下面的一些东西,
引用:
cd mail ; ls
1_cnproj-cvs 1_freebsd-security-notifications
1_cnproj-submit 2_bug-octave
1_freebsd-amd64 2_help-octave
1_freebsd-announce 2_octave-maintainers
1_freebsd-doc 3_default
1_freebsd-gnome 3_postponed
1_freebsd-performance 3_sent
1_freebsd-security
引用:
cd .mutt ; ls
aliases folder header signature
color gpg.rc mailboxes subscription
这些需要根据自己的个人情况调整一下,

4.写好邮件需要发送了,如果想使用gnupg的,就按一下p就可以了,

5.我上面的内容里面,gmail的帐号用user_name代替了,密码用123456代替了,你们换自己的就可以了,

6.不要关掉sendmail,系统还需要这个东西再内部发送邮件,

7.还没有想好,总之要随机应变吧,根据自己情况做出一些调整。

mutt可以使用imap协议来链接gmail,但是我用了一下,感觉还是下载到本地好点,有兴趣的可以看看。

主要参考资料:http://www.andrews-corner.org/mutt.html#download

2011年4月28日星期四

白领实用装逼手册

1、英文名字不管你本来长得多么土气,但一定要有一个像样的英文名,起码也得是Anglelina、Mike这样的名字;
2、看电影知道《拉拉肚孙子记》的白领电影,如果连这样的电影也看不懂,看了之后抓紧看电影评论,显得和《读者》一样深刻;
3、单身无论有多少性伙伴,都得装单身;无论得了多少次性病,都要装清纯;
4、手机手机得时尚,男的用诺基亚,女的用索爱,也可以用黑莓,可以收邮件,随时要上火星出差的架势,还要有蓝牙,传A片也可以不被边缘化;
5、口音如果不幸和我一样有一口很土的巴中话,赶快改掉,用当地口音,当地口音太难就用北平音,实在强悍就用港台国语;
6、居住地如果不幸住在北京的唐家岭,成都的五大花园这样的地方的话一定要隐瞒,一定要做神秘状,住在双流说住在玉林,住在黄田坝说住在西南财大;
7、会一点英语经常说:Can i fuck you? Do you fuck me?这样的英语;
8、拍照到了好一点的地方赶快照相,做轻松华丽可爱漫不经心状,体现你低调的高贵;
9、会Word电脑水平不需要太高,会Word就可以,会解压缩就是高手了。工作多年之后应该会Excel;
10、用MSN最好不用QQ,回家后联系一夜情可以用QQ,工作一定要用msn,专业!msn签名最好是细节决定成败,执行力第一之类的屁话,给领导看的,让他老人家放心;
11、QQ空间万一有QQ,空间里面不能放异性照片,如果爸爸帅就放爸爸的,爸爸拿不出手就放侄儿侄女什么的,反正什么有爱心放什么;
12、衣服男的一定要西装笔挺,头发像吃了伟哥一样翘着,女人的裙子一定要紧紧包着屁股和胸部,让领导意淫又不敢上为佳;
13、想MBA一样做小领导如果有幸做经理什么的东西,要折腾你下面几个人,让他们预算、报告、总结、工作流程、团队、狼性、执行力…什么恶心弄什么,总之,像MBA一样。
14、转弯在公司走路转弯一定要专业,背不弯,不东张西望,要干净利索,主要是体现饱满的精神和专业;
15、爱好爱好羽毛球,混帐。尽量知道酒吧在哪个地方,千万不要土气,要和蓝领们拉开距离。
————————————————————————————————-
电梯篇
1、经过大堂跨国大门到电梯口一段路程特别重要,这段路往往比较空旷,要尽量显得闲庭信步和优雅,不宜采用奔跑等姿势;一些白领是从公交车上连滚带爬出来的,但步入大堂的一瞬间应该将公交模式切换成白领模式;
2、批评如果在电梯里面发现清洁工或者送盒饭的人,要略略显得讨厌和不耐烦。个别刚晋升小经理白领可以顺便批评他们几句,比如:你们为什么不走货梯?
3、食物能够在电梯中出现的食物可能只有星巴克等,再差也得是肯德基这些。新疆烤馍、臭豆腐这些传统文化还是回到唐家岭再品味;
4、话题电梯里面一般不方便说话。但一起进去的熟人多,电梯里面陌生人少的话不妨谈笑自若。话题尽量国际化,比如Sisi,你哪个offer到了没有?还没有啊,有12个小时的时差,注意配合表情做便秘状;
5、和领导一起和领导一起要显得很不怕死的样子,比如用身体挡电梯门等举动是很悲壮而有效的;
6、送人把人送到电梯里面的时候,不要急于收住笑容,因为电梯门关闭还有大约3秒的时间,需要一直保持专业的笑容;
7、手机电梯里面也可以打电话是广大白领的福音。接电话的时候要做日理万机状,声音要用假音,就是那种白领特有的比普通人高几度的假音;
8、转身从电梯出门的转身是重点,电梯里面还有很多白领看着呢,男白领可以做昂首挺胸接电话状,女白领要注意急于弯腰看地面或者鞋,否则一B失败,全B皆输。需要挺胸提臀,优雅一转,足以让其余白领意淫万千;
9、众多白领众白领一起出电梯可以采用战斗机的编队,领导最前面居中,第二排是左青龙右白虎保护,后面簇拥王朝马汉张龙赵虎什么的。领导可以一边走一边指点江山,需要配合手势,毛主席那种;
10、有车有车的白领下电梯一定要表现出来,可以通过交谈:昨天我开到公司用了1个小时!小小的开字就和其他人拉开距离。也可以说:我的车停在负100楼的,你的呢?,其他白领一定投来敬畏的眼神;
11、衣服冬天中午上电梯要穿薄一点,女白领做楚楚动人状,一显得身材好,二可以说明:我是坐在空调房中脑力劳动者;
12、资料袋资料袋尽量要专业,美特斯邦威的衣服口袋万万不可,最好口袋上写着类似美利坚合众国大使馆的字眼,为了方便其他人看见,女白领可以把资料袋抱在胸部附近的位置;
13、按键如果站在电梯按键旁,有蓝领样子的工人紧张的手忙脚乱嘴里嘀咕的找楼层位置,要气定神闲的帮他准确有力的操作。让对方看着你感谢不已,此时不要回看对方,要依然很优雅专业的站着一动不动保持距离。
————————————————————————————————-
小经理篇
1、学历 学历最好是MBA什么的,不需要去上课的那种。如果说是川大MBA,一定要了解清楚川大大门附近厕所的位置,显得很熟悉母校,以防露馅;
2、身世 身世最好比较诡异,爷爷不是落魄的资本家就是受迫害的知识分子,目的是产生一种没落贵族的凄凉感;
3、话说当年 要淡淡的说出当年曾经放弃到某银河系超级集团做副总的机会什么的;
4、会做PPT 作为经理,应该在word和excel之外苦练PowerPoint,让文字图片飞来飞去,飞得越复杂越专业;
5、会点心理学 要像半仙一样推断下属小时候鸡鸡被人玩过,妈妈喂奶姿势让自己产生不安全之类的,说这话的时候要严肃;
6、随时做便秘状 要苦练便秘状,就是朱军、白岩松那种表情。装逼就是装便秘,那种欲拉不能的表情有一种神奇的魔力,可以让上下都对你刮目相看;
7、英语 可以试着把安排叫schedule ,把团队叫team,显得很ABC那样,更绝的可以假装不习惯用中文表达,比如说请不要和我……argue!;
8、音乐和舞蹈 会放点《飞得更高》、《感恩的心》这样的音乐,音乐一响起,立即做感慨万千的样子;有些小经理会一点手语舞,很传销的那种,会为自己的职业生涯增色不少;
9、房子 作为领导,一定要有房子,没有房子绝对会让人看不起,所以一定要千方百计把父母、爷爷的养老金拿出来给开发商;
10、车子 尽量有车,没有车一定要会驾驶,不会驾驶要不会赶公交车的样子。并且千万要藏好公交卡;
11、知道花边新闻 知道X公司老总实际上是同性恋,Y公司是老板娘说了算会为自己赢得更多下属的尊重;
12、爱好开会 开会必备的,日会,周会,月会…开会时做地球灭亡状的严肃,还要把下面的人分成主管、一般人员,让他们相互嫉妒,相互说坏话;
13、奋笔疾书 要有一个质量好的笔记本,随时做奋笔疾书状,写着写着突然眉头紧锁的看着说话的人,伴随轻轻点头;
14、叫Boss 叫Boss的小经理多少就很洋派了,这样一叫,下面的人就会暗地叫自己Boss,小小的称呼改变,公司一瞬间就变成外企了;
15、走路 走路要带风,很尿频尿急的样子,一旦走路带风配合尿急,其他人就会说你有气质、杀气、气场;
16、关门小便(男) 小便要关门,有些不安分的下属会在小便池偷看领导的小鸡鸡;
17、爱上招聘 面试是一件很美妙的事情,可以折磨上顿不接下顿的面试者,可以肆意问神经质的问题。让过五关斩六将的新人接着参加新人培训,继续折磨他们,人世间最快感的事情莫过于消磨别人的的尊严;
18、星巴克 当上小经理要尽快熟悉星巴克,也要苦练星巴克各种咖啡的名字和发音,平时也要注意收集优惠券。在星巴克看外国人比较方便,这样可以较低成本的实现Internation和Globalization;
19、随时要发票 不管能不能报销,都要随时要发票,带着很护税光荣的爱国心和有人报销的优越感;
20、知道五星酒店的位置 说到酒店,不能不知道,最好天天住酒店的样子。不过肯定没住过几回,所以要了解位置,周末参加一些理财**会、留学**讲座,可以熟悉地形,还有免费水果。不要害怕坐在一起的人是富人会不好意思,其实他们大部分也是去装逼的。
21、爱好 不要爱好可乐、冰红茶这样肤浅的液体,至少要喜欢红茶、咖啡、龙井。一边品尝,一边带着坏坏的、樯橹灰飞烟灭的微笑。装逼至此,世界和平、解放台湾指日可待。

2011年4月27日星期三

男孩没女朋友的原因

1
伊是隔壁班的美女。上大课的时候要到的手机号(我手机好像解不了电话了,
帮忙打下看看)某次约出来了,晚秋,夜晚,小树林边。美女说:我冷。俺说:咱一起跑跑,
跑跑就暖和了。
然后,就没有然后了……
2
hand…
某女当年约会俺,悄悄和我说:谁谁谁都以为我们是男女朋友呢,真过份。我说:是啊
,咱身正不怕影子歪,让他们说去。
然后,就没有然后了……

3
当年某mm给我打电话,哭着说:我现在的男朋友说咱俩其实最合适
我安慰她说:别听他的,他胡说八道….
然后,她把电话挂了
4
嗯。。。。n年前的某天约了我刚表白没几天的mm一起出去吃夜宵,吃完夜宵又在校园里
闲逛,然后送出了俺的first kiss。。。。一直逛到十一点多。。按照时间她们宿舍楼
应该已经锁门了。。。在快到她们楼的时候她突然说,要是锁门了今天就不回去了(注
意,不是回不去了),可是我听了这句话之后的第一反应时屁颠屁颠的跑到她们门口拉
了一下门,门开了。。。然后我很happy的说,没还没锁!!!!!!!!!!!
然后。。。然后没多久就没有然后了。。。这个mm是我最最最喜欢的一个。。。。sigh
5
哎,当年有个mm请我在她们班舞会时做她的舞伴,我说“我还没学会跳舞”
然后,我就到现在还没学会
再然后,就再也没有然后了
6
我刚毕业哪会有个MM找我修电脑
然后我就很郁闷耽误我跟哥们踢实况
然后电脑没啥问题啊 一切正常
然后我就很郁闷耽误我跟哥们踢实况
然后那mm非要请我吃pizzahut说谢我
然后我就很郁闷耽误我跟哥们踢实况
然后我就真去了吃了还是她给的钱
然后我就很郁闷耽误我跟哥们踢实况
然后她就拖着我逛街让我给参谋
然后我就很郁闷耽误我跟哥们踢实况
然后非让我送他回家
然后我就很郁闷耽误我跟哥们踢实况
然后她还指着门口一A6说那个是给他爸配的
然后我就很郁闷耽误我跟哥们踢实况
然后现在然后我就很郁闷再跟哥们踢实况我就木有小JJ
7
大四的时候我姐姐生了孩子,我打算给外甥女买个礼物
逛街时正好遇到班里一个mm,
mm自告奋勇帮我选,于是逛啊逛
然后她问我男生是不是很在意女孩脸上长豆豆
我看了看她左边脸上有几个豆豆,就说没什么,我可以走在你右边
然后她就回学校了
8
我记得有次陪一个台湾的ppmm逛街吃晚饭,然后她说累了提出去酒店休息一下
然后我说好,然后到了酒店她说头发有灰尘就去洗澡了
然后我就打开电视看中国男篮对西班牙男篮那场世锦赛,开始中国领先十几分!
mm叫我帮她按摩一下脚但是比赛太激烈了我都没顾上她就叫她自己按
结果后来mm洗了澡坐我旁边陪我看了一会儿比赛觉得无聊她就回去了
可惜中国队后来还是输了
9
朋友的事,很羞涩,
喜欢一个女生好久不敢表白,后来人家女生自己说:我同学说看得出你很喜欢我,
朋友羞愧无地自容地说:啊?抱歉啊,我以后会注意不让人误会了
然后也就没有然后了
10
和我差不多
我是很兴奋的说去打通宵CS吧,结果她在网吧趴了一夜,若干年后才明白她幽怨的眼神
11
说个我自己的
当时跟MM联系了很久
反复计划如何表白
然后终于鼓起勇气打电话
在说出口的一刹那
变成了
“当我的……妹妹好吗”
12
PP的师妹说要给我介绍女朋友,明天早上图书馆门口约给我见,然后第二天到图书馆门
口,没见到她说的女朋友,只见到穿了一身新衣服的师妹。俺大呼上当,扬长而去,等
回味过来已经晚了……
13
嗯。。。转战这里了。。那就再说一个。。。唉。。。真是佩服自己当年的eq。。。
是另外一个mm,我一直在和身边的朋友说我喜欢她要追她之类的。。。
有次和她一起参加个培训出来,我说一起吃饭,她说算了,要么一起爬山去吧。。
当时已经是四点多了,冬天,天黑的比较早的,我们爬到山顶的时候天已经黑了。。
她说眼镜度数不够,天黑看不见,让我拉她一下。。然后我就老老实实的拉着她
的袖子下山了。。。(注意:是拉着袖子!!!)。。。。
然后。。。就没啥然后了这个。。
14
你说吸椰子我想起一个
我哥们的事
也是和MM俩人一起吸椰子
丫恶作剧往里吹气
MM一下子被呛到
水从鼻子里出来了
丫还抚掌大笑
在场的我等4,5个哥们无语凝噎
然后,就没啥然后了。。
15
我也来贡献个差不多的
高中同学,大学互相写信,信的内容啥出格的都没有
某次大学放假回家,我要去电脑城买点配件,就把她叫出来了,括弧我心里还奇怪了一
下,怎么一个女孩子也喜欢逛这种地方括弧毕。然后我在空气污浊乱糟糟的市场里转了
半天,她跟了半天。。。
后来几年后等我回过味儿来,人家说以前喜欢你的,后来实在等不来你表态,就放弃了
。女孩子的青春不能等过去啊。。。
巨温柔的一个女孩儿啊。。。蹲墙角哭会儿去。。
16 这兄弟跟一个美女好了很久,俩人都不说,后来放假,女的叫男的去她
租的房子里打牌,去了后发现,诺大的一个大一居里就他们俩,于是俩
人打得不亦乐乎。后来女的提出,输了的就让对方在身上画乌龟,可以
随便找地方画,这兄弟乐了,连赢了好多把,把女的手心手背都画上了
乌龟,还画得很小,说怕一会儿地方不够,打到后来女的说困了,这兄
弟就说那我也回去了。。。。。。第二天,女的又约男的出来吃饭,吃
完饭后说继续打牌啊,不服!男的很高兴地又去了,俩人关在屋里,又
重复了一遍前一天晚上的事。。。。。。
17
总结,依然是老的最经典
他现在已是研三,从未有过爱之体会。
在他大四那年,由于他一直在一个固定的教室上自习,注意到一个也一直在那个教室上
自习的女孩。而且,很巧的是,那个女孩每次都坐在他前面。他越来越喜欢她,但是,内
向的他却不敢有任何举动,只是每晚默默注视她的背影。
大四第二学期,已经不用上自习了,为了心爱的女孩,他依然每天自习。
当他把秘密告诉舍友们后,其它6个哥们一致决定帮他走出第一步。
于是,那天晚上,7个人一起去了教室。但是,无论舍友们怎么鼓励他他就是没有勇气走
出关键的第一步,舍友们无奈地说:“看来我们也帮不了你了,自己努力吧。”回到宿舍,
他彻夜难免,痛定思痛,决定第二天无论如何也要向他心爱的姑娘表白。
第二天晚上,他如期见到了她。经过了心潮澎湃、坐如针毡等等过程,内心的两个小人
儿激烈大战了1800回合,最后,浪漫的骑士胜利了。
他递给姑娘一张纸条:“你好!我注意你很长时间了。你是一个温柔漂亮的姑娘,我能
和你做个朋友吗?
女孩看完字条,开始收拾书本,完毕,站起来转身问他:“我要走了,你要不要和我一
起走?”
接下来,他说了一句也许是他一生中说过的最经典的话:
“你先走吧。我还有几页书没看完。”

搭建邮件服务器 自动收发邮件做处理

系统:Centos
     install  fetchmail and procmail



<a href="mailto:registerboschpt@gmail.com?subject=register_12345hh55xx&body=12345hh55xx">Submit Email</a>
fetchmail -> procmail -> registration_script -> sendmail (for welcome mail)
There's an option. "set daemon 60"
In the fetchmail config, you set the mda as procmail. For example:
 poll imap.gmail.com protocol IMAP user "henri@mobalean.com" there with password "xx" keep ssl mda "/usr/bin/procmail -m /home/henri/procmail-mobalean.conf"


user_info
  userID
  userIndustry
  userAddress
  userGender
  date_time 

user_email
  userID
  userEmail




  • http://www.webmasterworld.com/webmaster/3359450.htm




  • http://ask.metafilter.com/25271/Advanced-parsing-with-procmail



  • 今天我说一下,我是如何配置fetchmail 来收取gmail 邮件的。
    首先,我花了几天的时间看了fetchmail 和procmail 等这些东西在/usr/share/doc 下的文档。同时大概看了一下fetchmail 的手册页。
    配置如下,参考了example 文件:
    # ~/.fetchmailrc for user-specific
    # This file MUST be chmod 0600, owner fetchmail

    # The default for this option is 300, which polls the server every 5 minutes.
    #
    # set daemon    1200
    #
    # By default, the fetchmail will output logging messages to
    # syslog; uncomment the line below to disable this. This might be useful
    # if you are logging to another file using the 'logfile' option.
    #
    # set no syslog
    #
    # Avoid loss on 4xx errors. On the other hand, 5xx errors get more
    # dangerous.
    #
     set no bouncemail
    #
    # Set postmaster to nico, so that I can receive mail under any conditions
    # Even if destination of undeliverable mail or no matching local recipient
    # mails
    #
     set postmaster nico
    #
    # The following defaults are used when connecting to any server, and can
    # be overridden in the server description below.
    #
    # Set antispam to -1, since it is far safer to use that together with no
    # bouncemail.
    #
    #
    defaults
        protocol pop3
        mda "formail -s procmail"
        antispam -1
        ssl sslcertck keep
            sslcertpath '/etc/ssl/certs/'
    poll pop.gmail.com with uidl
           user 'mygmailaccount@gmail.com' there with password 'mypassword' is 'nico' here

    说明:
    1.文字中的反斜杠请在复制后手工删除,这是博客系统的问题。为防止安全问题,它自动对引号进行了转义。

    按照fetchmail 手册页中的说法(我英文不是太好)
    2. set ... 开头的是全局参数,如 bouncemail、postmaster等。这里我设置了postmaster 为nico 
       ,这是我的Debian 系统上的一个用户名,请换成你自己的用户名。这样我就可以收到一些发信地址不可
       到达或者是本地没有相关匹配收件人的邮件。
    3. 关键词defaults 等同于poll ,因此在defaults 后面跟着的第一行一定要是邮件服务器用的参数,如
       protocol、uidl、dns、no dns等。
    4. 下面的poll 用来具体指定一个邮件服务器,完全可以把上面defaults 字段中的参数放到这里。但要小
       心,千万不要把服务器参数和用户参数混淆了。
    5. defaults 字段中的protocol 是服务器参数,antispam、ssl、keep 是用户参数。mda 建议放在  
       defaults 字段。其它的关键词只要不跟在服务器或者用户帐号的后面,放哪里都行。
    6. mda "formail -s procmail"来自于man procmail。请改成你自己的MDA客户端程序,并做相应配
       置。fetchmail 的手册页里不推荐procmail ,它推荐maildrop 作为客户端。但我用着没问题。个
       人看着办吧。想要这方面的详细信息,请man fetchmail
    7. sslcertpath 中的内容请改成自己系统中的路径。如果没有请参照网上的方法做一下签名文件放好。
    7. 暑假我会找时间翻译fetchmail、procmail、msmtp 的手册页的。

    2011年4月25日星期一

    用PHP开发多任务应用程序

    许多 PHP开发人员认为,由于标准的 PHP 缺少线程功能,因此实际 PHP 应用程序不可能执行多任务处理。例如,如果应用程序需要其他 Web 站点的信息,那么在远程检索完成之前它都必须停止。这是错误的!通过本文了解如何使用 stream_select 和 stream_socket_client 实现进程内 PHP 多任务处理。
    PHP 不支持线程。尽管如此,与前述大多数 PHP 开发人员所相信的想法形成对比的是,PHP 应用程序可以 执行多任务处理。让我们开始尽可能清晰地描述一下 “多任务” 和 “线程” 对于 PHP 编程的意义。
    并发的种类
    首先抛开几个和主题无关的例子。PHP 与多任务或并发的关系十分复杂。在较高层次上,PHP 经常涉及多任务:以多任务方式使用 标准的服务器端 PHP 安装 —— 例如,作为 Apache 模块。换句话说,若干个客户机 —— Web 浏览器 —— 可以同时请求同一个 PHP 解释的页面,而 Web 服务器将差不多同时返回所有这些页面。
    一个 Web 页面不会妨碍其他 Web 页面的发送,尽管可能会由于诸如服务器内存或网络带宽之类的受限资源而使它们相互之间略有妨碍。这样,实现并发 的系统级需求可能适合使用基于 PHP 的解决方案。就实现而言,PHP 允许它的管理 Web 服务器负责实现并发。
    Ajax 名下的客户端并发近几年来也已成为开发人员关注的焦点。虽然 Ajax 的含义已经变得十分模糊,但是它的一个方面是浏览器显示可以同时执行计算和 保留对诸如选择菜单项之类的用户操作的响应。这实际上就是某种 多任务。用 PHP 编码的 Ajax 就是这样 —— 但是不涉及任何特定的 PHP;用于其他语言的 Ajax 框架均以完全相同的方法操作。
    只粗略地涉及 PHP 的第三个并发实例是 PHP/TK。PHP/TK 是 PHP 的扩展,用于为核心 PHP 提供可移植图形用户界面(GUI)绑定。PHP/TK 允许用 PHP 编写代码构造桌面 GUI 应用程序。其基于****的特性将模拟一种易于掌握并且比线程更少出错的并发形式。此外,并发是 “继承” 自一项辅助技术,而不是 PHP 的基本功能。
    向 PHP 本身添加线程支持的试验已经做过多次。据我所知,没有一次是成功的。但是,Ajax 框架和 PHP/TK 的面向****的实现表明****可能比线程能更好地体现 PHP 的并发。PHP V5 证明事实确实如此。
    PHP V5 将提供 stream_select()
    使用标准的 PHP V4 和更低版本,必须按顺序执行 PHP 应用程序的所有工作。例如,如果程序需要在两个商业站点检索商品的价格,则请求第一个站点的价格,等待至响应到达,再请求第二个站点的价格,然后再次等待。
    如果程序请求同时完成若干项任务会怎么样?总体来看,程序将在一段时间内完成,在这段时间内,将始终进行连续处理。
    第一个示例
    新的 stream_select 函数及它的几个助手使这成为可能。请考虑以下示例。
    清单 1. 同时请求多个 HTTP 页面
    以下为引用的内容:
    <?php
    echo "Program starts at ". date('h:i:s') . ". ";
    $timeout=10; 
    $result=array(); 
    $sockets=array(); 
    $convenient_read_block=8192;
    /* Issue all requests simultaneously; there's no blocking. */
    $delay=15;
    $id=0;
    while ($delay > 0) {
     $s=stream_socket_client("phaseit.net:80", $errno,
      $errstr, $timeout,
      STREAM_CLIENT_ASYNC_CONNECT|STREAM_CLIENT_CONNECT); 
     if ($s) { 
      $sockets[$id++]=$s; 
      $http_message="GET /dem****tration/delay?delay=" .
       $delay . " HTTP/1.0 Host: phaseit.net "; 
      fwrite($s, $http_message);
     } else { 
      echo "Stream " . $id . " failed to open correctly.";
     } 
     $delay -= 3;
    }
    while (count($sockets)) { 
     $read=$sockets; 
     stream_select($read, $w=null, $e=null, $timeout); 
     if (count($read)) {
      /* stream_select generally shuffles $read, so we need to
      compute from which socket(s) we're reading. */
      foreach ($read as $r) { 
       $id=array_search($r, $sockets); 
       $data=fread($r, $convenient_read_block); 
       /* A socket is readable either because it has
       data to read, or because it's at EOF. */
       if (strlen($data) == 0) { 
        echo "Stream " . $id . " closes at " . date('h:i:s') . ". ";
        fclose($r); 
        unset($sockets[$id]); 
       } else { 
        $result[$id] .= $data; 
       } 
      } 
     } else { 
      /* A time-out means that *all* streams have failed
      to receive a resp****e. */
      echo "Time-out! ";
      break;
     } 

    ?>
    如果运行此清单,您将看到如下所示的输出。
    清单 2. 从清单 1 中的程序获得的典型输出
    以下为引用的内容:
    Program starts at 02:38:50.
    Stream 4 closes at 02:38:53.
    Stream 3 closes at 02:38:56.
    Stream 2 closes at 02:38:59.
    Stream 1 closes at 02:39:02.
    Stream 0 closes at 02:39:05.
    了解这其中的工作原理至关重要。在较高层次上,第一个程序将发出几个 HTTP 请求并接收 Web 服务器发送给它的页面。虽然生产应用程序将很可能寻找若干个 Web 服务器的地址 —— 可能是 google.com、yahoo.com、ask.com 等 —— 但是此示例将把它的所有请求发送到位于 Phaseit.net 的企业服务器上,只为降低复杂度。
    Web 页面请求在延迟(可变)后返回结果,如下所示。如果程序按顺序发出请求,则需花费大约 15+12+9+6+3 (45) 秒钟才能完成。如清单 2 所示,它实际上花费 15 秒钟完成。性能提高了三倍。
    使这成为可能的是 PHP V5 的新 stream_select 函数。请求都是以常规方法发起,方法为打开几个 stream_socket_client 并向对应于 http://phaseit.net/dem****tration/delay?delay=$DELAY 的每个 stream_socket_client 写入 GET。如果您通过浏览器请求此 URL,则在几秒钟之后,您将看到:
    以下为引用的内容:
    Starting at Thu Apr 12 15:05:01 UTC 2007. 
    Stopping at Thu Apr 12 15:05:05 UTC 2007. 
    4 second delay.
    延迟服务器将作为 CGI 实现,如下所示:
    清单 3. 延迟服务器实现
    以下为引用的内容:
    #!/bin/sh
    echo "Content-type: text/html
    <HTML> <HEAD></HEAD> <BODY>"
    echo "Starting at `date`."
    RR=`echo $REQUEST_URI | sed -e 's/.*?//'`
    DELAY=`echo $RR | sed -e 's/delay=//'`
    sleep $DELAY
    echo "<br>Stopping at `date`."
    echo "<br>$DELAY second delay.</body></html>"
    虽然清单 3 的特殊实现特定于 UNIX?,但是本文中几乎所有实现都将很好地应用于 Windows?(尤其是 Windows 98 以后的版本)或 PHP 的 UNIX 安装。特别地,清单 1 可以托管在任意一个操作系统中。因此,Linux? 和 Mac OS X 都是 UNIX 变体,因此这里所有的代码都可以在两者的任意一种中运行。
    按照以下顺序向延迟服务器发出请求。
    清单 4. 进程启动顺序
    以下为引用的内容:
    delay=15
    delay=12
    delay= 9
    delay= 6
    delay= 3
    stream_select 的作用是尽可能快速地接收结果。在这种情况下,它执行的顺序与发出结果的顺序刚好相反。3 秒后,第一个页面已经准备好读取。程序的这一部分也符合常规 PHP —— 在本例中,使用 fread。就像在其他 PHP 程序一样,读取可以很好地通过 fgets 完成。
    处理将以同样的方法继续。程序将在 stream_select 停止,直至数据就绪。重要的一点是,只要任何 连接具有数据,不管顺序怎样,程序都将开始读取。这是程序进行多任务处理或并发处理来自多个请求的结果的方法。
    注意,这没有对主机 CPU 造成任何负担。经常会遇到这样一些连网程序,以 CPU 使用率急速上升至 100% 的方式在 while 中使用 fread。那种情况不会出现在这里,因为 stream_select 拥有支持立即响应所需的属性(只要有任何读取信息),但是它将在各读取操作间隙的等待时间内产生可忽略的 CPU 负载。
    必备的 stream_select() 知识
    诸如此类的基于****的编程并不是最基本的。虽然清单 1 被简化到只包含最基本要素,但是涉及作为多任务应用程序必要元素的回调或协调的任何编码,比简单的程序顺序更让人觉得陌生。在这种情况下,大多数挑战集中在 $read 数组上。注意,它是一个引用;stream_select 将通过改变 $read 的内容返回重要信息。就像指针是 C 的最大绊脚石一样,引用似乎是 PHP 中最让程序员感到棘手的一部分。
    您可以使用这项技术向任意个外部 Web 站点发出请求,确信您的程序会尽快收到所有结果,而无需等待其他请求。实际上,该技术将正确处理所有 TCP/IP 连接,而不只是 Web 端口 80 上的连接,因此您可以大体上管理 LDAP 检索、SMTP 传输、SOAP 请求等。
    但那不是全部。PHP V5 将管理 “流” 之类的各种连接,而不仅是简单的套接字。PHP 的 Client URL library (CURL) 支持 HTTPS 证书、FTP 上传、cookie 等。(CURL 允许 PHP 应用程序使用各种协议连接至服务器)。由于 CURL 将提供流接口,因此从程序的角度来看,连接是透明的。下一个部分将展示 stream_select 如何多路传输本地计算。
    对于 stream_select 还有几点需要注意。它还在进行文档整理,因为即使最新的 PHP 书籍都没有涉列它。可在 Web 上获得的几个代码示例完全不能工作或者让人产生混淆。stream_select 的第二个和第三个参数用于管理与清单 1 的 read 通道相对应的 write 和 exception 通道,应当始终为 null。除了少数例外情况,在可写通道或异常通道中选择这两个参数是错误的。除非您有经验,否则请坚持可读选择。
    此外,至少在 PHP V5.1.2 之前,stream_select 还明显存在错误。最重要的是,不能信任函数的返回值。虽然我尚未调试过实现,但是经验告诉我,可以安全地测试清单 1 中的 count($read),但是测试 stream_select 本身的返回值并不 安全(尽管有官方文档)。
    本地 PHP 并发
    示例及上面的大部分讨论主要讨论了如何同时管理若干个远程资源并接收到达的结果,而不是按照最初请求的顺序等待处理各个请求。这肯定是 PHP 并发的重要应用。实际应用程序的速度有时候可以提高 10 倍或更多。
    如果出现性能衰退怎么办?有没有一种方法可以提升受限于本地处理的 PHP 结果的速度?方法有多种。要说有什么不同的话,这些方法不如清单 1 中的面向套接字的方法有名。造成这种情况的原因有很多,包括:
    大多数 PHP 页面已经足够快 —— 更好的性能会是一种优势,但是还不值得对新代码进行投入。 
    在 Web 页面中使用 PHP 可以放弃部分无关紧要的性能提升 —— 当惟一的价值标准是交付整个 Web 页面需要的时间时,那么重新安排计算以更快地获得中间结果并不重要。
    PHP 不能控制本地瓶颈 —— 用户可能会为花 8 秒的时间提取帐户记录的详细信息而抱怨,但是那很可能是数据库处理或某种其他 PHP 外部资源的约束。即使将 PHP 处理降至零,单是查找就仍需要花费超过 7 秒的时间。
    甚至很少有约束是并行的 —— 假定某特定页面将为具体列出的普通股计算建议交易价格,并且计算十分复杂,需要花费一段时间。计算在本质上可能是顺序执行的。没有一种明显的方法可以将其划分为 “团队协作”。
    很少有 PHP 程序员能够认识到 PHP 实现并发的潜力。在具有使用并行实现性能需求的少数人当中,我遇到的大多数人全都说 PHP “不支持线程”,并且甘于使用现有的计算模型。
    可是,有时我们可以做得更好。假定 PHP 页面需要计算两只股票价格,可能还需要将两者相比较,并且底层主机刚好是多处理器。在这种情况下,通过将两个截然不同并且十分耗时的计算分配给不同处理器,可能会提高几乎两倍的性能。
    在所有 PHP 计算领域中,此类实例很少见。但是,由于我发现到处都没有对它的精确记录,因此需要在这里包括用于此类加速的模型。
    清单 5. 延迟服务器实现
    以下为引用的内容:
    <?php
    echo "Program starts at ". date('h:i:s') . ". ";
    $timeout=10; 
    $streams=array();
    $handles=array();
    /* First launch a program with a delay of three seconds, then
    one which returns after only one second. */
    $delay=3;
    for ($id=0; $id <= 1; $id++) {
     $error_log="/tmp/error" . $id . ".txt"
     $descriptorspec=array(
      0 => array("pipe", "r"),
      1 => array("pipe", "w"),
      2 => array("file", $error_log, "w")
     );
     $cmd='sleep ' . $delay . '; echo "Finished with delay of ' .
     $delay . '".';
     $handles[$id]=proc_open($cmd, $descriptorspec, $pipes);
     $streams[$id]=$pipes[1];
     $all_pipes[$id]=$pipes;
     $delay -= 2;
    }
    while (count($streams)) { 
     $read=$streams; 
     stream_select($read, $w=null, $e=null, $timeout); 
     foreach ($read as $r) { 
      $id=array_search($r, $strea**ms); 
      echo stream_get_contents($all_pipes[$id][1]);
      if (feof($r)) {
       fclose($all_pipes[$id][0]);
       fclose($all_pipes[$id][1]);
       $return_value=proc_close($handles[$id]);
       unset($streams[$id]); 
      }
     } 

    ?>
    此程序将生成如下输出:
    以下为引用的内容:
    Program starts at 10:28:41.
    Finished with delay of 1.
    Finished with delay of 3.
    这里的关键在于 PHP 启动了两个独立子进程,取回待完成的第一个进程的输出,然后取回第二个进程的输出,即使后者启动得较早。如果主机是多处理器计算机,并且操作系统已正确配置,则操作系统本身负责将各个子程序分配给不同的处理器。这是在多处理器主机中良好应用 PHP 的一种方法。
    PHP 支持多任务。PHP 不按照诸如 Java 编程语言或 C++ 等其他语言所采用的方法支持线程,但是以上示例表明 PHP 具有更多的超乎想象的加速潜力。

    上海松善实业有限公司

        上海松善实业有限公司是一家集多品牌销售于一体的电线电缆骨干企业,公司成立于2016年。 公司拥有国内各大品牌:起帆、远东、上上、江南、胜华等。     主要产品有:高低压电力电缆、橡套电缆、控制电缆、架空绝缘电缆、塑胶电缆、电子计算机电缆、通讯电缆、...