替代PHP缓存(APC)是Web开发中的一个相当新的,并且已经是流行的技术。 APC广泛用作操作码(操作代码)缓存引擎或通常称为它们–作为PHP加速器,这意味着它将编译的PHP字节代码存储在服务器中’S内存,从而加快了任何PHP脚本的工作。但实际上,APC也可以用作通常的缓存引擎,而不仅仅是加速器。

有些人通过安装一包不同的高速缓存引擎和加速器并使它们全部能够提高魔法机的速度来提高魔法机的速度来犯严重的错误。最多,Magento将更快地工作,但它将消耗很多内存,因为每个缓存引擎都将存储其数据。在最糟糕的情况下,Magento将变得不稳定,并开始以不可预测的方式崩溃。

让我们来看看如何优化洋泊表演。 Magento可以使用两种类型的缓存。第一种类型是操作码缓存(PHP加速器)。对于此目的,应使用XCache或EACCelerator。不是所有的人–只有一个!这提高了在包括Magento的服务器上的任何PHP脚本工作的整体性能。结果,Magento的速度可能会增加许多折叠。

第二种缓存是magento’缓存。请注意,在洋养仓的早期版本中,在快速和缓慢的缓存之间没有分裂–只有一种缓存。如今,可以设置两个级别的缓存 通过/App/etc/local.xml. 文件。快速级别缓存是Magento直到它主要用于的缓存’没有耗尽。有许多不同的缓存引擎可用于此目的–APC,memcached等 As soon as there’S用于快速缓存Magento的系统中没有可用内存开始使用慢速缓存。对于慢速级别缓存,常用数据库或文件系统。默认情况下,Magento仅使用文件系统来缓存’s一个相当慢的解决方案。

加速Magento的额外方法是启用Magento’编译器。基本上,编译器只需将所有类复制到一个目录,并将其中一些部分合并到大的“范围”文件中。然后magento从此目录中自动加载所有类。有人可以说,在使用PHP加速器时没有理由使用编译器。它’除了一件事之外,真的–Accelerator通过特定文件的绝对路径存储所有类的所有文件。这意味着在使用加速器之前,Magento仍然必须计算每个类自动加载上的文件的路径。 Magento包含大约10 000级课程。如果我们假设10%的杂片上加载了10%,则应加载大约1 000个文件。如果有10,50,100个用户一次浏览该网站的情况怎么样?那’S很多,编译器通过删除此路径计算过程有助于降低时间。

作为现在的快速缓存最常见和本机PHP技术是APC,让’S看看如何为Magento启用APC支持。首先’必须在服务器上安装APC扩展名。有关要求和安装的一些信息可以找到 官方APC页面 在php.net网站上。现在,当我们在我们的服务器上工作APC时,它将在解释为字节码后自动缓存所有* .php文件。

可以使用使用方法检查APC是否可以正确存储所有PHP文件 apc.php. 实用程序脚本可以在任何APC包中找到 这里。编辑此脚本并更改管理员’脚本开头的用户名和密码。此脚本的第一页显示了一些缓存统计信息和主要设置’APC的值和百分比。如果有一条消息 “没有缓存信息可用。 APC似乎没有运行。” 在此页面上而不是缓存信息那么它’必须检查是否正确安装了PHP的APC扩展名。还要确保 apc.led. 扩展中的运行时参数’s配置设置为1,因为禁用此选项也将显示此选项 “No cache info…” 错误 apc.php.。当缓存信息显示出来时,将有几个图表显示使用高速缓存和专用于APC和使用的内存量的点击/未命中的百分比。此页面的每一个重新加载都应增加命中的次数,从而提高命中的百分比。如果在运行APC.php的第一次运行时缓存是空的,则将使用〜350kb– size of the apc.php. 脚本本身。现在我们应该使用我们在脚本中设置的脚本和凭据的右上角的按钮登录脚本’s code.

主机状态图

首次运行后的APC

APC.php脚本中有两个主图 –主机状态图。左图显示了APC内存使用情况,空闲和使用的内存量。它还显示了记忆的碎片。正确的图表显示了对缓存的成功呼叫数量。如果从缓存中调用了一些.php脚本或某些数据条目,则未找到此尝试标记为“miss”。然后,很可能从文件系统中包含此文件,将被缓存,或者将存储在缓存中以供将来使用。调用成功尝试从缓存中获取一些数据“Hits”。此图的理想条件是〜99%的命中和〜1%的未命中–这意味着所有数据都被缓存一次,然后始终从缓存调用,并且没有缓存刷新。

此脚本的顶部菜单中有两个重要部分 - `系统缓存条目` `用户缓存条目`。在第一个,我们可以在此刻看到由APC缓存的所有.php文件,点击/未命中的数量和这些文件的一些时间信息。单击某些文件名将向我们指向此文件的一些详细信息的页面。如果此刻此时该部分是空的,那么似乎我们有问题–APC无论是缓存文件,要么不会在PHP请求之间共享它。关于此问题的一些信息可以在本文的末尾找到’必须解决它以前进的必要性。但现在让 ’s假设我们有这个部分工作,有一些文件。第二, `用户缓存条目` 部分应该是空的–它应该显示使用常用的内存缓存在APC上存储的数据条目不是操作码缓存。

