将 APC 配置为 PHP 的操作码缓存时,有一个名为 apc.mmap_file_mask 的配置设置。根据我的阅读,您可以通过三种方式对其进行配置,但我并不真正了解每种方式的含义。
- /tmp/apc.XXXXXX -(默认)“文件支持的 mmap”
- /tmp/apc.shm.XXXXXX - 使用“POSIX 风格的 shm_open/mmap”
- /dev/zero - “使用内核的 /dev/zero 接口连接匿名 mmap 内存”
来源: http: //php.net/manual/en/apc.configuration.php#ini.apc.mmap-file-mask
任何人都可以评论这些以及他们推荐的内容吗?我猜会有内存使用和性能影响,也许还有安全影响,但我不知道是不是这样?从我完成的阅读中,我假设 #2 和 #3 更快,但我认为 APC 已经按原样使用共享内存(由 apc.shm_size 设置),所以我不明白。
/tmp/apc.XXXXXX -> 这个 mmap 文件掩码是一个普通的基于文件系统的 mmap,它使用 mkstemp 创建一个独特的临时文件,该文件是 mmap 的。6 个“X”被唯一的字符串替换,以使文件名唯一。这只是将数据写入文件系统中的文件。
/tmp/apc.shm.XXXXXX -> 请注意,在 Linux 系统上它_必须_只能是 /apc.shm.XXXXXX。与直接文件支持的 mmap 的区别在于此机制通过 mktemp() 调用创建一个临时文件,并调用 shm_open()创建并打开一个新的或打开现有的 POSIX 共享内存对象。POSIX 共享内存对象实际上是一个句柄,不相关的进程可以使用它来映射共享内存的同一区域。我以前没有尝试过,但我认为它最少可以有 3 个“X”(所以 apc.shml.XXX 也应该可以工作)。
/dev/zero -> mmap'ing
/dev/zero
是一个匿名内存映射,这意味着它的内存对象没有关联文件并且所有内容都初始化为零。如果您不指定 mmap_file_mask,APC 将使用匿名映射(带有标志 MAP_SHARED 和 MAP_ANON)。因此,指定/dev/zero
和不指定 mmap_file_mask 在它们都是匿名映射的意义上是等效的。从历史上看,Linux 中的 MAP_SHARED 和 MAP_ANON 在内核版本 2.4 之前是不支持的。性能方面,3 将做得最好,因为文件支持的 mmap'ing 具有相当多的磁盘 I/O。因此,3 必须是最快的,因为它没有备份文件并且是实际内存本身的一部分,最后是 2 和 1。然而,这只是跨越各种配置的理论和实践基准可以证明现实。但是,匿名映射(和共享内存映射)的缺点是 mmap 的内存在应用程序执行之间不是持久的,因此在重新启动时会丢失缓存。