Loading... <h1>1、PHP执行</h1> <blockquote><p>PHP的运行阶段也分成三个阶段:</p> </blockquote> <ul class=" list-paddingleft-2"> <ul class=" list-paddingleft-2"> <li> <p>Parse。语法分析阶段。</p> </li> <li> <p>Compile。编译产出opcode中间码。</p> </li> <li> <p>Execute。运行,动态运行进行输出。</p> </li> </ul> </ul> <blockquote><p></p> <p><span style="font-family: Tahoma, Arial, Helvetica, STHeiti"><span style="line-height: 24px"> <img src="//cto.wang/usr/uploads/2016/07/20160703145023-92.jpg" title="1428659034530219.jpg" alt="1.jpg" /></span></span></p> <p></p> <p> 由于PHP是个解释型语言执行的时候先得把程序读进来,然后由Zend引擎编译成opcode。最后<span>Zend虚拟机顺次执行这些<span>opcode(指令)</span>完成操作</span>。因此我们可 以把这个Opcode缓存起来,下次就能避免重新编译了。 </p> <p>APC缓存作用如下:</p> <p> <img src="//cto.wang/usr/uploads/2016/07/20160703145023-25.png" title="1428659045111313.png" alt="2.png" /></p> </blockquote> <h1>2 、APC简介</h1> <blockquote><p> <span style="font-family: verdana, arial, helvetica, sans-serif;font-size: 14px">Alternative PHP Cache (APC) 是一个开放自由的PHP opcode 缓存。它的目标是提供一个自由、 开放,和健全的框架用于缓存和优化PHP的中间代码。</span></p> <p><span> PHP APC提供两种缓存功能,即缓存Opcode(目标文件),我们称之为apc_compiler_cache。同时它还提供一些接口用于PHP开发人</span> </p> <p> <span style="font-size: 14px"> APC的主页是:</span><span style="font-size: 14px">php apc</span><span style="font-size: 14px"> 。目前的版本是</span><span style="font-size: 14px">3.1.13</span><span style="font-size: 14px">,通过PECL安装,需要php4.3.0或更高版本</span></p> </blockquote> <h1><span style="font-family: Tahoma, Arial, Helvetica, STHeiti;line-height: 22px"><span style="font-size: 24px">3、</span></span><span style="font-family: Tahoma, Arial, Helvetica, STHeiti;line-height: 22px">安装配置</span></h1> <blockquote><p><span><span style="font-family: Tahoma, Arial, Helvetica, STHeiti"><span style="line-height: 22px">一般是下载源代码然后phpize来编译安装,安装完以后在加上php.ini里加上<br />extension=apc.so <br />这么一行就行了. 具体步骤如下:</span></span></span></p> <p><span><span style="font-family: Tahoma, Arial, Helvetica, STHeiti"><span style="line-height: 22px">下载:</span></span></span>http://pecl.php.net/get/APC-3.1.5.tgz (http://pecl.php.net/package/apc<span style="font-size: 12px">)</span></p> <p>注意:最新稳定版是APC-3.1.9.tgz,但是在php5.4或者5.5版本编译apc都有问题。</p> <p>APC-3.1.9.tgz编译报错:</p> <pre class="brush:python;toolbar:false">/tmp/pear/temp/APC/apc_zend.c: In Funktion »apc_get_zval_ptr«: /tmp/pear/temp/APC/apc_zend.c:62: Fehler: »zend_execute_data« hat kein Element namens »Ts« /tmp/pear/temp/APC/apc_zend.c:64: Fehler: »zend_execute_data« hat kein Element namens »Ts« /tmp/pear/temp/APC/apc_zend.c:67: Fehler: »zend_execute_data« hat kein Element namens »CVs« /tmp/pear/temp/APC/apc_zend.c: In Funktion »apc_op_ZEND_INCLUDE_OR_EVAL«: /tmp/pear/temp/APC/apc_zend.c:170: Fehler: »zend_execute_data« hat kein Element namens »Ts« /tmp/pear/temp/APC/apc_zend.c:170: Fehler: »zend_execute_data« hat kein Element namens »Ts« /tmp/pear/temp/APC/apc_zend.c:170: Fehler: »zend_execute_data« hat kein Element namens »Ts« /tmp/pear/temp/APC/apc_zend.c:171: Fehler: »zend_execute_data« hat kein Element namens »Ts«</pre> <p><span> php5.4或者php5.5应该使用XCache or Zend OPCache 代替 APC。</span> <p><span>http://www.litespeedtech.com/support/forum/threads/solved-php-5-5-6-install-fails-on-apc.7809/<br /></span></p> <p> wget http://centminmod.com/centminmodparts/apc/php550/APC-3.1.13.tgz</p> <p><span></span></p> <pre># tar -xzvf APC-3.1.5.tgz</pre> <p><span></span></p> <pre>#cd APC-3.1.5</pre> <p><span></span></p> <pre># /usr/bin/phpize</pre> <p><span></span></p> <pre># ./configure --enable-apc --enable-mmap --enable-apc-spinlocks --disable-apc-pthreadmutex</pre> <p><span></span></p> <pre>#make</pre> <p><span></span></p> <pre>#make install</pre> <p style="font-size: 12px"><span>注意:我们这里支持mmap,同时采用spinlocks自旋锁。Spinlocks是Facebook推荐使用,同时也是APC开发者推荐使用的锁机制。 使用spinlocks(自旋)锁机制,能够达到最佳性能</span></p> <p><span></span></p> <pre>php.ini</pre> <p><span></span></p> <pre>查找extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/"</pre> <p><span></span></p> <pre>下面添加extension = "apc.so"</pre> <p><span></span></p> <pre>配置php.ini 的APC</pre> <p><span></span></p> <pre>apc.rfc1867 = on</pre> <p><span></span></p> <pre>;最大上传文件</pre> <p><span></span></p> <pre>apc.max_file_size = 800M apc.enable_cli = off ; 是否为cli版本启用apc功能,仅用于测试和调试目的才打开此指令。</pre> <p><span></span></p> <pre>apc.enabled = 1 ;允许apc,apc.enabled默认值是1,你可设成0禁用APC。如果你设置为0的时候,同样把extension=apc.so也注释掉(这样可以节约内存资源)。一旦启用了APC功能,则会缓存Opcodes到共享内存。</pre> <p><span></span></p> <pre>apc.shm_segments = 1 ;对编译器缓存要分配的共享内存块的数目</pre> <pre><p style="line-height: 26px;font-family: Arial;font-size: 14px"><strong><span>apc.shm_size = 64 </span></strong> ;apc.shm_size就是给APC开的缓存大小,以 MB 为单位的每个共享内存块的大小 。<span>默认时,有些系统(包括大多数 BSD 变种)的共享内存块大小非常低。</span></p><p style="line-height: 26px;font-family: Arial;font-size: 14px"><span>apc.shm_segments = 1</span><br /><span>apc.shm_size = 30</span><br /><span>APC既然把数据缓存在内存里面,我们就有必要对它进行内存资源限定。通过这二个配置可以限定APC可以使用的内存空间大小。apc.shm_segments指定了使用共享内存块数,而apc.shm_size则指定了一块共享内存空间大小,单位是M。所以,允许APC使用的内存大小应该是 apc.shm_segments * apc.shm_size = 30M。你可以调整一块共享内存的大小空间。当然,一块共享内存最大值是受操作系统限制的,即不能超过/proc/sys/kernel/shmmax大小。否则APC创建共享内存的时候,会失败。在apc.shm_size达到了上限的时候,你可以通过设置apc.shm_segments来允许APC使用更多的内存空间。我们推荐,如果调用APC使用内存空间的话,先考滤apc.shm_size,后考滤apc.shm_segments。具体数值,可以根据apc.php监控情况进行规划与调整。值得注意的是,每一次调整需要重启httpd守护进程,这样可以重新加载apc.so模块。跟随着httpd守护进程启动,apc.so模块就会加载。apc.so加载初始化的时候,通过mmap请求分配内存指定大小的内存,即apc.shm_size * apc.shm_segments。而且,这里使用的是匿名内存映射方式,通过映射一个特殊设备/dev/zero,提供一个“大型”的,填满了零的内存供APC管理。</span><br /><span>为了验证以上陈述,我们注释掉apc.ini配置,并且写了以下php脚本观察apc.so模块初始化的分配的内存空间。</span></p></pre> <p><span></span></p> <p><span></span></p> <pre>apc.optimization = 0 ;优化级别。设为 0 则禁用优化器,更高的值则使用更主动的优化。</pre> <p><span></span></p> <pre>apc.num_files_hint = 1000 ;Web 服务器上的被包含或被请求的不同源文件的数目的大概估计</pre> <pre>apc.ttl = 0 ;缓存条目在缓冲区所允许的空闲时间的秒数</pre> <pre>apc.gc_ttl = 3600 ;缓存条目在垃圾回收表中能够存在的秒数</pre> <p><span></span></p> <pre><p style="line-height: 26px;font-family: Arial;font-size: 14px"><strong>apc.cache_by_default = On </strong><span>;默认为 on,但可以设为 off 并和加号开头的 apc.filters 一起用 </span></p><pre>;/*则文件仅在匹配过滤器时被缓存。*/</pre> <pre>apc.slam_defense = 0</pre> <p><span></span></p> <pre>apc.file_update_protection = 2</pre> <p><span></span></p> <pre>apc.enable_cli = 0</pre> <p><span>apc.stat=0<span>;调试</span></span></p> <p><span><span></span></span></p> <p class="para">是否启用脚本更新检查。 改变这个指令值要非常小心。 默认值 On 表示APC在每次请求脚本时都检查脚本是否被更新, 如果被更新则自动重新编译和缓存编译后的内容。但这样做对性能有不利影响。 如果设为 Off 则表示不进行检查,从而使性能得到大幅提高。 但是为了使更新的内容生效,你必须重启Web服务器(译者注:如果采用cgi/fcgi类似的,需重启cgi/fcgi进程)。 生产服务器上脚本文件很少更改, 可以通过禁用本选项获得显著的性能提升。</p> <p class="para">这个指令对于include/require的文件同样有效。但是需要注意的是, 如果你使用的是相对路径,APC就必须在每一次include/require时都进行检查以定位文件。 而使用绝对路径则可以跳过检查,所以鼓励你使用绝对路径进行include/require操作</p> <p><span></span></p> <pre>配置详解:</pre> <p><span></span></p> <pre>http://www.php.net/manual/zh/apc.configuration.php</pre> </blockquote> <pre> 重新启动apache服务器,查看phpinfo中是否有apc的配置项目,有的话就配置成功了.</pre> <h1><span style="line-height: 24px">4、APC<span style="line-height: 25px">管理界面</span></span></h1> <blockquote><p><span><span style="font-size: 14px"> 到pecl.php.net下载 apc源码包有个apc.php,copy到你的web server可以访问到的地方,浏览即可访问。</span></span></p> <p><span><span style="font-size: 14px">管理界面功能有:</span></span></p> <p><span><span style="font-size: 14px">1. Refresh Data</span></span></p> <p><span><span style="font-size: 14px">2. View Host Stats</span></span></p> <p><span><strong><span style="font-size: 14px">3. System Cache Entries (缓存opcode码)</span></strong></span></p> <p><span><strong><span style="font-size: 14px">4. User Cache Entries (用户自定义的缓存数据)</span></strong></span></p> <p><span><span style="font-size: 14px">5. Version Check</span></span></p> <p><span> <img src="//cto.wang/usr/uploads/2016/07/20160703145023-20.jpg" title="1428659151773788.jpg" alt="3.jpg" /></span></p> </blockquote> <h1>5. APC的使用</h1> <p><span style="font-size: 14px">APC的使用其实倒说不上.APC是个优化器,自安装之日起,就默默地在后台为您的PHP应用服务了.您的所有PHP代码会被缓存起来.<br />另外,APC可提供一定的内存缓存功能.但是这个功能并不是十分完美,有报告说如果频繁使用APC缓存的写入功能,会导致不可预料的错误.如果想使用这个功能,可以看看apc_fetch,apc_store等几个与apc缓存相关的函数.<br />从PHP5.2开始,APC引入了一个小甜饼,解决了困扰大家已久的大文件上传的进度条问题.。</span></p> <p><span></span><span></span></p> <h1>6. APC的高级使用</h1> <h3>1.缓存期限:</h3> <p>APC的缓存分两部分:系统缓存和用户数据缓存.</p> <p>系统缓存: 是自动使用的,是指APC把PHP文件源码的编译结果缓存起来,然后在再次调用时先对比时间标记。如果未过期,则使用缓存代码运行。默认缓存 3600s(一小时).但是这样仍会浪费大量CPU时间.因此可以在php.ini中设置system缓存为永不过期(apc.ttl=0).不过如果这样设置,改运php代码后需要restart一下您的web服务器(比如apache…).目前对APC的性能测试一般指的是这一层cache;</p> <p>用户数据缓存:由用户在编写php代码时用apc_store和apc_fetch函数操作读取、写入的.如果量不大的话我建议可以使用一下.如果量大,我建议使用memcache会更好.<br />如果要享受APC带来的缓存大文件上传进度的特性,需要在php.ini中将apc.rfc1867设为1,并且在表单中加一个隐藏域APC_UPLOAD_PROGRESS,这个域的值可以随机生成一个hash,以确何唯一.具体例子请参见前面给出的链接.</p> <h1><span style="font-family: Tahoma, Arial, Helvetica, STHeiti;line-height: 22px"><span style="font-size: 24px">6、测试效率</span></span></h1> <p><span> 从Ethna框架来测试:</span></p> <p><span> 第一次执行:</span></p> <p><span> <span style="font-family: Simsun;font-size: 16px">Time:260.53491973877ms</span><br style="font-family: Simsun;font-size: 16px" /><span style="font-family: Simsun;font-size: 16px"> memory:6.2379684448242MB</span></span></p> <p><span><span style="font-family: Simsun;font-size: 16px"> 第二次执行:</span></span></p> <p><span><span style="font-family: Simsun;font-size: 16px"> Time:199.43404197693ms<br /> memory:1.1883926391602MB</span></span></p> <p><span> <span style="line-height: 21px">性能提高了30%。</span></span></p> <p><span><span style="line-height: 21px"></span></span></p> <h1><span style="font-family: Tahoma, Arial, Helvetica, STHeiti;line-height: 22px"><span style="line-height: 21px">7、apc与memcache对比</span></span></h1> <p><span><span style="line-height: 21px">1,使用apc_fetch获取数据,每次大约1-2微秒。 (10万次170ms)<br />2,使用Memcache::get通过localhost获取本服务器的数据,每次大概41微秒。 (10万次4160ms)<br />3,使用Memcache::get通过本机IP地址获取本服务器的数据,每次大概42微秒。 (10万次4268ms)<br />4,使用Memcache::get通过IP地址获取同网段(千兆以太网)其他机器的数据,每次大概110微秒。 (10万次11268ms)</span></span></p> <p><span>5,使用Redis::get通过IP地址获取同网段(千兆以太网)其他机器的数据,每次大概220微秒。 </span><span> </span><span>(10万次21700ms)</span></p> <h1><span style="font-family: Tahoma, Arial, Helvetica, STHeiti;line-height: 22px"><span style="line-height: 21px"><span style="font-size: 24px">8、php5.5之APC</span></span></span></h1> <p><span style="font-size: 12px">APC在PHP5.4及以下版本是性能最好的代码缓存。</span><span style="line-height: 25.99431800842285px"><span style="font-size: 12px">不过PHP升级到5.5及以上后,APC不再有效。需要使用Zend的OpCache扩展。</span><span><span style="font-size: 12px">PHP 5.5已经集成Zend Opcache功能缓存速度比APC、eAccelerator、XCache更快</span></span></span></p> <p>要启用Opcache扩展,有两步:</p> <p><strong>1. 安装opcache</strong></p> <p><span>编译安装PHP5.5的时候加上–enable-opcache</span></p> <p><span><strong>2.在php.ini文件中添加如下配置</strong>:</span></p> <p><span>zend_extension=opcache.so<br />[opcache]<br />opcache.memory_consumption=128<br />opcache.interned_strings_buffer=8<br />opcache.max_accelerated_files=4000<br />opcache.revalidate_freq=60<br />opcache.fast_shutdown=1<br />opcache.enable=1<br />opcache.enable_cli=1</span></p> 最后修改:2021 年 12 月 10 日 10 : 53 AM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 赞赏作者 支付宝微信