启用缓存的主机状态图。

正常的APC统计数据

要开始使用此类APC缓存,我们应该对其进行一些修改 /app/etc/local.xml文件。它’必须在“全局”节点下添加以下行:

<global> 
    ...
    <cache> 
        <backend>apc</backend> 
        <prefix>MY_STORE_NAME_</prefix> 
    </cache>
    ...
</global>

那’嗯!现在我们应该清除magento’s cache at the `系统 - >Cache Management` Magento后端的一部分。如果我们看看 `User Cache Entries` 部分 apc.php. 脚本现在,我们应该看到那里的一些数据条目。单击条目将指向此条目的详细信息,包括存储在条目中的所有数据。

还有另一个修改可以对此进行 /app/etc/local.xml.xml. file –我们可以设置缓存类型慢速缓存类型。如果未直接设置,Magento将在超出专用于APC的内存限制时使用文件系统来存储缓存。第二个选项是将数据库使用为缓慢缓存存储– it’s necessary to add <slow_backend>database</slow_backend>在“缓存”节点下面的线条

<global>
    ...
    <cache>
        <backend>apc</backend>
        <slow_backend>database</slow_backend>
        <prefix>MY_STORE_NAME_</prefix>
    </cache>
    ...
</global>

 

如果没有此参数,Magento将使用文件系统存储慢速缓存。虽然这不是存储数据库中的缓存的最佳选择,但它比将其存储在文件系统中的速度更快。如果服务器上有APC,您可能会问为什么可以使用慢速缓存。悲伤的事实是Magento总是将数据写入快速和慢速缓存。因此,如果在Local.xml文件中未定义缓慢缓存类型,则Magento将使用文件系统来存储数据,这将减少magento’S负载速度。和那里’没有明显的方法来阻止这个过程,但是在那里’有点诀窍如何防止玛托地写作缓慢缓存:

<global>
    ...
    <cache>
        <backend>apc</backend>
        <slow_backend>database</slow_backend>
        <slow_backend_store_data>0</slow_backend_store_data>
        <auto_refresh_fast_cache>0</auto_refresh_fast_cache>
        <prefix>MY_STORE_NAME_</prefix>
    </cache>
    ...
</global>

 

此技巧仅适用于数据库慢速类型缓存。在这种情况下,Magento不会在数据库中存储任何东西,它也不会使用文件系统。请注意,如果apc 超过其内存限制, 它将刷新整个缓存。虽然这不是Magento可能发生的最糟糕的事情,但有一个问题:如果发生这种情况,这些冲洗将在短时间内重复,从而降低APC使用的优点。在这种情况下,Magento可能会变慢而不是APC。所以’对于为APC设置此类内存限制至关重要,始终为缓存提供一些可用内存。例如,如果您看到高速缓存几乎已满,则为APC分配额外的20%内存。

现在让步’S看起来有一些可能出现在设置或使用APC时出现的问题。我们假设APC已启动并在服务器上运行,并且可以访问APC.php脚本。

1.无论我们如何使用它,存储始终为空–对于Opcode,或仅用于缓存。

有一个常见问题可能导致这种情况。服务器上最可能的PHP在快速CGI模式下工作。在此模式下,并行PHP工艺唐’T彼此有用’存储在APC的数据。这是一个旧的apc / php bug,没有良好的解决方案问题:更改PHP模式或使用其他缓存引擎。

2.“无法分配池中的内存”池中的日志和Magento崩溃的错误。

很少有可能导致此错误,并且大多数与APC配置不正确有关。首先–可能没有释放内存来存储一些文件/数据,同时APC.TL系统选项ISN’t设置为零。此设置会在内存中运行时调节APC的行为。基本上且默认情况下,它设置为零,这意味着在这种情况下应刷新整个缓存。如果此设置更改为某个其他值。 3600(秒),然后仅刷新在最后一个小时内空闲的条目(既不在指定的时间内暂时访问)。将此选项设置为非零值可能会通过消除不必要的高速缓存刷液来提高APC工作的速度,并且建议将其设置为此,建议增加APC的内存限制以防止不必要的冲洗。

此问题的另一个来源是APC的内存分配不正确。如果 apc.shm_size. 被设置为例如512MB和那里’只有256MB可用于APC的共享内存,那么也可能发生此错误。

3.“无法重新删除课程”错误。

通过使用包含相对路径的include_once函数包括包含这些文件,代码中最有可能在代码中调用某个PHP文件。 APC通过他们的路径存储文件。如果一个文件用两个不同的相对路径调用两次,那么即使使用include_once apc也将加载两次相同的文件/类。可能导致此问题的第二种情况是,某些扩展程序与自动装载器分开加载某些文件/类。如果它在自动装载器之前加载类–一切正常,自动加载器不会再加载文件。但如果它在自动装载器后加载类– there’■出现的重复突出错误风险很高。虽然Magento本身无法造成这样的问题,但有些 第三方扩展可以。

