<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_xin478</title><subtitle type="text"/><id>http://feed.cnblogs.com/blog/u/28045/rss</id><updated>2011-11-16T16:25:21Z</updated><author><name>xin478</name><uri>http://www.cnblogs.com/xin478/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/xin478/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/28045/rss"/><entry><id>http://www.cnblogs.com/xin478/archive/2011/10/27/2226202.html</id><title type="text">nginx proxy_pass末尾神奇的/</title><summary type="text">http://backend;和http://backend/;有什么区别呢？ location /service/ { proxy_pass http://backend; proxy_next_upstream error timeout invalid_header http_500 http_503 http_404; } location /service/ { proxy_pass http://backend/; proxy_next_upstream error timeout invalid_header http_500 http_503 http_404; }同样访问：h</summary><published>2011-10-27T02:59:00Z</published><updated>2011-10-27T02:59:00Z</updated><author><name>xin478</name><uri>http://www.cnblogs.com/xin478/</uri></author><link rel="alternate" href="http://www.cnblogs.com/xin478/archive/2011/10/27/2226202.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/xin478/archive/2011/10/27/2226202.html"/><content type="html">&lt;p&gt;http://backend;和http://backend/;有什么区别呢？&lt;br /&gt;&lt;br /&gt; location /service/ {&lt;br /&gt; proxy_pass http://backend;&lt;br /&gt; proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; location /service/ {&lt;br /&gt; proxy_pass http://backend/;&lt;br /&gt; proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;&lt;br /&gt; }&lt;br /&gt;同样访问：http://neverstay.com/service/add.php&lt;br /&gt; 前者配置，在后端的机器，收到的是http://neverstay.com/service/add.php&lt;br /&gt; 后者配置，在后端的机器，收到的是http://neverstay.com/add.php&lt;br /&gt;&lt;br /&gt;如果换成下面这样，会报错：&lt;br /&gt; location ~ ^/(service)/ {&lt;br /&gt; proxy_pass http://backend/;&lt;br /&gt; proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;&lt;br /&gt; }&lt;br /&gt; "proxy_pass" may not have URI part in location given by regular expression, or inside named location, or inside the "if" statement, or inside the "limit_except" block in nginx.conf:&lt;br /&gt;&lt;br /&gt;但是，这样就没问题了：&lt;br /&gt; location ~ ^/(service)/ {&lt;br /&gt; proxy_pass http://backend;&lt;br /&gt; proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;&lt;br /&gt; }&lt;br /&gt; 把proxy_pass末尾的斜线去掉，就可以了，估计前段时间遇到的后端双层目录也跟这个有关，具体原因待查。。。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/xin478/aggbug/2226202.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/xin478/archive/2011/10/27/2226202.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/xin478/archive/2010/10/25/1860541.html</id><title type="text">在php中使用SMTP通过密抄批量发送邮件续：修正</title><summary type="text">前不久我写过的一篇关于用socket发送邮件的随笔---在php中使用SMTP通过密抄批量发送邮件，算是对那几天工作的小结。但是，通过这几天的使用，的确发现了一些问题。首先，如果没有记错的话，以前我有提到我们公司的服务器是放在美国的，跑的是linux。但是，我在本地测试的时候，为了图个速度快，实际上，测试各项功能时，我使用了126的邮箱进行发送的。实际上，马上就证实了这个是我的疏忽。投入使用后，突...</summary><published>2010-10-25T09:02:00Z</published><updated>2010-10-25T09:02:00Z</updated><author><name>xin478</name><uri>http://www.cnblogs.com/xin478/</uri></author><link rel="alternate" href="http://www.cnblogs.com/xin478/archive/2010/10/25/1860541.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/xin478/archive/2010/10/25/1860541.html"/><content type="html">&lt;p&gt;前不久我写过的一篇关于用socket发送邮件的随笔---&lt;a href="http://www.cnblogs.com/xin478/archive/2010/10/15/1851968.html" target="_blank"&gt;在php中使用SMTP通过密抄批量发送邮件&lt;/a&gt;，算是对那几天工作的小结。但是，通过这几天的使用，的确发现了一些问题。&lt;/p&gt;&#xD;
&lt;p&gt;首先，如果没有记错的话，以前我有提到我们公司的服务器是放在美国的，跑的是linux。但是，我在本地测试的时候，为了图个速度快，实际上，测试各项功能时，我使用了126的邮箱进行发送的。实际上，马上就证实了这个是我的疏忽。投入使用后，突然发现问题大条了。原来使用密抄的目的，是为了让各收件人间无法知道邮件还发给了谁，但是通过那台服务器发送的邮件，密抄地址居然全部列在上面，以至于有个收件的客户回了一封信给我们&amp;ldquo;Please send emails to mass recipients as bc (blind copy) so everyone doesn't have all email addresses.&amp;rdquo;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;但是，我们的确是使用了密抄的啊，不能啊。但是，我在服务器上发给了自己，的确如此。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;========================我是证据==============================&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2010/24486/2010102516210553.gif" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;查看收到的邮件的头信息，也包含了本不应存在的bcc信息&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2010/24486/2010102516270864.gif" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;可以我在本地测试，结果还是可以。那就神奇了，一样的代码，但是结果不一样。试了好几次，发现只要是使用qq、126之类的服务器来发送邮件，就不会显示。于是，就考虑是不是由于服务器上邮件发送程序不一样引起的或者是我的构造的信件格式有问题。于是，我用foxmail发送了一封到美国的服务器，结果他可以。看来是我的标头不规范了，qq、126能识别，美国佬的不行。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;那知道了就改吧。通过抓包软件，可以得到一份完整的通讯记录，如下：&lt;/p&gt;&#xD;
&lt;div style="background: #F2F2F2; border: solid 1px #999999; padding: 10px;"&gt;&#xD;
&lt;span style="color: #008000;"&gt;220 126.com Anti-spam GT for Coremail System (126com[20101010])&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;EHLO xin478-PC&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;br /&gt;250-mail&lt;br /&gt;250-PIPELINING&lt;br /&gt;250-AUTH LOGIN PLAIN&lt;br /&gt;250-AUTH=LOGIN PLAIN&lt;br /&gt;250-coremail 1Uxr2xKj7kG0xkI17xGrU7I0s8FY2U3Uj8Cz28x1UUUUU7Ic2I0Y2UrGJqy-UCa0xDrUUUUj250 8BITMIME&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;AUTH LOGIN&lt;br /&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;334 xxxxxxx&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;eGHuNDc7&lt;br /&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;334 xxxxxxxxxx&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;ODU1NzE2&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;235 Authentication successful&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;MAIL FROM: &amp;lt;xxxxxx@126.com&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;250 Mail OK&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;RCPT TO: &amp;lt;noreply@xxxxx.com&amp;gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;br /&gt;250 Mail OK&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;RCPT TO: &amp;lt;44522303@qq.com&amp;gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;250 Mail OK&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;RCPT TO: &amp;lt;noreply@yoberryks.com&amp;gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;br /&gt;250 Mail OK&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;RCPT TO: &amp;lt;44522303@qq.com&amp;gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;br /&gt;250 Mail OK&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Data&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;br /&gt;354 End data with &amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;.&amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Date: Mon, 25 Oct 2010 16:32:49 +0800&lt;br /&gt;From: "xin478" &amp;lt;xin478@126.com&amp;gt;&lt;br /&gt;To: "noreply" &amp;lt;noreply@xxxxx.com&amp;gt;&lt;br /&gt;Cc: "44522303" &amp;lt;44522303@qq.com&amp;gt;&lt;br /&gt;Subject: this is topic&lt;br /&gt;Message-ID: &amp;lt;201010251632482022640@126.com&amp;gt;&lt;br /&gt;X-mailer: Foxmail 6, 15, 201, 22 [cn]&lt;br /&gt;Mime-Version: 1.0&lt;br /&gt;Content-Type: multipart/alternative;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; boundary="=====003_Dragon220658716328_====="&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;&lt;span style="color: #000000;"&gt;This is a multi-part message in MIME format.&#xD;
&lt;/span&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;--=====003_Dragon220658716328_=====&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;Content-Type: text/plain;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;charset="gb2312"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;Content-Transfer-Encoding: 7bit&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;this is content&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;--=====003_Dragon220658716328_=====&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;Content-Type: text/html;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;charset="gb2312"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;Content-Transfer-Encoding: base64&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;L0VOIj4NCjxIVE1MPjxIRUFEPg0KPFNUWUxFIHR5cGU9dGV4dC9jc3M+QGltcG9ydCB1cmwoIEU6&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;XFRlbXBcSW50ZXJuZXQgwdnKsc7EvP5cc2Nyb2xsYmFyLmNzcyApOw0KPC9TVFlMRT4NCg0KPFNU&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;WUxFIHR5cGU9dGV4dC9jc3M+QGltcG9ydCB1cmwoIEU6XFRlbXBcSW50ZXJuZXQgwdnKsc7EvP5c&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;c2Nyb2xsYmFyLmNzcyApOw0KPC9TVFlMRT4NCg0KPFNUWUxFIHR5cGU9dGV4dC9jc3M+QGltcG9y&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;dCB1cmwoIEU6XFRlbXBcSW50ZXJuZXQgwdnKsc7EvP5cc2Nyb2xsYmFyLmNzcyApOw0KPC9TVFlM&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;RT4NCg0KPFNUWUxFIHR5cGU9dGV4dC9jc3M+QGltcG9ydCB1cmwoIEU6XFRlbXBcSW50ZXJuZXQg&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;wdnKsc7EvP5cc2Nyb2xsYmFyLmNzcyApOw0KPC9TVFlMRT4NCg0KPFNUWUxFIHR5cGU9dGV4dC9j&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;c3M+QGltcG9ydCB1cmwoIEU6XFRlbXBcSW50ZXJuZXQgwdnKsc7EvP5cc2Nyb2xsYmFyLmNzcyAp&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;Ow0KPC9TVFlMRT4NCg0KPE1FVEEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUdCMjMxMiIg&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;aHR0cC1lcXVpdj1Db250ZW50LVR5cGU+DQo8TUVUQSBuYW1lPUdFTkVSQVRPUiBjb250ZW50PSJN&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;U0hUTUwgOS4wMC43OTMwLjE2NDA2Ij48TElOSyByZWw9c3R5bGVzaGVldCANCmhyZWY9IkJMT0NL&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;UVVPVEV7bWFyZ2luLVRvcDogMHB4OyBtYXJnaW4tQm90dG9tOiAwcHg7IG1hcmdpbi1MZWZ0OiAy&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;ZW19Ij48L0hFQUQ+DQo8Qk9EWSBzdHlsZT0iTUFSR0lOOiAxMHB4OyBGT05ULUZBTUlMWTogdmVy&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;ZGFuYTsgRk9OVC1TSVpFOiAxMHB0Ij4NCjxESVY+PEZPTlQgc2l6ZT&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;0yIGZhY2U9VmVyZGFuYT50&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;aGlzIGlzIGNvbnRlbnQ8L0ZPTlQ+PC9ESVY+PC9CT0RZPjwvSFRNTD4NCg==&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;--=====003_Dragon220658716328_=====--&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;/p&gt;&#xD;
250 Mail OK queued as smtp1,C8mowKDLuQOxQMVMWetQAA--.41003S2 1287995571&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;QUIT&lt;br /&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;221 Bye&lt;/span&gt;&#xD;
&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;于是，大体是就明了了，基本上流程是这样的&lt;/p&gt;&#xD;
&lt;p&gt;一、建立TCP连接。&lt;br /&gt;二、客户端发送HELO命令以标识发件人自己的身份，然后客户端发送MAIL命令服务器端正希望以OK作为响应，表明准备接收。&lt;br /&gt;三、客户端发送RCPT命令，以标识该电子邮件的计划接收人，可以有多个RCPT行&lt;br /&gt;四、协商结束，发送邮件，用命令DATA发送&lt;br /&gt;五、以.表示结束输入内容一起发送出去&lt;br /&gt;六、用QUIT命令退出结束此次发送。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;而对于SMTP的命令而言，大抵用到的有这几种&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;HELO　　 向服务器标识用户身份&lt;/li&gt;&#xD;
&lt;li&gt;MAIL　　　初始化邮件传输mail from: &amp;lt;xxx&amp;gt;&lt;/li&gt;&#xD;
&lt;li&gt;RCPT　　　标识单个的邮件接收人；常在MAIL命令后面可有多个rcpt to: &amp;lt;xxx&amp;gt;&lt;/li&gt;&#xD;
&lt;li&gt;DATA　　　在单个或多个RCPT命令后，表示所有的邮件接收人已标识，初始化数据传输，以.结束&lt;/li&gt;&#xD;
&lt;li&gt;NOOP　　 无操作，服务器应响应OK&lt;/li&gt;&#xD;
&lt;li&gt;RSET　　　重置会话，当前传输被取消&lt;/li&gt;&#xD;
&lt;li&gt;QUIT　　　结束会话&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;我们可以观察到，在整个通讯的过程中，标头中并没有出现BCC的关键字，只是把邮件接收者都用RCPT TO按顺序都送出去了，我一直以为这个BCC是要的，而且为了区别，这封邮件我也抄送了一份（注意是抄送而不是密送），这个抄送的地址赫然在目&lt;span style="color: #ff6600;"&gt;&amp;nbsp;Cc: "44522303" &amp;lt;44522303@qq.com&amp;gt;&lt;/span&gt;&lt;span style="color: #ff6600;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;所以，我推测这个BCC是不用写的，不在To里面的和不在CC里面的，就是BCC，于是，我去掉了代码里输出BCC到标头这个行，重新发送了一次，的确，就可以了，不会显示密抄名单了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;但是，随即又发现一个新的问题，就是在收件人那栏里，使用密抄的话，不会显示当前收件人，而是会显示用MAIL TO 送出去的那个地址。在规范里，MAIL TO,CC,BCC三者只要有其中一个就可以了，于是，我又去掉了原来TO，这下，再发的时候，就看不到错误的收件人了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这封是密抄给noreply@xx.com的邮件，但是在noreplay的账户里区看到了收件人为xin478@126.com&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2010/24486/2010102516572737.gif" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;修改后，这个收件人就不会显示了&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="border: 1px solid #000000;" src="http://pic002.cnblogs.com/images/2010/24486/2010102516582380.gif" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;估计，使用密抄的话，这个收件人的问题没有什么好的办法了。如果有好解决方法的兄弟，告知我一声。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;修改后的代码，请移步到前文&amp;nbsp;&lt;a href="http://www.cnblogs.com/xin478/archive/2010/10/15/1851968.html" target="_blank"&gt;在php中使用SMTP通过密抄批量发送邮件&lt;/a&gt;，我更新在那边了。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/xin478/aggbug/1860541.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/xin478/archive/2010/10/25/1860541.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/xin478/archive/2010/10/18/1852346.html</id><title type="text">无聊闲做，从使用PHP数组实现约瑟夫环问题谈性能</title><summary type="text">闲来无事，看到园子里的一篇文章约瑟夫环问题的 PHP 实现--使用 PHP 数组内部指针操作函数，以前没有搞过，也没有听说什么什么环的，所以突然也想搞一下试试问题大概这样子：一群猴子排成一圈，按 1,2,...,n 依次编号。然后从第 1 只开始数，数到第 m 只,把它踢出圈，从它后面再开始数， 再数到第 m 只，在把它踢出去...，如此不停的进行下去， 直到最后只剩下一只猴子为止，那只猴子就叫做...</summary><published>2010-10-18T04:16:00Z</published><updated>2010-10-18T04:16:00Z</updated><author><name>xin478</name><uri>http://www.cnblogs.com/xin478/</uri></author><link rel="alternate" href="http://www.cnblogs.com/xin478/archive/2010/10/18/1852346.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/xin478/archive/2010/10/18/1852346.html"/><content type="html">&lt;p&gt;闲来无事，看到园子里的一篇文章&lt;a href="http://www.cnblogs.com/catprayer/archive/2010/10/04/1842085.html" target="_blank"&gt;约瑟夫环问题的 PHP 实现--使用 PHP 数组内部指针操作函数&lt;/a&gt;，以前没有搞过，也没有听说什么什么环的，所以突然也想搞一下试试&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;问题大概这样子：一群猴子排成一圈，按 1,2,...,n 依次编号。然后从第 1 只开始数，数到第 m 只,把它踢出圈，从它后面再开始数， 再数到第 m 只，在把它踢出去...，如此不停的进行下去， 直到最后只剩下一只猴子为止，那只猴子就叫做大王。要求编程模拟此过程，输入 m、n, 输出最后那个大王的编号。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;脑子比较直，所以第一个想法就是这n只首尾相接排成环状的猴子，不就是一个环状链表吗？ 用C的话，马上就是这个概念了。但是PHP里面没有这东西，也不能定义结构体，如果用类来实现，实际上开销有点大好像。剩下来现成点的就是数组了，虽然php中的数组实际上就是哈希表，开销也远大于C中的数组，不过，能想到的就是这家伙了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;原来的兄弟是用prev,next等函数来操作，但是顾名思义，prev、next每次它只能前进一步、后退一步，这样实际上就无法避免要使用循环，例如往后6个，就要运行6次的next，所以，在性能上是不划算的。很抱歉，我是用虚拟主机用惯的人，太过计较一点性能上的浪费，没办法，苦日子过惯了，见不得奢侈。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff0000;"&gt;先申明一点，我并没有任何别的意思，原来的兄弟也说了只是想实现下并未注重算法性能&lt;/span&gt;。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;换一个角度看，假设说现在圈里面有5个人，我们要数12个，那么我们真的要一个一个去数，数6下？不要吧，相信大家都知道只要数2个，因为其中的10次实际上就是对圈里的5人数了2圈，在这期间，没有人会被踢出去，换句话说，这10次就是白数的。真正决定的，是后面的2次，所以，换一个方法如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;function getKingMonkey1($n,$m)&#xD;
{&#xD;
    $a=range(1,$n); //声明一个包含n个元素的数组&#xD;
    $c=$n;  //记录当前圈子中的人数&#xD;
    $t=0;    //开始数数的位置&#xD;
    while($c&amp;gt;1)  //圈中剩一个就结束&#xD;
    {&#xD;
    	$t=$m%$c+$t;&#xD;
    	if($t&amp;gt;$c) $t=$t%$c;&#xD;
    	$t=$t&amp;gt;0?--$t:0;&#xD;
    	array_splice($a,$t,1);  //将不幸的兄弟踢出去&#xD;
    	--$c;   //圈中人数减一&#xD;
    	if($t==0) $t=$c;&#xD;
    }&#xD;
    return reset($a);&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这个是原来的兄弟写的&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;//转自http://www.cnblogs.com/catprayer/archive/2010/10/04/1842085.html&lt;br /&gt;function getKingMonkey($n, $m) &#xD;
{ &#xD;
    $a = array();//声明内部数组 &#xD;
    for($i = 1; $i &amp;lt;= $n; $i ++) &#xD;
    { &#xD;
        $a[$i] = $i;//这一步是对号入座 &#xD;
    } &#xD;
    reset($a);//为了严谨，我们来一个 reset() 函数，其实也可以省去 &#xD;
    while(count($a) &amp;gt; 1)//主循环开始，这里使用的判别条件是数组元素的个数等于 1 的时候停止循环 &#xD;
    { &#xD;
        for($counter = 1; $counter &amp;lt;= $m; $counter++)//嵌套的 for 循环，用来&amp;ldquo;踢出&amp;rdquo;数到 m 的猴子 &#xD;
        { &#xD;
            if(next($a)){//如果存在 next 元素 &#xD;
                if($counter == $m) &#xD;
                { &#xD;
                    unset($a[array_search(prev($a), $a)]);//当数到 m 时，使用 unset() 删除数组元素 &#xD;
                } &#xD;
            } &#xD;
            else//如果不存在 next 元素 &#xD;
            { &#xD;
                reset($a);//则数组的第一个元素充当 next 元素 &#xD;
                if($counter == $m) &#xD;
                { &#xD;
                    unset($a[array_search(end($a), $a)]);//当数到 m 时，使用 unset() 删除数组元素，注意这里是 end() &#xD;
                    reset($a);//记得让数组内部指针&amp;ldquo;归位&amp;rdquo; &#xD;
                } &#xD;
            } &#xD;
        } &#xD;
    } &#xD;
    return current($a); &#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;一、首先，用for循环为数组赋连续的值，是不划算的，用内置的range函数，就可以实现。&lt;/p&gt;&#xD;
&lt;p&gt;二、尽量避免多次调用count来获取数组数量，php中获取数组数量的方法和c#中不同，不如其高效，多次使用时，请使用局部变量来记录&lt;/p&gt;&#xD;
&lt;p&gt;三、在逻辑结构允许的情况下，++$t远比$t--来的合算，因为这点上，php是特殊的，像$t++,$t--这类的结构，它内部实际上多使用了一个局部变量来记录原值，所以，要多执行一个opcode&lt;/p&gt;&#xD;
&lt;p&gt;四、至于为什么踢出去的时候，使用array_splice而不用unset呢？ 虽然unset属于语法结构，速度远比array_splice这种函数调用来的快，也都是可以将数组中的一个元素移除，但是，他们还是有不同之处。array_splice在移除数组的同时，会更改其后面索引类型为数字的元素的索引，而unset则不会。如&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;$a=array(0,1,'a'=&amp;gt;4,2,3,4,5,6);&#xD;
array_splice($a,1,1);&#xD;
&#xD;
则结构就由原来的&#xD;
array&#xD;
  0 =&amp;gt; int 0&#xD;
  1 =&amp;gt; int 1&#xD;
  'a' =&amp;gt; int 4&#xD;
  2 =&amp;gt; int 2&#xD;
  3 =&amp;gt; int 3&#xD;
  4 =&amp;gt; int 4&#xD;
  5 =&amp;gt; int 5&#xD;
  6 =&amp;gt; int 6&#xD;
变为:&#xD;
array&#xD;
  0 =&amp;gt; int 0&#xD;
  'a' =&amp;gt; int 4&#xD;
  1 =&amp;gt; int 2&#xD;
  2 =&amp;gt; int 3&#xD;
  3 =&amp;gt; int 4&#xD;
  4 =&amp;gt; int 5&#xD;
  5 =&amp;gt; int 6&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;换句话说，就是array_splice在移除元素之后，会对索引做一个重排，所以，在不影响使用的情况下，尽量使用unset来取代array_splice，即使是一次需要移除多个元素的情况。我这里要它重排下，所以只能依了它。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;最终，运行的结果如下&lt;/p&gt;&#xD;
&lt;p&gt;在10人中数6人的情况&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2010/24486/2010101812115337.gif" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在人数及数人的数量增多的情况下，循环带来的开销会更明显，例如100人数81&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2010/24486/2010101812134756.gif" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;也是过苦日子的兄弟，可以参考 &lt;a href="http://www.cnblogs.com/xin478/archive/2008/09/10/1288657.html" target="_blank"&gt;优化php代码的40条建议&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/xin478/aggbug/1852346.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/xin478/archive/2010/10/18/1852346.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/xin478/archive/2010/10/15/1851968.html</id><title type="text">在php中使用SMTP通过密抄批量发送邮件</title><summary type="text">这几天，在整一个php在线邮件批量发送的程序来着。如果是一人一封一封发送的话，耗时又久又资源，抄送的话，收件人就会看到其他收件人了，这种时候，密抄就最是适合了。什么是抄送、密抄？密抄的实现就是在邮件头里面，用Bcc加入邮件地址就可以了，如这种情况下，该邮件就会附带发送到126和qq这两个邮箱上，但是谁都看不出来这封邮件还发给了谁。因为是多用户系统，所以要求就是用户可以自己设置发送者的邮箱地址，即在...</summary><published>2010-10-15T02:46:00Z</published><updated>2010-10-15T02:46:00Z</updated><author><name>xin478</name><uri>http://www.cnblogs.com/xin478/</uri></author><link rel="alternate" href="http://www.cnblogs.com/xin478/archive/2010/10/15/1851968.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/xin478/archive/2010/10/15/1851968.html"/><content type="html">&lt;p&gt;这几天，在整一个php在线邮件批量发送的程序来着。如果是一人一封一封发送的话，耗时又久又资源，抄送的话，收件人就会看到其他收件人了，这种时候，密抄就最是适合了。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;什么是抄送、密抄？&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;抄送就是将一封邮件同时发给多个收件人，各收件人都可以看到其他收件人地址。抄送效果和平时发邮件时，用&amp;ldquo;，&amp;rdquo;将地址隔开的差不多&lt;br /&gt;密抄和抄送差不多，但是，各收件人都不可以看到其他收件人地址，换句话说，他收到这封邮件，根本没法知道这个是群发还是单独发送。只有发件人自己知道。&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;密抄的实现就是在邮件头里面，用&lt;strong&gt;Bcc加入邮件地址&lt;/strong&gt;就可以了，如&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;Bcc: xin478&amp;lt;xin478@126.com&amp;gt;,xin478&amp;lt;44522303@qq.com&amp;gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;这种情况下，该邮件就会附带发送到126和qq这两个邮箱上，但是谁都看不出来这封邮件还发给了谁。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;因为是多用户系统，所以要求就是用户可以自己设置发送者的邮箱地址，即在我们的页面上，他可以用任何的邮箱地址来发邮件，如gmail,yahoo,126,163....，这样收件人在查看收到的邮件时，就会看到对应的发件人。&lt;/p&gt;&#xD;
&lt;p&gt;原来做的时候感觉也不是什么难事，我原来的做法是要求用户提供发件者的SMTP信息，如服务器、端口、用户名、密码，然后通过socket连接该服务器，发送邮件。在本地测试一切OK，上传到服务器，就不行了。服务器是在美国，提示unable to connect to server smtp.xxxx.com:25，大体意思是连不上指定地址及端口，一想就觉着是可能IP受限制了（因为最近被和谐的事情太多了），换了一个SMTP地址再试试，还不行，换了很多个，还不行，这才意思到不是这个问题。看字面上又像是连接被拒绝，防火墙似的拦截，不过我心想，不能啊，这个怎么能限制了，那还让不让人发邮件啊，于是又去绕弯子，最好折腾了一个下午，没结果，终于受不了了，发了一个ticket给客服问他有没有相关的限制，结果人家回过来，一看傻了&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;&amp;ldquo;Hello,&#xD;
By default no account is allowed to connect to the SMTP servers of any other account. therefore, you should use "localhost" as the host address for SMTP and authenticate using one of your own email addresses that are listed in the cpanel.&amp;rdquo;&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;TND，他还真下得了手，限制了还hello！&lt;/p&gt;&#xD;
&lt;p&gt;那这样的话，就不能用用户提供的发件者信息来发邮件了，因为服务器的25、26端口都不能连出去。在baidu一下，发现其实很多服务器都限制了这个，因为怕用户用这个来群发垃圾邮件。&lt;/p&gt;&#xD;
&lt;p&gt;没办法，换一个方法，就是在构建邮件的header信息的时候，可以人为的指定一个发件地址，这样收件人在查看信件时，看到的收件人也是这个指定的邮件地址，就可以了。于是修改发送方固定为我们的一个邮箱，然后将用户填写的发件人加入到header信息中，好后试一下，可以。&lt;/p&gt;&#xD;
&lt;p&gt;证据：&lt;img src="http://pic002.cnblogs.com/images/2010/24486/2010101510323211.gif" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;虽然显示是发件人是noreply@yoberryks.com，实际上是通过另一个邮箱发送的。这个实际上就是在邮件头里面添加的，如果用默认的mail函数的话，这东西就修改不了了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;不知道网络上有没有相关的示例，我是没有看见到，所以放上相关代码，有用的人可以参考下。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;以下代码因为是从自己写的框架里面直接复制出来的，缺少了必要的函数和类，如C,L，SArgumentException, MailStruct等，所以无法直接使用，仅做实现参考&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这个是邮件构造类&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;&amp;lt;?&#xD;
import('system.text.helper');&#xD;
/*&#xD;
 *邮件构造类，负责将邮件正文的信息编码为可供邮件发送类使用的内容（即eml内容）&#xD;
 *原型代码，未严格测试，邮件附件的好像还不能用&#xD;
 * @category   System&#xD;
 * @package  System&#xD;
 * @subpackage  Web.Mail&#xD;
 * @author    xin478 &amp;lt;xin478@126.com&amp;gt;&#xD;
 * @version $Id: mailstruct.class.php 42 2010-04-02 10:23 $&#xD;
*/&#xD;
class MailStruct&#xD;
{&#xD;
	private $mailCCs;	//抄送列表&#xD;
	private $mailBCCs;	//暗送列表&#xD;
	private $mailTo;			//收件人&#xD;
	private $mailToADD;			//收件人邮箱	&#xD;
	private $mailFrom;			//发件人		&#xD;
	private $mailFromADD;		//发件人邮箱&#xD;
	private $mailSubject;		//主题&#xD;
    private $mailReplytoADD;    //回复到&#xD;
	private $mailMessage;		//信件主体&#xD;
	private $mailAttachments=array();	//附件&#xD;
	private $isHtml=false;&#xD;
	private $isNotify=false;&#xD;
	private $charset='utf-8';&#xD;
	private $boundary;&#xD;
	&#xD;
	public function __construct()&#xD;
	{&#xD;
		if (!defined('CRLF')) define('CRLF', "\r\n");&#xD;
		$this-&amp;gt;boundary ='====='.md5(rand()).'=====';&#xD;
	}&#xD;
	public function MailReplytoADD($mailaddress=null)&#xD;
	{&#xD;
		if( empty($mailaddress) ) return $this-&amp;gt;mailToADD;&#xD;
		else&#xD;
		{&#xD;
			if(!VerifyHelper::isEmail($mailaddress)) throw new SArgumentException( sprintf(L('_INVALID_EMAIL_ADDRESS'),$mailaddress) );&#xD;
			$this-&amp;gt;mailReplytoADD=$mailaddress;&#xD;
		}&#xD;
	}&#xD;
	public function MailTo($name=null)&#xD;
	{&#xD;
		if( empty($name) ) return $this-&amp;gt;mailTo; &#xD;
		else $this-&amp;gt;mailTo=$name;&#xD;
	}&#xD;
	public function MailToAddress($mailaddress=null)&#xD;
	{&#xD;
		if( empty($mailaddress) ) return $this-&amp;gt;mailToADD; &#xD;
		else&#xD;
		{&#xD;
			if(!VerifyHelper::isEmail($mailaddress)) throw new SArgumentException( sprintf(L('_INVALID_EMAIL_ADDRESS'),$mailaddress) ); &#xD;
			$this-&amp;gt;mailToADD=$mailaddress;&#xD;
		}&#xD;
	}&#xD;
	public function MailFrom($name=null)&#xD;
	{&#xD;
		if( empty($name) ) return $this-&amp;gt;mailFrom; &#xD;
		else $this-&amp;gt;mailFrom=$name;&#xD;
	}&#xD;
	public function MailFromAddress($mailaddress=null)&#xD;
	{&#xD;
		if( empty($mailaddress) ) return $this-&amp;gt;mailFromADD; &#xD;
		else&#xD;
		{&#xD;
			if(!VerifyHelper::isEmail($mailaddress)) throw new SArgumentException( sprintf(L('_INVALID_EMAIL_ADDRESS'),$mailaddress) );&#xD;
			$this-&amp;gt;mailFromADD=$mailaddress;&#xD;
		}&#xD;
	}&#xD;
	public function MailCC()&#xD;
	{&#xD;
		return is_array($this-&amp;gt;mailCCs) &amp;amp;&amp;amp; count($this-&amp;gt;mailCCs)&amp;gt;0 ? $this-&amp;gt;mailCCs : false;&#xD;
	}&#xD;
	public function MailBCC()&#xD;
	{&#xD;
		return is_array($this-&amp;gt;mailBCCs) &amp;amp;&amp;amp; count($this-&amp;gt;mailBCCs)&amp;gt;0 ? $this-&amp;gt;mailBCCs : false;&#xD;
	}&#xD;
	public function MailSubject($subject=null)&#xD;
	{&#xD;
		if(isset($subject)) $this-&amp;gt;mailSubject=$subject;&#xD;
		else return $this-&amp;gt;mailSubject;&#xD;
	}&#xD;
	public function MailMessage($message=null)&#xD;
	{&#xD;
		if(isset($message)) $this-&amp;gt;mailMessage=ltrim($message);&#xD;
		else return $this-&amp;gt;mailMessage;&#xD;
	}&#xD;
	public function IsHtml($isHtml=null)&#xD;
	{&#xD;
		if(isset($isHtml)) $this-&amp;gt;isHtml=$isHtml;&#xD;
		else return $this-&amp;gt;isHtml;&#xD;
	}	&#xD;
	public function IsNotify($isNotify=null)&#xD;
	{&#xD;
		if(isset($isNotify)) $this-&amp;gt;isNotify=$isNotify;&#xD;
		else return $this-&amp;gt;isNotify;&#xD;
	}&#xD;
	public function Charset($charset=null)&#xD;
	{&#xD;
		if(empty($charset)) return $this-&amp;gt;charset;&#xD;
		else $this-&amp;gt;charset=$charset;&#xD;
	}&#xD;
&#xD;
    private function encodeEmail($address,$user=false)&#xD;
    {&#xD;
        if($user) return '&amp;lt;'.$address.'&amp;gt;';&#xD;
        else return '"=?'.$this-&amp;gt;charset.'?B?' . base64_encode( $user ) . '?=" &amp;lt;' . $address. '&amp;gt;"';&#xD;
    }&#xD;
	public function getHeader()&#xD;
	{	&#xD;
				&#xD;
		$headers='';&#xD;
		&#xD;
		$headers.= 'Date: ' . gmdate('D, j M Y H:i:s') . ' +0000'.CRLF;&#xD;
		$headers.= 'From: '.$this-&amp;gt;encodeEmail($this-&amp;gt;mailFromADD,$this-&amp;gt;mailFrom).CRLF;&#xD;
		if( $this-&amp;gt;mailReplytoADD) $headers.='Reply-TO: '. $this-&amp;gt;mailFromADD . '&amp;gt;'.CRLF;&#xD;
        &#xD;
        if( $this-&amp;gt;mailToADD)&#xD;
                $headers.= 'To: '.$this-&amp;gt;encodeEmail($this-&amp;gt;mailToADD,$this-&amp;gt;mailTo).CRLF;&#xD;
        &#xD;
		if( is_array($this-&amp;gt;mailCCs) &amp;amp;&amp;amp; count($this-&amp;gt;mailCCs)&amp;gt;0)&#xD;
		{&#xD;
			foreach($this-&amp;gt;mailCCs as $k=&amp;gt;$v) $ccs.=' '.$this-&amp;gt;encodeEmail($k,$v).',';&#xD;
			if(isset($ccs)) $headers.='Cc: '.substr($ccs,0,-1).CRLF;&#xD;
		}	 &#xD;
&#xD;
		$headers.= 'Subject: =?'.$this-&amp;gt;charset.'?B?' . base64_encode($this-&amp;gt;mailSubject).'?=' . CRLF;&#xD;
		$headers.= 'Message-ID: &amp;lt;' . time() .   '.' . $this-&amp;gt;mailFromADD . '&amp;gt;'.CRLF;		&#xD;
		$headers.= 'Mime-Version: 1.0'."".CRLF;  &#xD;
		&#xD;
		if ($this-&amp;gt;isNotify)&#xD;
			$headers.= 'Disposition-Notification-To: =?'.$this-&amp;gt;charset.'?B?' . base64_encode($this-&amp;gt;mailFrom) . '?='.'" &amp;lt;' . $this-&amp;gt;mailFromADD . '&amp;gt;'.CRLF;&#xD;
		&#xD;
		if(count($this-&amp;gt;mailAttachments)==0)&#xD;
			$headers.= 'Content-Type: multipart/alternative;'.CRLF."\t".'boundary="'.$this-&amp;gt;boundary.'"'.CRLF;&#xD;
		else &#xD;
			$headers.= 'Content-Type: multipart/mixed;'.CRLF."\t".'boundary="'.$this-&amp;gt;boundary.'"'.CRLF;		&#xD;
		$headers.=CRLF.CRLF.CRLF;&#xD;
		&#xD;
		return str_replace(CRLF . '.', CRLF . '..', $headers);&#xD;
		&#xD;
	}&#xD;
	public function getMessage()&#xD;
	{	&#xD;
		$bodys="";&#xD;
		$bodys.= "This is a multi-part message in MIME format.".CRLF.CRLF;&#xD;
		&#xD;
		$bodys.= "--" . $this-&amp;gt;boundary.CRLF;&#xD;
		$bodys.= "Content-Type: text/plain;".CRLF."\tcharset=\"us-ascii\"".CRLF;&#xD;
		$bodys.= "Content-Transfer-Encoding: base64".CRLF.CRLF;&#xD;
		$bodys.= base64_encode(strip_tags(str_replace('&amp;lt;br/&amp;gt;',"\n",$this-&amp;gt;mailMessage))).CRLF.CRLF;&#xD;
		&#xD;
		$bodys.= "--" . $this-&amp;gt;boundary.CRLF;&#xD;
		&#xD;
		if($this-&amp;gt;isHtml)&#xD;
		{&#xD;
			$bodys.= "Content-Type: text/html;".CRLF."\tcharset=\"us-ascii\"".CRLF;&#xD;
			$bodys.= 'Content-Transfer-Encoding: base64'.CRLF.CRLF;&#xD;
			$bodys.=base64_encode($this-&amp;gt;mailMessage).CRLF.CRLF;&#xD;
		}&#xD;
        &#xD;
		foreach($this-&amp;gt;mailAttachments as $filename)&#xD;
		{				&#xD;
			$contentType = self::getContentType($filename);&#xD;
			$attachment = base64_encode(file_get_contents($filename));&#xD;
			$attachment = chunk_split($attachment);&#xD;
			&#xD;
			$bodys.= "--".$this-&amp;gt;boundary.CRLF; &#xD;
			$bodys.= "Content-type: " . $contentType . "; name=".basename($filename) .CRLF;&#xD;
			$bodys.= "Content-disposition: attachment; filename=".basename($filename) .CRLF;&#xD;
			$bodys.= "Content-transfer-encoding: base64".CRLF.CRLF;&#xD;
			$bodys.= $attachment .CRLF.CRLF;&#xD;
		} &#xD;
		$bodys.= "--" . $this-&amp;gt;boundary."--".CRLF;&#xD;
		&#xD;
		$bodys    = str_replace(CRLF . '.', CRLF . '..', $bodys);&#xD;
		$bodys    = substr($bodys, 0, 1) == '.' ? '.' . $bodys : $bodys;&#xD;
&#xD;
		return $bodys;&#xD;
	}&#xD;
	public function addBCC($mailaddress,$name=null)&#xD;
	{&#xD;
		if(!VerifyHelper::isEmail($mailaddress)) throw new SArgumentException( sprintf(L('_INVALID_EMAIL_ADDRESS'),$mailaddress) ); &#xD;
		&#xD;
		$address=strtolower($mailaddress);&#xD;
		$this-&amp;gt;mailBCCs[$address]= empty($name)? substr($address,0, strpos($address,'@')) : $name;&#xD;
	}&#xD;
	public function addCC($mailaddress,$name=null)&#xD;
	{&#xD;
		if(!VerifyHelper::isEmail($mailaddress)) throw new SArgumentException( sprintf(L('_INVALID_EMAIL_ADDRESS'),$mailaddress) ); &#xD;
		&#xD;
		$address=strtolower($mailaddress);&#xD;
		$this-&amp;gt;mailCCs[$address]= empty($name)? substr($address,0, strpos($address,'@')) : $name;&#xD;
	}&#xD;
	public function addAttachments($path)&#xD;
	{&#xD;
		if(!in_array($path,$this-&amp;gt;mailAttachments)) $this-&amp;gt;mailAttachments[]=$path;&#xD;
	}&#xD;
	&#xD;
	static function getContentType($inFileName)&#xD;
	{   &#xD;
		//--去除路径   &#xD;
		$inFileName = basename($inFileName);   &#xD;
		//--去除没有扩展名的文件   &#xD;
		if(strrchr($inFileName, ".") == false)&#xD;
		{  &#xD;
			return "application/octet-stream";  &#xD;
		}  &#xD;
		//--提区扩展名并进行判断   &#xD;
		$extension = strrchr($inFileName, ".");   &#xD;
		switch($extension){   &#xD;
			case ".gif": return "image/gif";  &#xD;
			case ".gz": return "application/x-gzip";  &#xD;
			case ".htm": return "text/html"; &#xD;
			case ".html": return "text/html";   &#xD;
			case ".jpg": return "image/jpeg";   &#xD;
			case ".tar": return "application/x-tar";   &#xD;
			case ".txt": return "text/plain";   &#xD;
			case ".zip": return "application/zip";   &#xD;
			default: return "application/octet-stream";   &#xD;
		}     &#xD;
	}  &#xD;
	&#xD;
} &#xD;
?&amp;gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这个是邮件发送类&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;&amp;lt;?php&#xD;
/**&#xD;
 * 利用SOCKET发送SMTP邮件&#xD;
 * 因为是从自己写的框架里面直接复制出来的，直接使用不能使用，少了几个函数和类，如C,L，SArgumentException等，所以仅做参考&#xD;
 */&#xD;
&#xD;
class SocketSmtp&#xD;
{&#xD;
&#xD;
	private $host,$port,$user,$pass,$auth;&#xD;
	private $timeout = 10;&#xD;
	private $socket;&#xD;
	private $helo='localhost';&#xD;
	private $status=0;&#xD;
	&#xD;
	public function __construct($host,$user='',$pass='',$port=25,$auth=1)&#xD;
	{&#xD;
		if (!defined('CRLF')) define('CRLF', "\r\n");&#xD;
		$this-&amp;gt;host=$host;&#xD;
		$this-&amp;gt;port=$port;&#xD;
		$this-&amp;gt;helo=$host;&#xD;
		$this-&amp;gt;user=$user;&#xD;
		$this-&amp;gt;pass=$pass;&#xD;
		$this-&amp;gt;auth=$auth;&#xD;
	}&#xD;
	&#xD;
	/**&#xD;
     * 获取或设置连接超时时长(秒)&#xD;
     * @param &amp;lt;int&amp;gt; $second&#xD;
     * @return &amp;lt;int&amp;gt; &#xD;
     */&#xD;
    public function timeOut($second=null)&#xD;
	{&#xD;
		if( is_numeric($second) &amp;amp;&amp;amp; $second&amp;gt;0) $this-&amp;gt;timeout=$second;&#xD;
		else return $this-&amp;gt;timeout;&#xD;
	}&#xD;
&#xD;
    /**&#xD;
     * 发送指定邮件并返回是否成功&#xD;
     * @param MailStruct $mail&#xD;
     * @return &amp;lt;bool&amp;gt;&#xD;
     */&#xD;
	public function Send($mail)&#xD;
	{&#xD;
		if(! $mail instanceof MailStruct) throw new SArgumentException(L('_INVALID_ARGUMENT_TYPE_','MailStruct'),$mail);		&#xD;
		&#xD;
		if(!$this-&amp;gt;connect() || !$this-&amp;gt;auth() || !$this-&amp;gt;mail( $mail-&amp;gt;MailFromAddress() )) return false;&#xD;
&#xD;
        $arrToEmail = array();&#xD;
		if($mail-&amp;gt;mailCC() )&#xD;
		{&#xD;
			$ccs=array_keys($mail-&amp;gt;mailCC());&#xD;
			$arrToEmail = array_merge($arrToEmail,$ccs );&#xD;
		}&#xD;
		if($mail-&amp;gt;mailBCC() )&#xD;
		{&#xD;
			$bccs=array_keys($mail-&amp;gt;mailBCC());&#xD;
			$arrToEmail = array_merge($arrToEmail, $bccs);&#xD;
		}&#xD;
&#xD;
        if($mail-&amp;gt;MailToAddress() ) $this-&amp;gt;rcpt($mail-&amp;gt;MailToAddress());&#xD;
&#xD;
&#xD;
		foreach($arrToEmail as $toEmail)&#xD;
		{&#xD;
			$this-&amp;gt;rcpt($toEmail);&#xD;
		}&#xD;
		if (!$this-&amp;gt;data()) return false;&#xD;
				&#xD;
		$this-&amp;gt;send_data($mail-&amp;gt;getHeader());&#xD;
		$this-&amp;gt;send_data('');&#xD;
		$this-&amp;gt;send_data($mail-&amp;gt;getMessage());&#xD;
		$this-&amp;gt;send_data('.');&#xD;
		&#xD;
		return (substr($this-&amp;gt;get_data(), 0, 3) === '250');		&#xD;
	}&#xD;
&#xD;
    /**&#xD;
     * 关闭连接到服务的链接&#xD;
     */&#xD;
	public function close()&#xD;
	{&#xD;
		if($this-&amp;gt;socket!=null)&#xD;
		{&#xD;
			$this-&amp;gt;send_data('QUIT');&#xD;
			@fclose($this-&amp;gt;socket);&#xD;
			$this-&amp;gt;status=0;&#xD;
			$this-&amp;gt;socket = null;&#xD;
		}&#xD;
	}&#xD;
	&#xD;
	private function mail($from)&#xD;
	{&#xD;
		if ($this-&amp;gt;send_data('MAIL FROM:&amp;lt;' . $from . '&amp;gt;')&#xD;
				&amp;amp;&amp;amp; substr($err=$this-&amp;gt;get_data(), 0, 3) === '250' )&#xD;
		{&#xD;
			&#xD;
			return true;&#xD;
		}&#xD;
		else&#xD;
		{&#xD;
			return false;&#xD;
		}&#xD;
	}&#xD;
	&#xD;
	private function auth()&#xD;
	{&#xD;
		if($this-&amp;gt;status&amp;lt;2) return false;&#xD;
		&#xD;
		if(!$this-&amp;gt;auth) return true;&#xD;
		&#xD;
		if (is_resource($this-&amp;gt;socket)&#xD;
				&amp;amp;&amp;amp; $this-&amp;gt;send_data('AUTH LOGIN')&#xD;
				&amp;amp;&amp;amp; substr($error = $this-&amp;gt;get_data(), 0, 3) === '334'&#xD;
				&amp;amp;&amp;amp; $this-&amp;gt;send_data(base64_encode($this-&amp;gt;user))            // Send username&#xD;
				&amp;amp;&amp;amp; substr($error = $this-&amp;gt;get_data(),0,3) === '334'&#xD;
				&amp;amp;&amp;amp; $this-&amp;gt;send_data(base64_encode($this-&amp;gt;pass))            // Send password&#xD;
				&amp;amp;&amp;amp; substr($error = $this-&amp;gt;get_data(),0,3) === '235' )&#xD;
		{&#xD;
			$this-&amp;gt;status=3;&#xD;
			return true;&#xD;
		}&#xD;
		else&#xD;
		{&#xD;
            throw new SystemException( L('_ERROR_AUTHORIZE_'), trim(substr($error, 3)));			&#xD;
			return false;&#xD;
		}&#xD;
	}&#xD;
	&#xD;
	private function rcpt($to)&#xD;
	{&#xD;
		if ($this-&amp;gt;send_data('RCPT TO:&amp;lt;' . $to . '&amp;gt;') &amp;amp;&amp;amp; substr($error = $this-&amp;gt;get_data(), 0, 2) === '25')&#xD;
		{&#xD;
			return true;&#xD;
		}&#xD;
		else&#xD;
		{&#xD;
            throw new SystemException( L('_ERROR_COMMAND_RESPONSE_'), trim(substr($error, 3)));&#xD;
			return false;&#xD;
		}&#xD;
	}&#xD;
	&#xD;
	private function data()&#xD;
	{&#xD;
		if (is_resource($this-&amp;gt;socket) &amp;amp;&amp;amp; $this-&amp;gt;send_data('DATA') &amp;amp;&amp;amp; substr($error = $this-&amp;gt;get_data(), 0, 3) === '354' )&#xD;
		{&#xD;
			return true;&#xD;
		}&#xD;
		else&#xD;
		{&#xD;
			throw new SystemException( L('_ERROR_COMMAND_RESPONSE_'), trim(substr($error, 3)));&#xD;
			return false;&#xD;
		}&#xD;
	}	&#xD;
	&#xD;
	private function send_data($data)&#xD;
	{&#xD;
		return fwrite($this-&amp;gt;socket, $data . CRLF, strlen($data) + 2);&#xD;
	}&#xD;
	&#xD;
	private function get_data()&#xD;
	{&#xD;
		$return = '';&#xD;
		$line   = '';&#xD;
		&#xD;
		if (is_resource($this-&amp;gt;socket))&#xD;
		{&#xD;
			while (strpos($return, CRLF) === false OR $line{3} !== ' ')&#xD;
			{&#xD;
				$line    = fgets($this-&amp;gt;socket, 512);&#xD;
				$return .= $line;&#xD;
			}&#xD;
			&#xD;
			return trim($return);&#xD;
		}&#xD;
		else&#xD;
		{&#xD;
			return '';&#xD;
		}&#xD;
	}&#xD;
	&#xD;
	private function connect()&#xD;
	{&#xD;
		if( $this-&amp;gt;status&amp;gt;0 &amp;amp;&amp;amp; is_resource($this-&amp;gt;socket)) return true;&#xD;
		&#xD;
		$this-&amp;gt;socket = fsockopen($this-&amp;gt;host, $this-&amp;gt;port, $errno, $errstr, $this-&amp;gt;timeout);&#xD;
        if(!$this-&amp;gt;socket) throw new SystemException( L('_CONNECT_SERVER_FAIL_'),$errstr);&#xD;
&#xD;
        $this-&amp;gt;get_data();&#xD;
        @stream_set_timeout($this-&amp;gt;socket, 0, 250000);&#xD;
        $this-&amp;gt;status=1;&#xD;
        $cmd=$this-&amp;gt;auth ?'EHLO ':'HELO ';&#xD;
		&#xD;
        if( $this-&amp;gt;send_data($cmd . $this-&amp;gt;helo) &amp;amp;&amp;amp; substr($error = $this-&amp;gt;get_data(), 0, 3) === '250')&#xD;
        {&#xD;
            $this-&amp;gt;status=2;&#xD;
            return true;&#xD;
        }&#xD;
        else&#xD;
        {&#xD;
            throw new SystemException( L('_ERROR_COMMAND_RESPONSE_'),  trim(substr($error, 3)));&#xD;
            return false;&#xD;
        }&#xD;
		&#xD;
	}&#xD;
}&#xD;
?&amp;gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;调用的方法如下&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;&amp;lt;?php&#xD;
$m=new MailStruct();&#xD;
$m-&amp;gt;MailSubject('test topic'); //设置标题&#xD;
$m-&amp;gt;MailMessage('this is content '); //设置正文&#xD;
$m-&amp;gt;isHtml(1); //以HTML发送&#xD;
$m-&amp;gt;MailTo('xin478'); //收件人姓名&#xD;
$m-&amp;gt;MailToAddress('44522303@qq.com'); //收件人地址&#xD;
$m-&amp;gt;MailFromAddress('xin478@126.com'); //发件人地址&#xD;
$m-&amp;gt;MailFrom( 'xin478'); //发件人姓名&#xD;
$m-&amp;gt;addBCC('bcc1@test.com','bcc person 1'); //添加密抄&#xD;
$m-&amp;gt;addCC('cc2@test.com','cc person 2'); //添加抄送&#xD;
$sock=new SocketSmtp('smtp.xxx.com','user','password',25);&#xD;
$sock-&amp;gt;Send($m);&#xD;
$sock-&amp;gt;close();&#xD;
?&amp;gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&lt;img src="http://www.cnblogs.com/xin478/aggbug/1851968.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/xin478/archive/2010/10/15/1851968.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/xin478/archive/2010/08/15/1799907.html</id><title type="text">使用VisualStudio开发php</title><summary type="text">早先在asp横行的年代，php和asp一样，大都都是html中夹杂代码，说实话，这时候IDE的确用处不是很大，倒是类似于dw之类的设计器甚为上手。现在，三层、mvc之类的思想遍地开花，使得代码和html得以分离，加之随着开发的分工和项目的增大，一个好的IDE能为编码工作提供了许多的便利。就像开发java用eclipse，.NET用visual studio一样，开发PHP也很需要一种这样的利器。常...</summary><published>2010-08-15T02:04:00Z</published><updated>2010-08-15T02:04:00Z</updated><author><name>xin478</name><uri>http://www.cnblogs.com/xin478/</uri></author><link rel="alternate" href="http://www.cnblogs.com/xin478/archive/2010/08/15/1799907.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/xin478/archive/2010/08/15/1799907.html"/><content type="html">&lt;p&gt;早先在asp横行的年代，php和asp一样，大都都是html中夹杂代码，说实话，这时候IDE的确用处不是很大，倒是类似于dw之类的设计器甚为上手。现在，三层、mvc之类的思想遍地开花，使得代码和html得以分离，加之随着开发的分工和项目的增大，一个好的IDE能为编码工作提供了许多的便利。就像开发java用eclipse，.NET用visual studio一样，开发PHP也很需要一种这样的利器。常见的php的IDE有Eclipse，NetBeans，Zend studio，vs.php等。这几个我也都用过，其中Eclipse，NetBeans，Zend studio都有win和linux的版本，也都集成了像代码感知、调试、设计、片段等的功能，都用过一阵子后发现，在windows下，个人感觉还是vsiual studio+vs.php最是好使。主要的原因就是速度。 vs的速度真的是快其他的IDE太多了，无论是从启动速度还是使用过程中资源的耗用都要好于其他3款，毕竟是微软自家的东西。&lt;/p&gt;&#xD;
&lt;p&gt;vs.php以插件形式安装到vs，现在已经出到2.9，支持visual studio2005~2010，到官网下载安装即可。默认是30天试用，可以搭配visualstudio express。安装以后，在visual studio的新建项目里就会多出来php的项目。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/xin478/WindowsLiveWriter/VisualStudiophp_12B01/image_8.png"&gt;&lt;img height="264" width="667" src="http://images.cnblogs.com/cnblogs_com/xin478/WindowsLiveWriter/VisualStudiophp_12B01/image_thumb_3.png" alt="image" border="0" title="image" style="display: inline; border-width: 0px;" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;当然也支持一个解决方案，多个项目。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/xin478/WindowsLiveWriter/VisualStudiophp_12B01/image_4.png"&gt;&lt;img height="612" width="191" src="http://images.cnblogs.com/cnblogs_com/xin478/WindowsLiveWriter/VisualStudiophp_12B01/image_thumb_1.png" alt="image" border="0" title="image" style="display: inline; border-width: 0px;" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;vs.php在启动的时候，会自动扫描包含在项目里的php文件，并加载到代码自动感知里。同时，未避免加载太多的感知支持，默认并没有加载不常用的php扩展的感知支持，如果有需要的话，可以右键项目，选择Add Php Module, 在列表里选择要添加的扩展，如图。 如果要对项目外的文件添加感知，也可以通过右键项目，选择Add Php Refence，选择文件添加支持。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/xin478/WindowsLiveWriter/VisualStudiophp_12B01/image_10.png"&gt;&lt;img height="387" width="494" src="http://images.cnblogs.com/cnblogs_com/xin478/WindowsLiveWriter/VisualStudiophp_12B01/image_thumb_4.png" alt="image" border="0" title="image" style="display: inline; border-width: 0px;" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;需要调试的话，可以编辑项目属性，这里的话，有个不太好的地方就是Start page一定要设置，不然无法启动调试，而且按F5运行调试时，就是打开这个起始页，没办法像ASP.NET那样，运行当前打开的页面。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/xin478/WindowsLiveWriter/VisualStudiophp_12B01/image_12.png"&gt;&lt;img height="180" width="509" src="http://images.cnblogs.com/cnblogs_com/xin478/WindowsLiveWriter/VisualStudiophp_12B01/image_thumb_5.png" alt="image" border="0" title="image" style="display: inline; border-width: 0px;" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;你可以根据需要选择调试的模式等配置，当然，如果你觉得有的东西老改麻烦的话，也可以通过修改vs.php的配置来一劳永逸。vs.php内带了一个apache2.2在安装目录下，所以，选择调试的时候，你可以决定用内置的apache还是服务器的apache，同时，安装目录下有PHP4,PHP5的目录，里面的东西也可以修改使用，诸如php.ini。如果使用xdebug来调试的话，推荐修改下php5下的php-xdebug.ini，添加修改下&lt;/p&gt;&#xD;
&lt;p&gt;[XDebug]    &lt;br /&gt;xdebug.idekey = vsphp     &lt;br /&gt;xdebug.auto_trace=On     &lt;br /&gt;xdebug.collect_params=On&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;xdebug.collect_return=On&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;xdebug.trace_output_dir="d:/x-debuginfo"     &lt;br /&gt;xdebug.profiler_enable=On&amp;nbsp;&amp;nbsp;&amp;nbsp; ;打开效能监测器     &lt;br /&gt;xdebug.profiler_output_dir="d:/x-debuginfo"&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;xdebug.default_enable = On     &lt;br /&gt;xdebug.show_mem_delta=On&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这样，调试时就会输出调试信息到d:/x-debuginfo，再使用WinCacheGrind来查看这个执行的CPU，内存使用情况，函数执行时间，尤其方便进行性能优化。如&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/xin478/WindowsLiveWriter/VisualStudiophp_12B01/image_16.png"&gt;&lt;img height="200" width="776" src="http://images.cnblogs.com/cnblogs_com/xin478/WindowsLiveWriter/VisualStudiophp_12B01/image_thumb_7.png" alt="image" border="0" title="image" style="display: inline; border-width: 0px;" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;Language Reference目录下存放的是php的函数注解，智能感知就依赖这些文件，修改里面的注释信息，就可以改变感知时的提示，现在是全英文的，不知道会不会出一个中文的注释，期待。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在代码智能感知方面，vs.php只能打到80分这样，有的时候出不来是比较郁闷的。当然，这可能与你将类或函数分布在其他的文件里有关系，vs.php会自动解析require,include等的包含语句，并尝试加载解析这个文件，在使用实例化对象时，在当前的信息不足时，会尝试按照项目配置属性里的设置加载该文件&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/xin478/WindowsLiveWriter/VisualStudiophp_12B01/image_6.png"&gt;&lt;img height="70" width="370" src="http://images.cnblogs.com/cnblogs_com/xin478/WindowsLiveWriter/VisualStudiophp_12B01/image_thumb.png" alt="image" border="0" title="image" style="display: inline; border: 0px;" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;就如同php里面的__autoload。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;另外，规范合理的注释将为代码感知的提示提供极大的便利，尤其是对于自定义的类对象，尤为有效。就比如说，&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/xin478/WindowsLiveWriter/VisualStudiophp_12B01/image_18.png"&gt;&lt;img height="255" width="350" src="http://images.cnblogs.com/cnblogs_com/xin478/WindowsLiveWriter/VisualStudiophp_12B01/image_thumb_6.png" alt="image" border="0" title="image" style="display: inline; border: 0px;" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;这里的$this-&amp;gt;response，他并不知道是什么类型，所以任何提示都不会有，但是如果加上了类型声明 @var 类型, 那就可以正常显示该对象的成员信息、提示等&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/xin478/WindowsLiveWriter/VisualStudiophp_12B01/image_14.png"&gt;&lt;img height="369" width="531" src="http://images.cnblogs.com/cnblogs_com/xin478/WindowsLiveWriter/VisualStudiophp_12B01/image_thumb_2.png" alt="image" border="0" title="image" style="display: inline; border: 0px;" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;在断点调试方面，虽然有时候无法捕获断点，但是也算是实现了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/xin478/WindowsLiveWriter/VisualStudiophp_12B01/image_20.png"&gt;&lt;img height="235" width="348" src="http://images.cnblogs.com/cnblogs_com/xin478/WindowsLiveWriter/VisualStudiophp_12B01/image_thumb_8.png" alt="image" border="0" title="image" style="display: inline; border: 0px;" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;其实很多时候，因为这个功能的不够可靠，这种情况我还是倾向于自己输出变量查看。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;总的说来，个人比较喜欢vs.php，相比zendstudio，NetBeans等的运行速度和资源占用，这无疑是更好的选择。而且，我个人喜欢使用ASP.NET的页面搭配smarty的语法作为php的模板，比起纯粹的html模板，.NET的页面在visualstudio里面有着无可比拟的优点，例如Masterpage和usercontroller，都能正常显示，这个对于控件复用和设计而言，相当的方便。具体的模板类，有空的时候整理下再放出。&lt;/p&gt;&#xD;
&lt;p&gt;如果你还在用记事本啦，Dreamweaver之类的，不妨试试vs。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/xin478/aggbug/1799907.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/xin478/archive/2010/08/15/1799907.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/xin478/archive/2010/08/13/1798718.html</id><title type="text">mysql常用的hint[转]</title><summary type="text">对于经常使用oracle的朋友可能知道，oracle的hint功能种类很多，对于优化sql语句提供了很多方法。同样，在mysql里，也有类似的hint功能。下面介绍一些常用的。 强制索引 FORCE INDEX SELECT * FROM TABLE1 FORCE INDEX (FIELD1) … 以上的SQL语句只使用建立在FIELD1上的索引，而不使用其它字段上的索引。 忽略索引 IGNORE...</summary><published>2010-08-13T01:49:00Z</published><updated>2010-08-13T01:49:00Z</updated><author><name>xin478</name><uri>http://www.cnblogs.com/xin478/</uri></author><link rel="alternate" href="http://www.cnblogs.com/xin478/archive/2010/08/13/1798718.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/xin478/archive/2010/08/13/1798718.html"/><content type="html">&lt;p&gt;对于经常使用oracle的朋友可能知道，oracle的hint功能种类很多，对于优化sql语句提供了很多方法。同样，在mysql里，也有类似的hint功能。下面介绍一些常用的。&lt;/p&gt;  &lt;p&gt;&lt;br /&gt;&lt;strong&gt;强制索引 FORCE INDEX      &lt;br /&gt;&lt;/strong&gt;SELECT * FROM TABLE1 FORCE INDEX (FIELD1) …    &lt;br /&gt;以上的SQL语句只使用建立在FIELD1上的索引，而不使用其它字段上的索引。&lt;/p&gt;  &lt;p&gt;&lt;br /&gt;&lt;strong&gt;忽略索引 IGNORE INDEX      &lt;br /&gt;&lt;/strong&gt;SELECT * FROM TABLE1 IGNORE INDEX (FIELD1, FIELD2) …    &lt;br /&gt;在上面的SQL语句中，TABLE1表中FIELD1和FIELD2上的索引不被使用。     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;关闭查询缓冲 SQL_NO_CACHE      &lt;br /&gt;&lt;/strong&gt;SELECT SQL_NO_CACHE field1, field2 FROM TABLE1;    &lt;br /&gt;有一些SQL语句需要实时地查询数据，或者并不经常使用（可能一天就执行一两次）,这样就需要把缓冲关了,不管这条SQL语句是否被执行过，服务器都不会在缓冲区中查找，每次都会执行它。&lt;/p&gt;  &lt;p&gt;&lt;br /&gt;&lt;strong&gt;强制查询缓冲 SQL_CACHE     &lt;br /&gt;&lt;/strong&gt;SELECT SQL_CALHE * FROM TABLE1;    &lt;br /&gt;如果在my.ini中的query_cache_type设成2，这样只有在使用了SQL_CACHE后，才使用查询缓冲。 &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;优先操作 HIGH_PRIORITY     &lt;br /&gt;&lt;/strong&gt;HIGH_PRIORITY可以使用在select和insert操作中，让MYSQL知道，这个操作优先进行。    &lt;br /&gt;SELECT HIGH_PRIORITY * FROM TABLE1;&lt;/p&gt;  &lt;p&gt;&lt;br /&gt;&lt;strong&gt;滞后操作 LOW_PRIORITY&lt;/strong&gt;    &lt;br /&gt;LOW_PRIORITY可以使用在insert和update操作中，让mysql知道，这个操作滞后。    &lt;br /&gt;update LOW_PRIORITY table1 set field1= where field1= …&lt;/p&gt;  &lt;p&gt;&lt;br /&gt;&lt;strong&gt;延时插入 INSERT DELAYED     &lt;br /&gt;&lt;/strong&gt;INSERT DELAYED INTO table1 set field1= …    &lt;br /&gt;INSERT DELAYED INTO，是客户端提交数据给MySQL，MySQL返回OK状态给客户端。而这是并不是已经将数据插入表，而是存储在内存里面等待排队。当mysql有空余时，再插入。另一个重要的好处是，来自许多客户端的插入被集中在一起，并被编写入一个块。这比执行许多独立的插入要快很多。坏处是，不能返回自动递增的ID，以及系统崩溃时，MySQL还没有来得及插入数据的话，这些数据将会丢失。 &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;强制连接顺序 STRAIGHT_JOIN&lt;/strong&gt;    &lt;br /&gt;SELECT TABLE1.FIELD1, TABLE2.FIELD2 FROM TABLE1 STRAIGHT_JOIN TABLE2 WHERE …    &lt;br /&gt;由上面的SQL语句可知，通过STRAIGHT_JOIN强迫MySQL按TABLE1、TABLE2的顺序连接表。如果你认为按自己的顺序比MySQL推荐的顺序进行连接的效率高的话，就可以通过STRAIGHT_JOIN来确定连接顺序。&lt;/p&gt;  &lt;p&gt;&lt;br /&gt;&lt;strong&gt;强制使用临时表 SQL_BUFFER_RESULT&lt;/strong&gt;    &lt;br /&gt;SELECT SQL_BUFFER_RESULT * FROM TABLE1 WHERE …     &lt;br /&gt;当我们查询的结果集中的数据比较多时，可以通过SQL_BUFFER_RESULT.选项强制将结果集放到临时表中，这样就可以很快地释放MySQL的表锁（这样其它的SQL语句就可以对这些记录进行查询了），并且可以长时间地为客户端提供大记录集。&lt;/p&gt;  &lt;p&gt;&lt;br /&gt;&lt;strong&gt;分组使用临时表 SQL_BIG_RESULT和SQL_SMALL_RESULT     &lt;br /&gt;&lt;/strong&gt;SELECT SQL_BUFFER_RESULT FIELD1, COUNT(*) FROM TABLE1 GROUP BY FIELD1;    &lt;br /&gt;一般用于分组或DISTINCT关键字，这个选项通知MySQL，如果有必要，就将查询结果放到临时表中，甚至在临时表中进行排序。SQL_SMALL_RESULT比起SQL_BIG_RESULT差不多，很少使用。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/xin478/aggbug/1798718.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/xin478/archive/2010/08/13/1798718.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/xin478/archive/2010/08/03/1791310.html</id><title type="text">php垃圾代码优化那档子事</title><summary type="text">公司有几个网站搭在美国的虚拟主机上，服务器上的mysql服务差不多每一天都会突然不知什么时候挂掉，然后过一会又恢复了，怀疑是超出cpu的使用限制而被自动结束了，但是实际上该服务器上的流量很小。于是早先的时候联系了服务器提供商的印度阿三客服，想看看是不是其他用户搞多了害的大家一起死，阿三们查找了之后，信誓旦旦的拍着长毛的胸部保证不是他们的问题，事情没有解决。悬着不是个事，只好自己查了，好在可以访问到...</summary><published>2010-08-03T07:54:00Z</published><updated>2010-08-03T07:54:00Z</updated><author><name>xin478</name><uri>http://www.cnblogs.com/xin478/</uri></author><link rel="alternate" href="http://www.cnblogs.com/xin478/archive/2010/08/03/1791310.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/xin478/archive/2010/08/03/1791310.html"/><content type="html">&lt;p&gt;公司有几个网站搭在美国的虚拟主机上，服务器上的mysql服务差不多每一天都会突然不知什么时候挂掉，然后过一会又恢复了，怀疑是超出cpu的使用限制而被自动结束了，但是实际上该服务器上的流量很小。于是早先的时候联系了服务器提供商的印度阿三客服，想看看是不是其他用户搞多了害的大家一起死，阿三们查找了之后，信誓旦旦的拍着长毛的胸部保证不是他们的问题，事情没有解决。悬着不是个事，只好自己查了，好在可以访问到information_schema库，看了看，没话了，user_statistics里面的数据显示我们的一个mysql用户在busy_time，cpu_time等指标上都高到不行，自己的事，好在阿三没有发现。于是赶紧查程序，之前的这个网站程序不是由我做的，但是知道里面问题很多，架构到实现都有问题，但是页面不是一般的多，代码夹杂着html，全看过去还不死，(这种时候就尤为的觉着mvc多美妙)，平时能凑合着运行就可以了，反正没有什么访问量。&lt;/p&gt;&#xD;
&lt;p&gt;既然是mysql的负担重，那就先找这个，本地上搞一个网站的镜像运行下，在my.ini里修改添加&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;[&lt;/span&gt;&lt;span style="color: #800000;"&gt;mysqld&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;log&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;d:/temp/mysql.log&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;log_slow_queries&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;d:/temp/mysql_slow.log&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;long_query_time&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;div &gt;&#xD;
&lt;pre &gt;$sql1="select pz_area.aid,pz_area.ename,tb1.cc from pz_area right join (SELECT aid,count(*) as cc FROM pz_content WHERE uid=$uid group by aid) as tb1 on pz_area.aid=tb1.aid";&#xD;
$rs1=$db-&amp;gt;query($sql1);&#xD;
if(is_array($rs1)){&#xD;
　　foreach($rs1 as $r1){&#xD;
输出...&#xD;
　　 echo $r1-&amp;gt;ename;&#xD;
　　}&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
这个目录是要已经存在的。重启mysql服务，就可以记录了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;查看sql记录后大吃一惊，查询的数量惊人，随便一个页面，sql查询都在几十条，多的有上千条！&lt;/p&gt;&#xD;
&lt;p&gt;以论坛来说吧，一个页面的数据库查询次数也就是10次一下，用了缓存的还可以再低。这样算的话，就相当于原来几十倍的负担，能不挂？&lt;/p&gt;&#xD;
&lt;div id="cnblogs_code_open_a7b5f2a4-892e-4563-ae24-4bf6c323267b" &gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;             &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;14&lt;/span&gt;&lt;span style="color: #000000;"&gt; Query       &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;SELECT&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;FROM&lt;/span&gt;&lt;span style="color: #000000;"&gt; pz_content &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;WHERE&lt;/span&gt;&lt;span style="color: #000000;"&gt; uid&lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;19&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;and&lt;/span&gt;&lt;span style="color: #000000;"&gt; sec_id&lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;10&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;and&lt;/span&gt;&lt;span style="color: #000000;"&gt; aid&lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;688&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;and&lt;/span&gt;&lt;span style="color: #000000;"&gt; pic_url&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;''&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;             &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;14&lt;/span&gt;&lt;span style="color: #000000;"&gt; Query       &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;select&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;from&lt;/span&gt;&lt;span style="color: #000000;"&gt; pz_area &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;where&lt;/span&gt;&lt;span style="color: #000000;"&gt; aid&lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;688&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;             &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;14&lt;/span&gt;&lt;span style="color: #000000;"&gt; Query       &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;SELECT&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;FROM&lt;/span&gt;&lt;span style="color: #000000;"&gt; pz_content &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;WHERE&lt;/span&gt;&lt;span style="color: #000000;"&gt; uid&lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;19&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;and&lt;/span&gt;&lt;span style="color: #000000;"&gt; sec_id&lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;10&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;and&lt;/span&gt;&lt;span style="color: #000000;"&gt; aid&lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;689&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;and&lt;/span&gt;&lt;span style="color: #000000;"&gt; pic_url&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;''&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;             &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;14&lt;/span&gt;&lt;span style="color: #000000;"&gt; Query       &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;select&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;from&lt;/span&gt;&lt;span style="color: #000000;"&gt; pz_area &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;where&lt;/span&gt;&lt;span style="color: #000000;"&gt; aid&lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;689&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;             &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;14&lt;/span&gt;&lt;span style="color: #000000;"&gt; Query       &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;SELECT&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;FROM&lt;/span&gt;&lt;span style="color: #000000;"&gt; pz_content &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;WHERE&lt;/span&gt;&lt;span style="color: #000000;"&gt; uid&lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;19&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;and&lt;/span&gt;&lt;span style="color: #000000;"&gt; sec_id&lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;10&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;and&lt;/span&gt;&lt;span style="color: #000000;"&gt; aid&lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;690&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;and&lt;/span&gt;&lt;span style="color: #000000;"&gt; pic_url&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;''&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;             &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;14&lt;/span&gt;&lt;span style="color: #000000;"&gt; Query       &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;select&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;from&lt;/span&gt;&lt;span style="color: #000000;"&gt; pz_area &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;where&lt;/span&gt;&lt;span style="color: #000000;"&gt; aid&lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;690&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;             &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;14&lt;/span&gt;&lt;span style="color: #000000;"&gt; Query       &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;SELECT&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;FROM&lt;/span&gt;&lt;span style="color: #000000;"&gt; pz_content &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;WHERE&lt;/span&gt;&lt;span style="color: #000000;"&gt; uid&lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;19&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;and&lt;/span&gt;&lt;span style="color: #000000;"&gt; sec_id&lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;10&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;and&lt;/span&gt;&lt;span style="color: #000000;"&gt; aid&lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;691&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;and&lt;/span&gt;&lt;span style="color: #000000;"&gt; pic_url&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;''&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;             &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;14&lt;/span&gt;&lt;span style="color: #000000;"&gt; Query       &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;select&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;from&lt;/span&gt;&lt;span style="color: #000000;"&gt; pz_area &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;where&lt;/span&gt;&lt;span style="color: #000000;"&gt; aid&lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;691&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;             &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;14&lt;/span&gt;&lt;span style="color: #000000;"&gt; Query       &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;SELECT&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;FROM&lt;/span&gt;&lt;span style="color: #000000;"&gt; pz_content &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;WHERE&lt;/span&gt;&lt;span style="color: #000000;"&gt; uid&lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;19&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;and&lt;/span&gt;&lt;span style="color: #000000;"&gt; sec_id&lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;10&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;and&lt;/span&gt;&lt;span style="color: #000000;"&gt; aid&lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;692&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;and&lt;/span&gt;&lt;span style="color: #000000;"&gt; pic_url&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;''&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;             &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;14&lt;/span&gt;&lt;span style="color: #000000;"&gt; Query       &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;select&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;from&lt;/span&gt;&lt;span style="color: #000000;"&gt; pz_area &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;where&lt;/span&gt;&lt;span style="color: #000000;"&gt; aid&lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;692&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;             &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;14&lt;/span&gt;&lt;span style="color: #000000;"&gt; Query       &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;SELECT&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;FROM&lt;/span&gt;&lt;span style="color: #000000;"&gt; pz_content &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;WHERE&lt;/span&gt;&lt;span style="color: #000000;"&gt; uid&lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;19&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;and&lt;/span&gt;&lt;span style="color: #000000;"&gt; sec_id&lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;10&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;and&lt;/span&gt;&lt;span style="color: #000000;"&gt; aid&lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;693&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;and&lt;/span&gt;&lt;span style="color: #000000;"&gt; pic_url&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;''&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;             &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;14&lt;/span&gt;&lt;span style="color: #000000;"&gt; Query       &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;select&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;from&lt;/span&gt;&lt;span style="color: #000000;"&gt; pz_area &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;where&lt;/span&gt;&lt;span style="color: #000000;"&gt; aid&lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;693&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;             &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;14&lt;/span&gt;&lt;span style="color: #000000;"&gt; Query       &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;SELECT&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;FROM&lt;/span&gt;&lt;span style="color: #000000;"&gt; pz_content &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;WHERE&lt;/span&gt;&lt;span style="color: #000000;"&gt; uid&lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;19&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;and&lt;/span&gt;&lt;span style="color: #000000;"&gt; sec_id&lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;10&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;and&lt;/span&gt;&lt;span style="color: #000000;"&gt; aid&lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;694&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;and&lt;/span&gt;&lt;span style="color: #000000;"&gt; pic_url&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;''&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;             &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;14&lt;/span&gt;&lt;span style="color: #000000;"&gt; Query       &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;select&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;from&lt;/span&gt;&lt;span style="color: #000000;"&gt; pz_area &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;where&lt;/span&gt;&lt;span style="color: #000000;"&gt; aid&lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;694&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;谁人也不能那边有毅力写下上百条的查询啊，所以肯定是循环查询。sql语句也表明这一点。知道原因了就好改了，找到相关页面，改掉循环查询，例如，有一个页面，要显示所有地区分类和该分类下的文章数，先不考虑数据库的结构优化，就程序而言，原来的大概是这样子的&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;$sql1="SELECT aid,count(*) as cc FROM pz_content WHERE uid=$uid group by aid";&#xD;
$rs1=$db-&amp;gt;query($sql1);&#xD;
if(is_array($rs1)){&#xD;
     foreach($rs1 as $r1){&#xD;
输出...&#xD;
        echo id2name($r1-&amp;gt;aid);&#xD;
     }&#xD;
 }&#xD;
............&#xD;
function  id2name($aid)&#xD;
{&#xD;
    $sql="select ename from pz_area_a where aid_a=".$id;&#xD;
    $result=mysql_query($sql);&#xD;
    $row=mysql_fetch_object($result);&#xD;
    return $row-&amp;gt;ename;&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;先不管代码的容错，看实现就知道，他先读取了该用户的相关文章并按地区ID进行了分组和统计个数，然后再每个地区每个地区地输出地区名字，所以，如果有1w个地区，这里就要查询1w次。放上一个计时的代码，看了下，大概耗用内存6M，执行时间&lt;span style="color: #ff0000;"&gt;16秒&lt;/span&gt;，累计查询1001次&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;其实，这里是只要用一句sql就可以搞定的事情，并不需要循环。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;问题就可以解决了。重新运行下，内存耗用差不多，查询1次，CPU执行时间只有&lt;span style="color: #ff0000;"&gt;647毫秒&lt;/span&gt;，和原来的差了&lt;span style="color: #ff0000;"&gt;26倍&lt;/span&gt;！再看一下，发现这个pz_content的表，记录还算比较多的，有经常要按地区查询划分之类的，但是原来什么索引也没有。顺道在aid上加上一个索引，执行时间缩短到432毫秒。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;其实，这样的改动会带来性能上的巨大提升原因也是很明了的。&lt;/p&gt;&#xD;
&lt;p&gt;从执行机制上，对于每一次的query，libmysql都要将其做个封包，并将数据发送到mysql服务器上的3306（默认）的端口上，这个过程中，数据的封包，网络的传输、响应，都需要时间，请求数量越多，这样的重复性操作所要耗用的时间也就越多。&lt;/p&gt;&#xD;
&lt;p&gt;再者，mysql对于每次传入sql语句，都会调用mysql optimizer，其将从query parser传递过来的query进行分解拆析，分析出最优的数据检索方式，也就是sql语句的拆解优化。这过程中，首先，解析器会判断出sql的种类是select啊还是其他的，然后会对整个query做个处理，先搞掉一部分的常量表达式运算，直接整成常量值，再做一个简化，去掉些无用的过滤条件，然后分析下query中可能存在的&lt;a href="http://www.cnblogs.com/xin478/archive/2010/08/13/1798718.html" target="_blank"&gt;hint信息&lt;/a&gt;。然后根据hint信息来决定是否读取相关对象的统计信息，再根据query整成计算分析，再得出最后的执行计划。虽然mysql的sql优化不及Oracle强悍，但是实际上也要经过很多复杂的运算分析，才能得出最后的执行计划，所以，多次的sql查询，也将在这方面增加不必要的性能开销。&lt;/p&gt;&#xD;
&lt;p&gt;大家都说的，存储过程性能好。为什么好？就好在这里了。在没使用存储过程的情况下，在不会造成过分复杂的查询的前提下，减少sql的查询次数，是提升性能的途径之一。至于说能好多少，那要看具体的情况而定了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这个页面的事情算了了，先到这里，下次继续。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div id="_mcePaste"  style="position: absolute; left: -10000px; top: 866px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"&gt;（默认）&lt;/div&gt;&lt;img src="http://www.cnblogs.com/xin478/aggbug/1791310.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/xin478/archive/2010/08/03/1791310.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/xin478/archive/2010/05/07/1729573.html</id><title type="text">配置windows下php+apache+mysql环境</title><summary type="text">其实windows下php的安装配置是比linux下容易多了，加之三兄弟都是绿色的，重装系统的时候只需解压注册一下相应的服务就可以了，本方法适合初学者参考。第一次使用的对于php，直接到php官网下载并解压就可以了。这里假定解压在d:\php5\找到d:\php5\下的php.ini文件，如果没有的话，可以用php.ini-xxxxxxx的文件(php.ini-development是开发时的配置...</summary><published>2010-05-07T03:57:00Z</published><updated>2010-05-07T03:57:00Z</updated><author><name>xin478</name><uri>http://www.cnblogs.com/xin478/</uri></author><link rel="alternate" href="http://www.cnblogs.com/xin478/archive/2010/05/07/1729573.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/xin478/archive/2010/05/07/1729573.html"/><content type="html">&lt;p&gt;其实windows下php的安装配置是比linux下容易多了，加之三兄弟都是绿色的，重装系统的时候只需解压注册一下相应的服务就可以了，本方法适合初学者参考。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;第一次使用的&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;对于php，直接到&lt;a href="http://cn2.php.net/get/php-5.2.13-Win32.zip/from/a/mirror" target="_blank"&gt;&lt;strong&gt;php官网下载&lt;/strong&gt;&lt;/a&gt;并解压就可以了。这里假定解压在&lt;span style="color: #ff0000;"&gt;d:\php5\&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;找到&lt;span style="color: #ff0000;"&gt;d:\php5\&lt;/span&gt;下的php.ini文件，如果没有的话，可以用php.ini-xxxxxxx的文件(php.ini-development是开发时的配置，php.ini-produciton是部署的，php.ini-recommended是官方推荐的)，将其重命名为php.ini。打开php.ini，找到 extension_dir = &amp;ldquo;xxxxxxx"，修改extension_dir = "&lt;span style="color: #ff0000;"&gt;d:/php5/&lt;/span&gt;ext"。&lt;/p&gt;&#xD;
&lt;p&gt;extension=xxxxxx.dll的，都是对应的扩展。前面的;是注释符，将;去掉的话，就将启用该扩展，通常情况下，php_mysql.dll，php_gd2.dll是需要开启的，即&lt;br /&gt;;extension=php_mysql.dll改为&lt;/p&gt;&#xD;
&lt;p&gt;extension=php_mysql.dll。改好php.ini后保存。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;再来就是apache，没有的话可以到&lt;a href="http://apache.etoak.com/httpd/binaries/win32/httpd-2.2.15-win32-x86-no_ssl.msi" target="_blank"&gt;&lt;strong&gt;官网下载&lt;/strong&gt;&lt;/a&gt;安装，假设安装在&lt;span style="color: #ff0000;"&gt;D:\Program Files\Apache2.2\&lt;/span&gt;，打开&lt;span style="color: #ff0000;"&gt;D:\Program Files\Apache2.2\&lt;/span&gt;conf\，找到文件httpd.conf。&lt;/p&gt;&#xD;
&lt;p&gt;打开编辑，编辑LoadModule php5_module "d:/php5/php5apache2_2_filter.dll"(因为我提供的是apache2.2的下载连接，所以这里使用php5apache2_2_filter.dll，如果是apache2的话，就用php5apache2_filter.dll，这两个文件在php安装目录下是应该有的)。&lt;/p&gt;&#xD;
&lt;p&gt;接着查找PHPIniDir ,没有的话添加一行 PHPIniDir "&lt;span style="color: #ff0000;"&gt;d:\php5&lt;/span&gt;"，有的话修改一下路径，使之与php的安装目录路径一致。这个主要是让apache使用指定的php.ini文件，就不要拷贝php.ini到c：/windows/下了，省得重装系统后还要拷贝。查找一下&amp;lt;IfModule mime_module&amp;gt;节点，在&amp;lt;IfModule mime_module&amp;gt;...&amp;lt;/IfModule mime_module&amp;gt;之间添加一条&amp;nbsp;&amp;nbsp;&amp;nbsp; AddType application/x-httpd-php .php，没有这条的话，访问的php文件可能会变成下载。&lt;/p&gt;&#xD;
&lt;p&gt;Listen 80 这个是监听端口，有IIS的朋友可以设置成8080等，免得冲突。&lt;/p&gt;&#xD;
&lt;p&gt;ServerRoot 是apache的安装路径&lt;/p&gt;&#xD;
&lt;p&gt;DocumentRoot 是web主目录路径，这个文件夹要是已经存在的文件夹&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;参考最简的配置如下&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;ThreadsPerChild 250 &#xD;
MaxRequestsPerChild  0 &#xD;
&#xD;
ServerRoot "D:/Program Files/Apache2.2" &#xD;
&#xD;
Listen 8080 &#xD;
&#xD;
LoadModule actions_module modules/mod_actions.so &#xD;
LoadModule alias_module modules/mod_alias.so &#xD;
LoadModule asis_module modules/mod_asis.so &#xD;
LoadModule auth_basic_module modules/mod_auth_basic.so &#xD;
LoadModule authn_default_module modules/mod_authn_default.so &#xD;
LoadModule authn_file_module modules/mod_authn_file.so &#xD;
LoadModule authz_default_module modules/mod_authz_default.so &#xD;
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so &#xD;
LoadModule authz_host_module modules/mod_authz_host.so &#xD;
LoadModule authz_user_module modules/mod_authz_user.so &#xD;
LoadModule autoindex_module modules/mod_autoindex.so &#xD;
LoadModule cgi_module modules/mod_cgi.so &#xD;
LoadModule dir_module modules/mod_dir.so &#xD;
LoadModule env_module modules/mod_env.so &#xD;
LoadModule imagemap_module modules/mod_imagemap.so &#xD;
LoadModule include_module modules/mod_include.so &#xD;
LoadModule isapi_module modules/mod_isapi.so &#xD;
LoadModule log_config_module modules/mod_log_config.so &#xD;
LoadModule mime_module modules/mod_mime.so &#xD;
LoadModule negotiation_module modules/mod_negotiation.so &#xD;
LoadModule setenvif_module modules/mod_setenvif.so &#xD;
LoadModule userdir_module modules/mod_userdir.so &#xD;
LoadModule rewrite_module modules/mod_rewrite.so &#xD;
LoadModule vhost_alias_module modules/mod_vhost_alias.so &#xD;
LoadModule php5_module "d:/php5/php5apache2_2_filter.dll"&#xD;
&#xD;
PHPIniDir "d:\php5" &#xD;
ServerAdmin xin478@126.com &#xD;
&#xD;
ServerName 192.168.1.26:8080 &#xD;
&#xD;
DocumentRoot "f:/phpwwwroot" &#xD;
&#xD;
DefaultType text/plain &#xD;
ErrorLog logs/error.log&#xD;
LogLevel warn &#xD;
&#xD;
&amp;lt;Directory /&amp;gt; &#xD;
    Options FollowSymLinks &#xD;
    AllowOverride None &#xD;
    Order deny,allow &#xD;
    Deny from all &#xD;
    Satisfy all &#xD;
&amp;lt;/Directory&amp;gt; &#xD;
&#xD;
&amp;lt;Directory "f:/phpwwwroot"&amp;gt; &#xD;
    Options Indexes FollowSymLinks &#xD;
    AllowOverride all &#xD;
    Order allow,deny &#xD;
    Allow from all &#xD;
&amp;lt;/Directory&amp;gt; &#xD;
&#xD;
&amp;lt;Files *.php&amp;gt; &#xD;
AcceptPathInfo On &#xD;
&amp;lt;/Files&amp;gt;&#xD;
&#xD;
&amp;lt;IfModule dir_module&amp;gt; &#xD;
    DirectoryIndex index.html index.php index.htm &#xD;
&amp;lt;/IfModule&amp;gt; &#xD;
&#xD;
&amp;lt;FilesMatch "^\.ht"&amp;gt; &#xD;
    Order allow,deny &#xD;
    Deny from all &#xD;
&amp;lt;/FilesMatch&amp;gt; &#xD;
&#xD;
&amp;lt;IfModule log_config_module&amp;gt; &#xD;
&#xD;
    LogFormat "%h %l %u %t \"%r\" %&amp;gt;s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined &#xD;
    LogFormat "%h %l %u %t \"%r\" %&amp;gt;s %b" common &#xD;
&#xD;
    &amp;lt;IfModule logio_module&amp;gt; &#xD;
      LogFormat "%h %l %u %t \"%r\" %&amp;gt;s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio &#xD;
    &amp;lt;/IfModule&amp;gt; &#xD;
&#xD;
    CustomLog logs/access.log common &#xD;
&#xD;
&amp;lt;/IfModule&amp;gt; &#xD;
&#xD;
&amp;lt;IfModule alias_module&amp;gt; &#xD;
    ScriptAlias /cgi-bin/ "D:/Program Files/Apache2.2/cgi-bin/" &#xD;
&amp;lt;/IfModule&amp;gt; &#xD;
&#xD;
&amp;lt;Directory "D:/Program Files/Apache2.2/cgi-bin"&amp;gt; &#xD;
    AllowOverride all &#xD;
    Options None &#xD;
    Order allow,deny &#xD;
    Allow from all &#xD;
&amp;lt;/Directory&amp;gt; &#xD;
&#xD;
&amp;lt;IfModule mime_module&amp;gt; &#xD;
&#xD;
    AddType application/x-compress .Z &#xD;
    AddType application/x-gzip .gz .tgz &#xD;
    AddType application/x-httpd-php .php &#xD;
&#xD;
&amp;lt;/IfModule&amp;gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;div id="cnblogs_code_open_29602a77-05c2-47c0-b7ef-4962c0ac478f" &gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #000000;"&gt;ThreadsPerChild &lt;/span&gt;&lt;span style="color: #000000;"&gt;250&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;br /&gt;MaxRequestsPerChild  &lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;br /&gt;&lt;br /&gt;ServerRoot &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;D:/Program Files/Apache2.2&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;br /&gt;&lt;br /&gt;Listen &lt;/span&gt;&lt;span style="color: #000000;"&gt;8080&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;br /&gt;&lt;br /&gt;LoadModule actions_module modules/mod_actions.so &lt;br /&gt;LoadModule alias_module modules/mod_alias.so &lt;br /&gt;LoadModule asis_module modules/mod_asis.so &lt;br /&gt;LoadModule auth_basic_module modules/mod_auth_basic.so &lt;br /&gt;LoadModule authn_default_module modules/mod_authn_default.so &lt;br /&gt;LoadModule authn_file_module modules/mod_authn_file.so &lt;br /&gt;LoadModule authz_default_module modules/mod_authz_default.so &lt;br /&gt;LoadModule authz_groupfile_module modules/mod_authz_groupfile.so &lt;br /&gt;LoadModule authz_host_module modules/mod_authz_host.so &lt;br /&gt;LoadModule authz_user_module modules/mod_authz_user.so &lt;br /&gt;LoadModule autoindex_module modules/mod_autoindex.so &lt;br /&gt;LoadModule cgi_module modules/mod_cgi.so &lt;br /&gt;LoadModule dir_module modules/mod_dir.so &lt;br /&gt;LoadModule env_module modules/mod_env.so &lt;br /&gt;LoadModule imagemap_module modules/mod_imagemap.so &lt;br /&gt;LoadModule include_module modules/mod_include.so &lt;br /&gt;LoadModule isapi_module modules/mod_isapi.so &lt;br /&gt;LoadModule log_config_module modules/mod_log_config.so &lt;br /&gt;LoadModule mime_module modules/mod_mime.so &lt;br /&gt;LoadModule negotiation_module modules/mod_negotiation.so &lt;br /&gt;LoadModule setenvif_module modules/mod_setenvif.so &lt;br /&gt;LoadModule userdir_module modules/mod_userdir.so &lt;br /&gt;LoadModule rewrite_module modules/mod_rewrite.so &lt;br /&gt;LoadModule vhost_alias_module modules/mod_vhost_alias.so &lt;br /&gt;LoadModule php5_module &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;d:/php5/php5apache2_2_filter.dll&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;PHPIniDir &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;d:\php5&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;br /&gt;ServerAdmin xin478@&lt;/span&gt;&lt;span style="color: #000000;"&gt;126&lt;/span&gt;&lt;span style="color: #000000;"&gt;.com &lt;br /&gt;&lt;br /&gt;ServerName &lt;/span&gt;&lt;span style="color: #000000;"&gt;192.168.1.26&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;/span&gt;&lt;span style="color: #000000;"&gt;8080&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;br /&gt;&lt;br /&gt;DocumentRoot &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;f:/phpwwwroot&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;br /&gt;&lt;br /&gt;DefaultType text/plain &lt;br /&gt;ErrorLog logs/error.log&lt;br /&gt;LogLevel warn &lt;br /&gt;&lt;br /&gt;&amp;lt;Directory /&amp;gt; &lt;br /&gt;    Options FollowSymLinks &lt;br /&gt;    AllowOverride None &lt;br /&gt;    Order deny&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt;allow &lt;br /&gt;    Deny from all &lt;br /&gt;    Satisfy all &lt;br /&gt;&amp;lt;/Directory&amp;gt; &lt;br /&gt;&lt;br /&gt;&amp;lt;Directory &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;f:/phpwwwroot&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt; &lt;br /&gt;    Options Indexes FollowSymLinks &lt;br /&gt;    AllowOverride all &lt;br /&gt;    Order allow&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt;deny &lt;br /&gt;    Allow from all &lt;br /&gt;&amp;lt;/Directory&amp;gt; &lt;br /&gt;&lt;br /&gt;&amp;lt;Files *.php&amp;gt; &lt;br /&gt;AcceptPathInfo On &lt;br /&gt;&amp;lt;/Files&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;IfModule dir_module&amp;gt; &lt;br /&gt;    DirectoryIndex index.html index.php index.htm &lt;br /&gt;&amp;lt;/IfModule&amp;gt; &lt;br /&gt;&lt;br /&gt;&amp;lt;FilesMatch &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;^\.ht&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt; &lt;br /&gt;    Order allow&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt;deny &lt;br /&gt;    Deny from all &lt;br /&gt;&amp;lt;/FilesMatch&amp;gt; &lt;br /&gt;&lt;br /&gt;&amp;lt;IfModule log_config_module&amp;gt; &lt;br /&gt;&lt;br /&gt;    LogFormat &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;%h %l %u %t \&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;%r\&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; %&amp;gt;s %b \&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;%{Referer}i\&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; \&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;%{User-Agent}i\&lt;/span&gt;&lt;span style="color: #000000;"&gt;""&lt;/span&gt;&lt;span style="color: #000000;"&gt; combined &lt;br /&gt;    LogFormat &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;%h %l %u %t \&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;%r\&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; %&amp;gt;s %b&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; common &lt;br /&gt;&lt;br /&gt;    &amp;lt;IfModule logio_module&amp;gt; &lt;br /&gt;      LogFormat &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;%h %l %u %t \&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;%r\&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; %&amp;gt;s %b \&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;%{Referer}i\&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; \&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;%{User-Agent}i\&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; %I %O&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; combinedio &lt;br /&gt;    &amp;lt;/IfModule&amp;gt; &lt;br /&gt;&lt;br /&gt;    CustomLog logs/access.log common &lt;br /&gt;&lt;br /&gt;&amp;lt;/IfModule&amp;gt; &lt;br /&gt;&lt;br /&gt;&amp;lt;IfModule alias_module&amp;gt; &lt;br /&gt;    ScriptAlias /cgi-bin/ &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;D:/Program Files/Apache2.2/cgi-bin/&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;br /&gt;&amp;lt;/IfModule&amp;gt; &lt;br /&gt;&lt;br /&gt;&amp;lt;Directory &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;D:/Program Files/Apache2.2/cgi-bin&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt; &lt;br /&gt;    AllowOverride all &lt;br /&gt;    Options None &lt;br /&gt;    Order allow&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt;deny &lt;br /&gt;    Allow from all &lt;br /&gt;&amp;lt;/Directory&amp;gt; &lt;br /&gt;&lt;br /&gt;&amp;lt;IfModule mime_module&amp;gt; &lt;br /&gt;&lt;br /&gt;    AddType application/x-compress .Z &lt;br /&gt;    AddType application/x-gzip .gz .tgz &lt;br /&gt;    AddType application/x-httpd-php .php &lt;br /&gt;&lt;br /&gt;&amp;lt;/IfModule&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;以上，红色的地方都是路径，都要根据自己的情况改一下&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;最后就是mysql了，这个的话，也是&lt;a href="http://mysql.com/downloads/mirror.php?id=387719#mirrors" target="_blank"&gt;&lt;strong&gt;下载一份&lt;/strong&gt;&lt;/a&gt;,一路next安装，安装完毕后，到php安装文件夹下的libmysql.dll到c:/windows/system32/ 下。就可以了。自此，三个就全好了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;对于重装系统后&lt;/strong&gt;，只要配置没有大体的变动，只要再次拷贝 d:/php5/libmysql.dl l到c:/windows/system32/ 下。再运行cmd ，进入apache目录下的bin目录，运行httpd.exe &amp;ndash;k install 就可以注册apache的服务。如图&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/xin478/WindowsLiveWriter/phpwindowsphpapachemysql_9FE1/image_2.png"&gt;&lt;img style="display: inline; border: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/xin478/WindowsLiveWriter/phpwindowsphpapachemysql_9FE1/image_thumb.png" border="0" alt="image" width="453" height="175" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;系统会注册名为apache的服务，并将其设置为自动运行。&lt;/p&gt;&#xD;
&lt;p&gt;php方面，由于先前设置了php.ini在安装目录，所以没有什么要更改或拷贝的。&lt;/p&gt;&#xD;
&lt;p&gt;mysql的话，可以选择重装。不想重装的，先到mysql目录的data目录下查找*.err，删除掉，否则有时候会出现无法配置成功的情况。运行mysql安装目录下的bin\MySQLInstanceConfig.exe来重新配置。运行execute的时候，提示找不到my-template.cnf, 其实此文机是以ini文件的形式存储在mysql的根目录下（所有*.cnf文件在windows 下, 就是*.ini文件），mysql查找路径不对而已，我们可以在安装mysql的根目录看到my-template.ini文件.&lt;/p&gt;&#xD;
&lt;p&gt;具体如下：修改注册表&lt;/p&gt;&#xD;
&lt;p&gt;&amp;ldquo;HKEY_LOCAL_MACHINE/Software/Mysql AB/Mysql server 5/location&amp;rdquo; &lt;/p&gt;&#xD;
&lt;p&gt;把后面的地址改为&amp;rdquo;D:\Program Files\MySQL\MySQL Server 5.0\〃修改为my-template.ini所在目录路径即可(如：D:\Program Files\MySQL）。&lt;/p&gt;&#xD;
&lt;p&gt;如果安装的时候，mysql提示注册服务失败，不要紧张，开始-&amp;gt;运行-&amp;gt;services.msc，看看是不是已经有了名为MySql的服务，有的话就可以了。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/xin478/aggbug/1729573.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/xin478/archive/2010/05/07/1729573.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/xin478/archive/2009/12/08/1619698.html</id><title type="text">惨啊！mp4固件升级惊魂</title><summary type="text">去年的这个时候搞了一个紫光创奇MS621S，闲来无事的时候看看动画，屏幕小点但也混合。最近用久了不稳定得很，老容易卡死，可能跟我常突然拔出有关系，也可能是这家伙快挂了，前几天想找一个新的固件更新下，顺便把闪存部分修复下，没想到事大了。先说紫光的东西，这个家伙其实不做这个，在市面上的十有八九是假的，那时候就是买个杂牌。如果你去店里面买数码产品，要便宜点的，老板指定给你紫光。先不声讨这个，既然是杂牌，...</summary><published>2009-12-08T12:09:00Z</published><updated>2009-12-08T12:09:00Z</updated><author><name>xin478</name><uri>http://www.cnblogs.com/xin478/</uri></author><link rel="alternate" href="http://www.cnblogs.com/xin478/archive/2009/12/08/1619698.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/xin478/archive/2009/12/08/1619698.html"/></entry><entry><id>http://www.cnblogs.com/xin478/archive/2009/07/03/1516337.html</id><title type="text">用PHP实现POP3邮件的收取</title><summary type="text">POP协议简介本文简要说明了通过POP3协议收取邮件、MIME邮件的解码的原理；针对收取和MIME解码，提供了两个实用的PHP类，并提供了使用的样例。分为邮件收取、MIME解码两个部分。这里我们先向您介绍邮件的收取，解码部分会在以后的文章中为各位详细的介绍，敬请关注。 现在Internet上最大的应用应该是非Email莫属了，我们每天都习惯于每天通过Email进行交流，各大网站也几乎都推出了自己的...</summary><published>2009-07-03T07:00:00Z</published><updated>2009-07-03T07:00:00Z</updated><author><name>xin478</name><uri>http://www.cnblogs.com/xin478/</uri></author><link rel="alternate" href="http://www.cnblogs.com/xin478/archive/2009/07/03/1516337.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/xin478/archive/2009/07/03/1516337.html"/></entry></feed>
