<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Apache on ZRJ | 学习笔记</title>
        <link>https://blog.zrj.me/tags/apache/</link>
        <description>Recent content in Apache on ZRJ | 学习笔记</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-CN</language>
        <lastBuildDate>Tue, 25 Feb 2014 16:46:16 +0800</lastBuildDate><atom:link href="https://blog.zrj.me/tags/apache/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>手工编译 apache 的一些琐碎</title>
        <link>https://blog.zrj.me/posts/2014-02-25-%E6%89%8B%E5%B7%A5%E7%BC%96%E8%AF%91-apache-%E7%9A%84%E4%B8%80%E4%BA%9B%E7%90%90%E7%A2%8E/</link>
        <pubDate>Tue, 25 Feb 2014 16:46:16 +0800</pubDate>
        
        <guid>https://blog.zrj.me/posts/2014-02-25-%E6%89%8B%E5%B7%A5%E7%BC%96%E8%AF%91-apache-%E7%9A%84%E4%B8%80%E4%BA%9B%E7%90%90%E7%A2%8E/</guid>
        <description>&lt;p&gt;压测的时候用到 apache ab，但是 ab 本身支持的并发最大 1000，过了报错，修改源码 support/ab.c 把这行注释掉&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;apr_err&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;apr_socket_recv&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;status&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;但是编译的时候各种依赖，手工解决好烦，首先出来 undefined reference to apr 系列的函数，查到这里，&lt;a class=&#34;link&#34; href=&#34;http://hi.baidu.com/yang171892549/item/2da5f0137e6cbecf39cb303f&#34;  title=&#34;http://hi.baidu.com/yang171892549/item/2da5f0137e6cbecf39cb303f&#34;
     target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://hi.baidu.com/yang171892549/item/2da5f0137e6cbecf39cb303f&lt;/a&gt;，说了&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;collect2: ld returned 1 exit status make[1]: *** [httpd] Error 1 make[1]: Leaving directory `/tmp/httpd-2.2.22&amp;rsquo; make: *** [all-recursive] Error 1 的错误， 解决方案： 搜了下解决方案说：编译apache之前应该先安装apr和apr-util，rpm -qa看了一下都是有的，但是还是报错。 原来编译的时候 ./configure &amp;ndash;prefix=/usr/local/httpd &amp;ndash;enable-mods-shared=most &amp;ndash;with-included-apr&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;但是使用 with-included-apr 又报错，configure: error: Bundled APR requested but not found at ./srclib/. Download and unpack the corresponding apr and apr-util packages to ./srclib/.，查到这里，&lt;a class=&#34;link&#34; href=&#34;http://coolwa.blog.51cto.com/1512988/851457&#34;  title=&#34;http://coolwa.blog.51cto.com/1512988/851457&#34;
     target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://coolwa.blog.51cto.com/1512988/851457&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;执行配置安装httpd时出错 configure: error: Bundled APR requested but not found at ./srclib/. Download and unpack the corresponding apr and apr-util packages to ./srclib/. 需要下载apr和apr-utils 并解压到./srclib/, 再进行编译 #wget &lt;a class=&#34;link&#34; href=&#34;http://apache.etoak.com//apr/apr-util-1.4.1.tar.gz&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://apache.etoak.com//apr/apr-util-1.4.1.tar.gz&lt;/a&gt; #wget &lt;a class=&#34;link&#34; href=&#34;http://apache.etoak.com//apr/apr-1.4.6.tar.gz&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://apache.etoak.com//apr/apr-1.4.6.tar.gz&lt;/a&gt; #tar zxvf apr-1.4.6.tar.gz #tar zxvf apr-utli-1.4.1.tar.gz #cp -rf apr-1.4.6 httpd-2.4.1/srclib/apr #cp -rf apr-util-1.4.6 httpd-2.4.1/srclib/apr-util&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;终于编译起来，其他一些琐碎的依赖，不一一细表。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;历史评论&#34;&gt;历史评论
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;ZRJ&lt;/strong&gt; (2014-02-27 20:45:05):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;坑爹啊，压测的时候发现并发过 1000 就会出问题，一直想想不通，代码反复查，后来才发现，是跑服务进程的 ulimit -n 没改，默认估计是 1024，结果新的 fd 一直进不来，真是坑爹啊&lt;/p&gt;
&lt;/blockquote&gt;
</description>
        </item>
        <item>
        <title>从点击到呈现 — 详解一次HTTP请求（1）</title>
        <link>https://blog.zrj.me/posts/2012-09-14-%E4%BB%8E%E7%82%B9%E5%87%BB%E5%88%B0%E5%91%88%E7%8E%B0-%E8%AF%A6%E8%A7%A3%E4%B8%80%E6%AC%A1http%E8%AF%B7%E6%B1%821/</link>
        <pubDate>Fri, 14 Sep 2012 00:01:49 +0800</pubDate>
        
        <guid>https://blog.zrj.me/posts/2012-09-14-%E4%BB%8E%E7%82%B9%E5%87%BB%E5%88%B0%E5%91%88%E7%8E%B0-%E8%AF%A6%E8%A7%A3%E4%B8%80%E6%AC%A1http%E8%AF%B7%E6%B1%821/</guid>
        <description>&lt;p&gt;其实想这个内容很久了，一方面是回顾自己所学的 http 知识，另外一方面也是分享吧，因为目前为止没有看到网络上有类似我想写的东西。&lt;/p&gt;