4. APC.php脚本显示高级缓存碎片。

如果内存限制低,则此问题也可能是由APC.TTL选项引起的。让’s假设我们已将此选项设置为3600秒。当APC运行内存时,它将在最后一小时内刷新所有文件,即20-30%的文件。这些文件不在内存的某部分中,但是通过缓存的顺序分发。现在我们有20-30%的可用内存,但是这个空间由小区域表示等于在刷新之前存储在这些区域的文件大小。现在我们正在尝试缓存一些新文件–如果它无法将此文件存储在内存的第一个免费片段中,则APC将拆分为几个部分。这是缓存碎片。此问题的解决方案是为APC分配足够的内存,以防止数据刷新。通常,这个问题总是通过替换缓存中的数据,无论究竟何种替换,都是由缓存中的数据引起的。它可以是数据刷新或使用某些函数,如apc_compile_file强制文件重新编译。基本推荐是检查并增加APC的内存限制,如果碎片未完成,那么它’看看扩展代码来找到碎片原因的好理由。

详细的内存用法

0%碎片 - 理想状态

 

5.为什么Magento Hasn的速度’启用APC后急剧增加?

 有很多原因,有关如何提高速度的建议。首先检查APC.php脚本–APC目前已经缓存了任何数据吗?我们已经介绍过这种情况,这是一个相当普遍的问题。然后请检查Hits / Misses的数量和缓存的容量。如果缓存有许多未命中,并且他们的数字快速增长,而缓存是完全容量的,则’显然,通过缓存溢出,通过永久替换一些文件来减少缓存的整体速度。类似的问题是因为溢出而经常刷新自己。这两个案例之间的唯一区别是APC.TTL选项的值。两个问题的解决方案是增加APC的内存限制。

 关于APC设置优化的一些单词。正如我们在本文中提到了多次–APC最重要的优化正在分配足够的内存以存储Opcode和通常的缓存类型的所有数据,甚至具有一些可用内存(约20-30%)。要知道你的Magento真正使用它是一个好主意,可以将大量内存分配给APC(例如512MB),然后在一天的时间内检查几次缓存的真正使用情况。然后将内存限制降低到合理的值。所以Set apc.shm_segments = 1和apc.shm_size才能有一些免费缓冲区。将APC.ttl设置为零以上的某个值–如果有,这将防止APC刷新所有数据’s no free memory.

使用具有MMAP(内存映射)支持的APC,而不是使用SHM(SYSV共享存储器)是一种很好的做法。此外,建议使用这种做法 APC开发人员。在此模式下,APC将使用另一个内存的机制分配,该机制将更快地恢复存储器’对于此选项几乎没有限制资源。但是,如果您正在使用共享内存,那么它就会使用它’很有用来了解如何设置一些要共享的内存。设置例如128MB可以使用以下命令后的共享内存:

    sysctl -w kernel.shmmax= 134217728

要在服务器之间保存此设置重新启动您可以使用以下命令:

    echo 'kernel.shmmax= 134217728' >> /etc/sysctl.conf
    sysctl -p

 在生产环境中设置APC.STAT到零–这将防止APC从每个文件的自动检查’S状态。虽然启用此选项,APC将检查每个Magento加载每个缓存的文件,以便可能更改,并在更改文件时重新缓存。由于Magento包含大约10000个课程,禁用这些检查可能会导致显着的速度提升。请注意,在APC.STATS禁用时刷新缓存’必须通过APC.php手动刷新缓存或重新启动服务器。

apc.max_file_size = 5m., apc.num_files_hint = 10000. 这将允许APC存储大文件(例如由Magento编译器创建的大文件),并将增加APC的速度“hinting”对系统中有多少PHP文件。

总之,互联网上的APC设置有许多不同的建议,我们不想争辩说哪一个更好或更糟。这是我们为生产服务器提供此类建议的版本。如果您有一些建议或关于如何更好地使此配置的建议或提案–我们很乐意在评论中讨论它们。

/app/etc/local.xml.xml.:

<global>
    ...
    <cache>
        <backend>apc</backend>
        <slow_backend>database</slow_backend>
        <slow_backend_store_data>0</slow_backend_store_data>
        <auto_refresh_fast_cache>0</auto_refresh_fast_cache>
        <prefix>MY_STORE_NAME_</prefix>
    </cache>
    ...
</global>


APC设置:

apc.led. = 1
apc.cache_by_default = 1
apc.shm_segments = 1
apc.shm_size = [real consumption of certain Magento installation +20-30%]
apc.mmap_file_mask = /tmp/apc.XXXXXX
apc.ttl = 7200
apc.user_ttl  = 7200
apc.num_files_hint = 10000.
apc.max_file_size = 5m.
apc.stat = 0   #set to 1 during development


Thank you for reading our blog. Please use BLOG15 coupon code to get a one-time 15% discount if you decide to buy Magento modules from AITOC.