&lt;p&gt;一般来说，很多的参考资料上面都会说，http 是一个基于请求/响应的工作模式，然后画出一张浏览器和服务器的 b/s 结构图，再画上两个箭头，表示请求和响应，应该说这么解释是易懂的，一般也是够清楚的，但是对于像我这样的考据癖来说，这么简单的解释显然是不够的，在我们点击一个网址，到它能够呈现在浏览器中，展示在我们面前，这个过程中，电脑里，网络上，究竟发生了什么事情，其实是很有意思的，也是值得去探究的。&lt;/p&gt;
&lt;p&gt;于是我想要按照自己的理解把这个过程尽可能详细的剖析出来，在行文上我打算按照时间线的方式，这样又好写，也好读，好理解。这应该会写成一个系列，刚好最近开始在看很多人都在推荐的热门书，http 权威指南，这本，&lt;a class=&#34;link&#34; href=&#34;http://book.douban.com/subject/10746113/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://book.douban.com/subject/10746113/&lt;/a&gt;，跟我想要说的差不多的，于是就一边当作是读书笔记吧&lt;/p&gt;
&lt;p&gt;那我们就开始了，故事其实并不是从在浏览器的地址栏输入一个网址，或者我们抓着鼠标点击一个链接开始，事情的开端要追溯到服务器启动监听服务的时候，在某个未知的时刻，一台机房里普普通通的刀片服务器，加上电，启动了操作系统，随着操作系统的就绪，服务器启动了 http 服务进程，这个 http 服务的守护进程，（daemon），可能是 apache，也可能是 nginx，不管怎么说，这个 http 服务进程开始定位到服务器上的 www 文件夹，一般是位于 /var/www ，然后启动了一些附属的模块，例如 php，或者，使用 fastcgi 方式连接到 php 的 fpm 管理进程，然后，向操作系统申请了一个 tcp 连接，然后绑定在了 80 端口，调用了 accept 函数，开始了默默的监听，监听着可能来自位于地球任何一个地方的请求，随时准备做出响应。&lt;/p&gt;
&lt;p&gt;这个时候，典型的情况下，机房里面应该还有一个数据库服务器，或许，还有一台缓存服务器，如果对于流量巨大的网站，那么动态脚本的解释器可能还有单独的物理机器来跑，如果是中小的站点，那么，上述的各色服务，甚至都可能在一台物理机上，这些服务监听之间的关系，可以参考这里，&lt;a class=&#34;link&#34; href=&#34;http://zrj.me/archives/294&#34;  title=&#34;再搭一次 Apache PHP MySQL 环境&#34;
     target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;再搭一次 Apache PHP MySQL 环境&lt;/a&gt;，不管怎么说，他们做好了准备，静候差遣。&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Apache ab 压力测试</title>
        <link>https://blog.zrj.me/posts/2012-08-18-apache-ab-%E5%8E%8B%E5%8A%9B%E6%B5%8B%E8%AF%95/</link>
        <pubDate>Sat, 18 Aug 2012 17:34:51 +0800</pubDate>
        
        <guid>https://blog.zrj.me/posts/2012-08-18-apache-ab-%E5%8E%8B%E5%8A%9B%E6%B5%8B%E8%AF%95/</guid>
        <description>&lt;p&gt;apache 的 ab 真的是非常容易用，直接的说，就是下面这条命令就够了&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;C:Program FilesApache Software FoundationApache2.2bin&amp;gt;ab -n 100 -c 10 http://localhost/index2.html
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这里我 index 的 html 文件就是 apache 的 it works 文件，在我的机子上，测试结果的吞吐率是 2000 多，应该算是比较低的一个数字了，对于这么简单的文本来说，正式的服务器，应该有 5000 左右，不过我的平台是 Windows 嘛。。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;C:Program FilesApache Software FoundationApache2.2bin&amp;gt;ab -n 100 -c 10 http:/
/localhost/index2.html
This is ApacheBench, Version 2.3 &amp;lt;$Revision: 655654 $&amp;gt;
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient).....done

Server Software:        Apache/2.2.22
Server Hostname:        localhost
Server Port:            80

Document Path:          /index2.html
Document Length:        44 bytes

Concurrency Level:      10
Time taken for tests:   0.049 seconds
Complete requests:      100
Failed requests:        0
Write errors:           0
Total transferred:      32000 bytes
HTML transferred:       4400 bytes
Requests per second:    2040.69 [#/sec] (mean)
Time per request:       4.900 [ms] (mean)
Time per request:       0.490 [ms] (mean, across all concurrent requests)
Transfer rate:          637.72 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.4      0       1
Processing:     2    4   2.5      3      20
Waiting:        1    4   2.5      3      19
Total:          2    5   2.5      4      20

Percentage of the requests served within a certain time (ms)
  50%      4
  66%      4
  75%      5
  80%      6
  90%      8
  95%      8
  98%      9
  99%     20
 100%     20 (longest request)

C:Program FilesApache Software FoundationApache2.2bin&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;对于一个打印 phpinfo 的 php 页面来说，成绩就更加惨不忍睹了，只有 90 多&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;C:Program FilesApache Software FoundationApache2.2bin&amp;gt;ab -n 100 -c 10 http:/
/localhost/index2.php
This is ApacheBench, Version 2.3 &amp;lt;$Revision: 655654 $&amp;gt;
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient).....done

Server Software:        Apache/2.2.22
Server Hostname:        localhost
Server Port:            80

Document Path:          /index2.php
Document Length:        67839 bytes

Concurrency Level:      10
Time taken for tests:   1.015 seconds
Complete requests:      100
Failed requests:        45
   (Connect: 0, Receive: 0, Length: 45, Exceptions: 0)
Write errors:           0
Total transferred:      6801290 bytes
HTML transferred:       6783990 bytes
Requests per second:    98.57 [#/sec] (mean)
Time per request:       101.454 [ms] (mean)
Time per request:       10.145 [ms] (mean, across all concurrent requests)
Transfer rate:          6546.67 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   1.2      0       8
Processing:     3   50 153.5     15    1012
Waiting:        3   49 153.6     13    1011
Total:          3   51 153.4     15    1012

Percentage of the requests served within a certain time (ms)
  50%     15
  66%     18
  75%     21
  80%     25
  90%     88
  95%    348
  98%   1012
  99%   1012
 100%   1012 (longest request)

C:Program FilesApache Software FoundationApache2.2bin&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;那么，如果我们把 it work 用 php echo 出来呢，就是说，送进 php 解释器里面转一圈，来看看，依然只有 90 多&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;C:Program FilesApache Software FoundationApache2.2bin&amp;gt;ab -n 100 -c 10 http:/
/localhost/index3.php
This is ApacheBench, Version 2.3 &amp;lt;$Revision: 655654 $&amp;gt;
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient).....done

Server Software:        Apache/2.2.22
Server Hostname:        localhost
Server Port:            80

Document Path:          /index3.php
Document Length:        8 bytes

Concurrency Level:      10
Time taken for tests:   1.049 seconds
Complete requests:      100
Failed requests:        0
Write errors:           0
Total transferred:      18100 bytes
HTML transferred:       800 bytes
Requests per second:    95.32 [#/sec] (mean)
Time per request:       104.906 [ms] (mean)
Time per request:       10.491 [ms] (mean, across all concurrent requests)
Transfer rate:          16.85 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.5      0       1
Processing:     2   18  99.6      8    1004
Waiting:        2   18  99.7      8    1004
Total:          2   19  99.6      9    1004

Percentage of the requests served within a certain time (ms)
  50%      9
  66%      9
  75%     10
  80%     11
  90%     13
  95%     14
  98%     31
  99%   1004
 100%   1004 (longest request)

C:Program FilesApache Software FoundationApache2.2bin&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;再来看看 php 访问数据库的时候的成绩，访问数据我们就用一条 select 语句，php 代码如下&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;mysql_connect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;localhost&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;root&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;root&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;or&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;die&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;mysql_error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;());&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;mysql_select_db&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;mailbox&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;mysql_query&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;set names gbk&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;$result&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;mysql_query&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;select * from mail where id = 118593&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;while&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$row&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;mysql_fetch_array&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$result&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;nx&#34;&gt;var_dump&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$row&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;算是非常中规中矩的读取了，结果如下，吞吐率只有 80 多&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;C:Program FilesApache Software FoundationApache2.2bin&amp;gt;ab -n 100 -c 10 http:/
/localhost/index4.php
This is ApacheBench, Version 2.3 &amp;lt;$Revision: 655654 $&amp;gt;
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient).....done

Server Software:        Apache/2.2.22
Server Hostname:        localhost
Server Port:            80

Document Path:          /index4.php
Document Length:        6108 bytes

Concurrency Level:      10
Time taken for tests:   1.157 seconds
Complete requests:      100
Failed requests:        0
Write errors:           0
Total transferred:      628100 bytes
HTML transferred:       610800 bytes
Requests per second:    86.43 [#/sec] (mean)
Time per request:       115.707 [ms] (mean)
Time per request:       11.571 [ms] (mean, across all concurrent requests)
Transfer rate:          530.12 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.4      0       1
Processing:     6  100 301.8     10    1154
Waiting:        6   99 301.8     10    1154
Total:          6  100 301.7     11    1154

Percentage of the requests served within a certain time (ms)
  50%     11
  66%     16
  75%     16
  80%     16
  90%     22
  95%   1145
  98%   1153
  99%   1154
 100%   1154 (longest request)

C:Program FilesApache Software FoundationApache2.2bin&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;那么，如果我们用 apache 把 php 的结果缓存起来呢？这个想法非常赞，可惜我这里配的是 apache fastcgi php 的模式，简单 google 了一下并没有发现相关的文章，倒是 nginx fastcgi php 的缓存有很多的讨论，也是，人家本来就是做反向代理的嘛，不过，根据高性能 web 那本书的记载，应该是可以有 5 倍左右的提升的，还是很垂涎的，呵呵。强烈推荐这本高性能 web 的书，&lt;a class=&#34;link&#34; href=&#34;http://book.douban.com/subject/3924175/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://book.douban.com/subject/3924175/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;最后插播一下，对于一台 debian 的虚拟机，成绩其实没有想象中的飞跃，这台虚拟机开的内存是 256，一样请求一个静态文件，结果如下，顺便一提，虚拟机里面跑着的是 nginx，不是 apache&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;C:Program FilesApache Software FoundationApache2.2bin&amp;gt;ab -n 1000 -c 10 http:
//192.168.128.133:8080/index.html
This is ApacheBench, Version 2.3 &amp;lt;$Revision: 655654 $&amp;gt;
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 192.168.128.133 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests

Server Software:        Apache/2.2.20
Server Hostname:        192.168.128.133
Server Port:            8080

Document Path:          /index.html
Document Length:        12 bytes

Concurrency Level:      10
Time taken for tests:   0.632 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      297000 bytes
HTML transferred:       12000 bytes
Requests per second:    1582.19 [#/sec] (mean)
Time per request:       6.320 [ms] (mean)
Time per request:       0.632 [ms] (mean, across all concurrent requests)
Transfer rate:          458.90 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   0.5      1       2
Processing:     1    6   1.1      6      19
Waiting:        0    4   1.5      4      17
Total:          2    6   1.1      6      20

Percentage of the requests served within a certain time (ms)
  50%      6
  66%      6
  75%      6
  80%      7
  90%      7
  95%      8
  98%      9
  99%     10
 100%     20 (longest request)

C:Program FilesApache Software FoundationApache2.2bin&amp;gt;
&lt;/code&gt;&lt;/pre&gt;</description>
        </item>
        <item>
        <title>再搭一次 Apache PHP MySQL 环境</title>
        <link>https://blog.zrj.me/posts/2012-08-16-%E5%86%8D%E6%90%AD%E4%B8%80%E6%AC%A1-apache-php-mysql-%E7%8E%AF%E5%A2%83/</link>
        <pubDate>Thu, 16 Aug 2012 23:24:26 +0800</pubDate>
        
        <guid>https://blog.zrj.me/posts/2012-08-16-%E5%86%8D%E6%90%AD%E4%B8%80%E6%AC%A1-apache-php-mysql-%E7%8E%AF%E5%A2%83/</guid>
        <description>&lt;p&gt;一直以来，都是使用 wamp 当作开发环境的，觉得在初期，还是快速动手开始写代码要紧，至于环境，没有什么特殊要求，就先用最典型的，所以就选择套装了。&lt;/p&gt;
&lt;p&gt;而现在感觉是时候自己动手搭一个环境了，总的教程看这里，&lt;a class=&#34;link&#34; href=&#34;http://www.leapsoul.cn/?p=695&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://www.leapsoul.cn/?p=695&lt;/a&gt;， 于是从 &lt;a class=&#34;link&#34; href=&#34;http://httpd.apache.org/download.cgi#apache22&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://httpd.apache.org/download.cgi#apache22&lt;/a&gt; 下载了 apache 2.2.22，从 &lt;a class=&#34;link&#34; href=&#34;http://www.php.net/downloads.php#v5&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://www.php.net/downloads.php#v5&lt;/a&gt; 下载了 php 5.3.16，在这里查了一下 php 5.3 和 5.4 的区别，&lt;a class=&#34;link&#34; href=&#34;http://segmentfault.com/question/215/php-5-4%E5%8D%B3%E5%B0%86%E5%88%B0%E6%9D%A5-%E7%9C%8B%E7%9C%8B%E6%9C%89%E9%82%A3%E4%BA%9B%E7%89%B9%E6%80%A7%E6%98%AF%E4%BD%A0%E6%89%80%E9%9C%80%E8%A6%81%E7%9A%84-%E4%BD%A0%E6%9C%80%E6%9C%9F%E5%BE%85%E7%9A%84%E7%89%B9%E6%80%A7%E6%98%AF%E5%93%AA%E4%BA%9B%E5%91%A2&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;link&lt;/a&gt; ，&lt;/p&gt;
&lt;blockquote&gt;
&lt;h4 id=&#34;新特性的引入&#34;&gt;新特性的引入
&lt;/h4&gt;&lt;p&gt;非常有意思的是php 5.4居然引入了scalar中Traits(特质)的概念，熟悉scalar的朋友都知道&lt;code&gt;Traits&lt;/code&gt;是一个介于&lt;code&gt;Class&lt;/code&gt;和&lt;code&gt;Interface&lt;/code&gt;之间的东西，它是抽象的定义，但是跟接口不同的是可以包括实际的方法和成员变量，而跟&lt;code&gt;abstract class&lt;/code&gt;不同的是，它可以是多重的!这将让php的oop特性更加丰富，不过我也悲观地认为这会让众多php的草根们对oop的概念更加混乱:(&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;trait A
{
    public function foo();
}

trait B
{
    public function bar()
    {
        return;
    }
}

class C
{
    use A, B;

    public function execute()
    {
        echo $this-&amp;gt;bar();
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;另一个我比较关心的特性是php 5.4中终于支持全类型的函数类型检测了，在php 5.3以前我们只能在类型检测中使用&lt;code&gt;array&lt;/code&gt;和&lt;code&gt;Class&lt;/code&gt;的检测，比如&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;function foo(array input, MyClass key) {
    return;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;但是php 5.4会支持现在php的所有内置类型了(&lt;code&gt;String&lt;/code&gt;,&lt;code&gt;Int&lt;/code&gt;,&lt;code&gt;Float&lt;/code&gt;,&lt;code&gt;Resource&lt;/code&gt;,&lt;code&gt;Bool&lt;/code&gt;等等)，这样我们就不用在函数内部写类似&lt;code&gt;is_string&lt;/code&gt;之类的函数了。&lt;/p&gt;
&lt;p&gt;还有一个让无数php开发者曾经无比纠结的问题，终于在这个php 5.4中修复了(至少我认为是修复)。那就是在函数的返回值中直接使用数组键值了&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;function func () {
    return array(1, 2, 3);
}

echo func()[1];    // 输出2
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这个看似理所当然的东西居然要等到php 5.4中才修复，要是早点修复可以节省多少变量，少排放多少二氧化碳啊。&lt;/p&gt;
&lt;p&gt;还有一个对php初学者来说的好消息，那就是php 5.4会包含一个简单的server，大家不用再去烦恼如何配置apache之类的了。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;其实，php 5.3 就已经够用了，至于 5.3 的特性，&lt;a class=&#34;link&#34; href=&#34;http://www.iteye.com/topic/1078569&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://www.iteye.com/topic/1078569&lt;/a&gt; 这里居然 google 到江阁的留言&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;和楼上一样，一直用 5.35 5.3x 中最有用的其实是静态延迟绑定，其次是命名空间。 至于 SPL 的增强，以前用数组也能模拟，现在既然有了 SPL ，我还是尽量用了。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;SPL 其实就是一个迭代器，教程的话这里有，&lt;a class=&#34;link&#34; href=&#34;http://www.ruanyifeng.com/blog/2008/07/php_spl_notes.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://www.ruanyifeng.com/blog/2008/07/php_spl_notes.html&lt;/a&gt; ，&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;SPL规定，所有部署了Iterator界面的class，都可以用在foreach Loop中。Iterator界面中包含5个必须部署的方法：&lt;/p&gt;
&lt;p&gt;* current()This method returns the current index’s value. You are solely responsible for tracking what the current index is as the interface does not do this for you.* key()&lt;/p&gt;
&lt;p&gt;This method returns the value of the current index’s key. For foreach loops this is extremely important so that the key value can be populated.&lt;/p&gt;
&lt;p&gt;* next()&lt;/p&gt;
&lt;p&gt;This method moves the internal index forward one entry.&lt;/p&gt;
&lt;p&gt;* rewind()&lt;/p&gt;
&lt;p&gt;This method should reset the internal index to the first element.&lt;/p&gt;
&lt;p&gt;* valid()&lt;/p&gt;
&lt;p&gt;This method should return true or false if there is a current element. It is called after rewind() or next().&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;然后又看到 php 的下载有线程安全和非线程安全的版本区分，他们的区别看这里，&lt;a class=&#34;link&#34; href=&#34;http://blog.bluesky.cn/archives/472/php-thread-safe-and-non-thread-safe-version-of-the-distinction-between.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://blog.bluesky.cn/archives/472/php-thread-safe-and-non-thread-safe-version-of-the-distinction-between.html&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Windows版的PHP从版本5.2.1开始有Thread Safe(线程安全)和None Thread Safe(NTS，非线程安全)之分，这两者不同在于何处？到底应该用哪种？这里做一个简单的介绍。&lt;/p&gt;
&lt;p&gt;从2000年10月20日发布的第一个Windows版的PHP3.0.17开始的都是线程安全的版本，这是由于与Linux/Unix系统是采用多进程的工作方式不同的是Windows系统是采用多线程的工作方式。如果在IIS下以CGI方式运行PHP会非常慢，这是由于CGI模式是建立在多进程的基础之上的，而非多线程。一般我们会把PHP配置成以ISAPI的方式来运行，ISAPI是多线程的方式，这样就快多了。但存在一个问题，很多常用的PHP扩展是以Linux/Unix的多进程思想来开发的，这些扩展在ISAPI的方式运行时就会出错搞垮IIS。因此在IIS下CGI模式才是PHP运行的最安全方式，但CGI模式对于每个HTTP请求都需要重新加载和卸载整个PHP环境，其消耗是巨大的。&lt;/p&gt;
&lt;p&gt;为了兼顾IIS下PHP的效率和安全，微软给出了FastCGI的解决方案。FastCGI可以让PHP的进程重复利用而不是每一个新的请求就重开一个进程。同时FastCGI也可以允许几个进程同时执行。这样既解决了CGI进程模式消耗太大的问题，又利用上了CGI进程模式不存在线程安全问题的优势。&lt;/p&gt;
&lt;p&gt;因此，如果是使用ISAPI的方式来运行PHP就必须用Thread Safe(线程安全)的版本；而用FastCGI模式运行PHP的话就没有必要用线程安全检查了，用None Thread Safe(NTS，非线程安全)的版本能够更好的提高效率。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;至于那个 Debug Pack ，这里说道，&lt;a class=&#34;link&#34; href=&#34;http://topic.csdn.net/u/20120328/09/ce3ce532-91e4-466c-b705-387d3156d8c8.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://topic.csdn.net/u/20120328/09/ce3ce532-91e4-466c-b705-387d3156d8c8.html&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;难道这不是给php开发者用来调试php代码的吗？比如类似xdebug,zend debugger，那这个包给谁用呢 当然不是给php开发者用来调试php代码的 是给 C++ 程序员开发或修改 php 扩展用的&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;至于那个 vc6 和 vc9，这里有，&lt;a class=&#34;link&#34; href=&#34;http://lzhxiaoyu.blog.51cto.com/10707/238562/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://lzhxiaoyu.blog.51cto.com/10707/238562/&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;一、如何选择PHP5.3的VC9版本和VC6版本&lt;/p&gt;
&lt;p&gt;    VC6版本是使用Visual Studio 6编译器编译的，如果你的PHP是用Apache来架设的，那你就选择VC6版本。&lt;/p&gt;
&lt;p&gt;    VC9版本是使用Visual Studio 2008编译器编译的，如果你的PHP是用IIS来架设的，那你就选择VC9版本。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;不过，php 5.3.16 开始就貌似只有 vc9 可选了&lt;/p&gt;
&lt;p&gt;注意一点的是，在配 php 的 session 存储方式的时候，这里，&lt;a class=&#34;link&#34; href=&#34;http://hi.baidu.com/whzkinger/item/6cc85c5c01fbc011db16355f&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://hi.baidu.com/whzkinger/item/6cc85c5c01fbc011db16355f&lt;/a&gt;，提到 session 是可以存在 memcached 中的，也就是说，可以用这个路子来实现单点登录，另外据说还可以存在数据库里面，这个就没有深究了。在这个安装 memcached 的帖子中提到了 pecl，于是顺手查了一下 pecl， pear， perl 的区别，这里说道 &lt;a class=&#34;link&#34; href=&#34;http://g.51cto.com/mike/61429&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://g.51cto.com/mike/61429&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Pear：是PHP的扩展代码包，所有的扩展均以PHP代码的形式出现，功能强大，安装简单，甚至可以改改就用。使用的时候，要在代码中进行Include才能够使用。&lt;/p&gt;
&lt;p&gt;Pecl：是PHP的标准扩展，可以补充实际开发中所需的功能，所有的扩展都需要安装，在Windows下面以Dll的形式出现，在linux下面，需要单独进行编译，它的表现形式为根据PHP官方的标准用C语言写成，尽管源码开放但是一般人无法随意更改源码。&lt;/p&gt;
&lt;p&gt;最直接的表述：Pear是PHP的上层扩展，Pecl是PHP的底层扩展。&lt;/p&gt;
&lt;p&gt;这是一些PHP扩展模块的集合 扩展PHP有两种方法 一种是用纯粹的PHP代码写函数和类，pear就是这样一个项目，主页是pear.php.net 另外一种是用c或者c++编写外部模块加载至php中，pecl就是干这个事的，主页是pecl.php.net这两种方法其实都是为特定的应用提供现成的函数或者类，本质上来说都是一样的&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这里的简洁明了一些，&lt;a class=&#34;link&#34; href=&#34;http://topic.csdn.net/t/20060529/09/4785160.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://topic.csdn.net/t/20060529/09/4785160.html&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;pear   一个书写的比较规范，国外较流行的工具箱代码集 pecl   php扩展包，但不属于php基本扩展范围 perl   一种早于php出现的脚本级语言，php借鉴了他的正则表达式部分&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;php 的 ini 文件配置完成之后，就可以通过命令行来测试一下 php 了，关于命令行的时候用，这里有，&lt;a class=&#34;link&#34; href=&#34;http://www.cnblogs.com/codebean/archive/2011/05/30/php-cli-argv.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://www.cnblogs.com/codebean/archive/2011/05/30/php-cli-argv.html&lt;/a&gt; ，具体到我们的例子，我们可以敲一个类似这样的命令，&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;C:Program Filesphpphp-5.3.16&amp;gt;php -r &amp;#34;echo md5(&amp;#39;123&amp;#39;);&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;http://zrj.me/wp-content/uploads/2012/08/Unnamed-QQ-Screenshot20120816173720.png&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://blog.zrj.me/images/Unnamed-QQ-Screenshot20120816173720.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;也可以复杂点，&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;C:Program Filesphpphp-5.3.16&amp;gt;php -r &amp;#34;var_dump(file(&amp;#39;http://baidu.com&amp;#39;));&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;http://zrj.me/wp-content/uploads/2012/08/Unnamed-QQ-Screenshot20120816173330.png&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://blog.zrj.me/images/Unnamed-QQ-Screenshot20120816173330.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;也可以写一个文件让它去跑，例如&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;file_put_contents&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;test.txt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;time&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;());&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后让他运行，&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;C:Program Filesphpphp-5.3.16&amp;gt;php test.php
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;接下来就是要整合 apache 和 php 了，悲剧的是，php 5.3.16 不再有 vc6 的版本，也就不再有 php5apache2_2.dll 这个文件，于是，我们把 php 配成 fastcig 模式，至于 mod-php， cgi， fastcgi 的区别，可以看这里，&lt;a class=&#34;link&#34; href=&#34;http://www.zhouwenyi.com/read.php?hash=54df9bb40101307n&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://www.zhouwenyi.com/read.php?hash=54df9bb40101307n&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;php一共分为五大运行模式：包括cgi 、fast-cgi、cli、isapi、apache 模块的 DLL&lt;/p&gt;
&lt;p&gt;CGI CGI即通用网关接口(Common Gateway Interface)，它是一段程序，通俗的讲CGI就象是一座桥，把网页和WEB服务器中的执行程序连接起来，它把HTML接收的指令传递给服务器的执 行程序，再把服务器执行程序的结果返还给HTML页。CGI 的跨平台性能极佳，几乎可以在任何操作系统上实现。 CGI方式在遇到连接请求（用户 请求）先要创建cgi的子进程，激活一个CGI进程，然后处理请求，处理完后结束这个子进程。这就是fork-and-execute模式。所以用cgi 方式的服务器有多少连接请求就会有多少cgi子进程，子进程反复加载是cgi性能低下的主要原因。都会当用户请求数量非常多时，会大量挤占系统的资源如内 存，CPU时间等，造成效能低下。&lt;/p&gt;
&lt;p&gt;CGI-FCGI fast-cgi 是cgi的升级版本，FastCGI像是一个常驻(long-live)型的CGI，它可以一直执行着，只要激活后，不会每次都要花费时间去fork一 次。PHP使用PHP-FPM(FastCGI Process Manager)，全称PHP FastCGI进程管理器进行管理。&lt;/p&gt;
&lt;p&gt;FastCGI的工作原理 1、Web Server启动时载入FastCGI进程管理器(IIS ISAPI或Apache Module) 2、FastCGI进程管理器自身初始化，启动多个CGI解释器进程(可见多个php-cgi)并等待来自Web Server的连接。 3、当客户端请求到达Web Server时，FastCGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。 4、 FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时，请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在Web Server中)的下一个连接。 在CGI模式中，php-cgi在此便退出了。&lt;/p&gt;
&lt;p&gt;在上述情况中，你可以想象CGI通常有多慢。每一个Web 请求PHP都必须重新解析php.ini、重新载入全部扩展并重初始化全部数据结构。使用FastCGI，所有这些都只在进程启动时发生一次。一个额外的 好处是，持续数据库连接(Persistent database connection)可以工作。&lt;/p&gt;
&lt;p&gt;APACHE2HANDLER PHP作为Apache模块，Apache服务器在系统启动后，预先生成多个进程副本驻留在内存中，一旦有请求出 现，就立即使用这些空余的子进程进行处理，这样就不存在生成子进程造成的延迟了。这些服务器副本在处理完一次HTTP请求之后并不立即退出，而是停留在计 算机中等待下次请求。对于客户浏览器的请求反应更快，性能较高。 apache模块的DLL： 该运行模式是我们以前在windows环境下使用apache服务器经常使用的，而在模块化(DLL)中，PHP是与Web服务器一起启动并运行的。（是apache在CGI的基础上进行的一种扩展，加快PHP的运行效率）&lt;/p&gt;
&lt;p&gt;ISAPI: ISAPI即Internet Server Application Program Interface，是微软提供的一套面向Internet服务的API接口 一个ISAPI的DLL，可以在被用户请求激活后长驻内存，等待用户的另一个请求，还可以在一个DLL里设置多个用户请求处理函数，此外， ISAPI的DLL应用程序和WWW服务器处于同一个进程中，效率要显著高于CGI。（由于微软的排他性，只能运行于windows环境)&lt;/p&gt;
&lt;p&gt;cli: cli是php的命令行运行模式，大家经常会使用它，但是可能并没有注意到（例如：我们在linux下经常使用 “php -m”查找PHP安装了那些扩展就是PHP命令行运行模式；有兴趣的同学可以输入php -h去深入研究该运行模式）&lt;/p&gt;
&lt;p&gt;总结： 每种运行模式都有自己的优缺点，没有绝对的好与坏，主要是看大家处理何种环境。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;至于 apache 配 fastcgi ，可以看这里，&lt;a class=&#34;link&#34; href=&#34;http://huzhangsheng.blog.163.com/blog/static/3478778420083903534560/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://huzhangsheng.blog.163.com/blog/static/3478778420083903534560/&lt;/a&gt;，还有这里，&lt;a class=&#34;link&#34; href=&#34;http://aiyooyoo.com/index.php/archives/164/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://aiyooyoo.com/index.php/archives/164/&lt;/a&gt;，不过我是综合了他们两个，尽量做到少写，因为写多了也不知道写的是什么，我只在 234 行的 Directory 里面左右加上了&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Options ExecCGI
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;然后在 242 行优先次序改成&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;IfModule&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;dir_module&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    DirectoryIndex index.php index.html
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/IfModule&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;最后在末尾加上&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;LoadModule fcgid_module modules/mod_fcgid.so
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;IfModule&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;mod_fcgid.c&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      AddHandler fcgid-script .php
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      FCGIWrapper &amp;#34;C:/php/php-5.3.16/php-cgi.exe&amp;#34; .php
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/IfModule&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;顺便说一下，本来 php 是装在 program files 里面的，但是好像配置文件里面的 FCGIWrapper 的路径不能出现空格，于是就移到根目录来了，顺带的，原来 php 配置文件里面的所有路径都要跟着改，坑爹啊&lt;/p&gt;
&lt;p&gt;于是 php 和 apache 的连结到此结束，后面就是装 mysql 了，mysql 有自己的配置向导，所以基本上就是一路 next 顺带改点小地方，没有什么特别需要注意的，最后装一个 phpmyadmin 完事&lt;/p&gt;
&lt;p&gt;===================================================&lt;/p&gt;
&lt;p&gt;2012-08-17 14:00:14 update 在配 apache 的 httpd.conf 文件时，发现了，同一个配置项只能一行，后面的会覆盖前面的。。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;历史评论&#34;&gt;历史评论
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;从点击到呈现 — 详解一次HTTP请求（1） | ZRJ&lt;/strong&gt; (2012-10-05 08:27:43):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[&amp;hellip;] 这个时候，典型的情况下，机房里面应该还有一个数据库服务器，或许，还有一台缓存服务器，如果对于流量巨大的网站，那么动态脚本的解释器可能还有单独的物理机器来跑，如果是中小的站点，那么，上述的各色服务，甚至都可能在一台物理机上，这些服务监听之间的关系，可以参考这里，再搭一次 Apache PHP MySQL 环境，不管怎么说，他们做好了准备，静候差遣。   此条目由 ZRJ 发表在 技术 分类目录，并贴了 Apache、从点击到呈现、详解一次HTTP请求 标签。将固定链接加入收藏夹。 [&amp;hellip;]&lt;/p&gt;
&lt;/blockquote&gt;
</description>
        </item>
        <item>
        <title>Apache 多虚拟主机</title>
        <link>https://blog.zrj.me/posts/2012-08-15-apache-%E5%A4%9A%E8%99%9A%E6%8B%9F%E4%B8%BB%E6%9C%BA/</link>
        <pubDate>Wed, 15 Aug 2012 16:40:44 +0800</pubDate>
        
        <guid>https://blog.zrj.me/posts/2012-08-15-apache-%E5%A4%9A%E8%99%9A%E6%8B%9F%E4%B8%BB%E6%9C%BA/</guid>
        <description>&lt;p&gt;之前在这篇笔记中，跨域请求时的 cookie 传送情况，&lt;a class=&#34;link&#34; href=&#34;http://zrj.me/archives/187&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://zrj.me/archives/187&lt;/a&gt;，记过了 apache 的多虚拟主机情况，今天发现了一个新的现象&lt;/p&gt;
&lt;p&gt;在 httpd.conf 中，如果我们存在一个这样的设置，&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;NameVirtualHost *:80
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;virtualHost&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;*:80&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ServerName www.lazyrest.local
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ServerAlias lazyrest.local
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;DocumentRoot &amp;#34;D:Documentscodewampwwwlazy_rest&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/virtualHost&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;那么，配合本地的 hosts 文件，确实是可以来到那个文件夹下面的，但是，如果这个时候访问 localhost 的话，也会跳转到这个文件夹，这就不符合预期了，我的解决方法是下面再加一段，最终变成这样&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;NameVirtualHost *:80
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;virtualHost&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;*:80&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ServerName www.lazyrest.local
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ServerAlias lazyrest.local
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;DocumentRoot &amp;#34;D:Documentscodewampwwwlazy_rest&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/virtualHost&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;virtualHost&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;*:80&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ServerName localhost
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;DocumentRoot &amp;#34;D:Documentscodewampwww&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/virtualHost&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这样虽然解决了问题，但是隐隐感觉，不是规范的做法，还是要补习 httpd 的配置文件啊&lt;/p&gt;
&lt;p&gt;==============================================================&lt;/p&gt;
&lt;p&gt;2012-08-17 10:17:04 update 关于配置文件的说明，可以参考这里，&lt;a class=&#34;link&#34; href=&#34;http://httpd.apache.org/docs/2.2/mod/core.html#namevirtualhost&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://httpd.apache.org/docs/2.2/mod/core.html#namevirtualhost&lt;/a&gt; ，还有这里，&lt;a class=&#34;link&#34; href=&#34;http://httpd.apache.org/docs/2.2/mod/core.html#virtualhost&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://httpd.apache.org/docs/2.2/mod/core.html#virtualhost&lt;/a&gt; 和这里 &lt;a class=&#34;link&#34; href=&#34;http://httpd.apache.org/docs/2.2/vhosts/name-based.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://httpd.apache.org/docs/2.2/vhosts/name-based.html&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Apache 控制台输出</title>
        <link>https://blog.zrj.me/posts/2012-08-15-apache-%E6%8E%A7%E5%88%B6%E5%8F%B0%E8%BE%93%E5%87%BA/</link>
        <pubDate>Wed, 15 Aug 2012 16:19:15 +0800</pubDate>
        
        <guid>https://blog.zrj.me/posts/2012-08-15-apache-%E6%8E%A7%E5%88%B6%E5%8F%B0%E8%BE%93%E5%87%BA/</guid>
        <description>&lt;p&gt;在 wamp 套装中，apache 的错误日志一般是放在这样的路径下，D:Documentscodewamplogs ，这个错误日志在大多数时候是可以帮助排查错误的，但是，如果在改写 httpd.conf 文件过程中出错了话，那么在 wamp 中启动 apache 是直接就启动不起来的，错误日志也没有，这个时候可以通过控制台，直接定位到 apache 的 httpd 程序，在那里，可以看到明确的错误提示， httpd 的程序一般在 D:DocumentscodewampbinapacheApache2.2.17bin 类似的目录下面&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;http://zrj.me/wp-content/uploads/2012/08/Unnamed-QQ-Screenshot20120815161702.png&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://blog.zrj.me/images/Unnamed-QQ-Screenshot20120815161702.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
