问题 在CLI和Web上调用时,如何让PHP使用相同的APC缓存?


我在用着 APC 缓存用户变量(使用apc_store / apc_fetch命令)。我还使用选项“apc.enable_cli = 1”为CLI启用了APC。但是,CLI的CLI版本似乎从Apache使用的版本访问不同的APC缓存。

是否可以将APC配置为对CLI和Web调用使用相同的缓存?


9145
2018-01-13 15:05


起源



答案:


不可能..唯一的方法来完成像你的要求是使用像memcacheD这样的东西。或运行您在网络服务器上运行所需的内容。什么运行的CLI无法通过带有cronjob的Web脚本运行?


11
2018-01-13 21:44



..或者更重要的是 - 为什么在cli脚本上需要这种性能优化? - troelskn
非常真实..网络通常是高冲击/命中,CLI一次性呼叫。 - DreamWerx
我对APC缓存CLI脚本并不感到烦恼。我希望能够从Web和CLI访问相同的APC用户缓存。如果不可能,我只需要从CLI调用Web脚本并让它传递所需的数据。不是最优雅的解决方案! - Ben Dowling
引导我去寻找这个问题的答案的用例是apache中的APC缓存存储了一个计算复杂的数据结构(需要几秒钟从数据库中提取所有数据并将其随机转移到结构中我们访问)用于加速一堆页面。我有一个长期存在的脚本,监视memcached有关何时更新该结构的提示。基本上这是memcache的本地缓存。 (看起来很疯狂,当你达到大规模时,线上时间从memcache中获取一个大的静态对象变得不可接受每次击中。) - cabbey
@cabbey一点也不疯狂,由于往返旅行,APC比memcache快几个数量级。 - Mahn


答案:


不可能..唯一的方法来完成像你的要求是使用像memcacheD这样的东西。或运行您在网络服务器上运行所需的内容。什么运行的CLI无法通过带有cronjob的Web脚本运行?


11
2018-01-13 21:44



..或者更重要的是 - 为什么在cli脚本上需要这种性能优化? - troelskn
非常真实..网络通常是高冲击/命中,CLI一次性呼叫。 - DreamWerx
我对APC缓存CLI脚本并不感到烦恼。我希望能够从Web和CLI访问相同的APC用户缓存。如果不可能,我只需要从CLI调用Web脚本并让它传递所需的数据。不是最优雅的解决方案! - Ben Dowling
引导我去寻找这个问题的答案的用例是apache中的APC缓存存储了一个计算复杂的数据结构(需要几秒钟从数据库中提取所有数据并将其随机转移到结构中我们访问)用于加速一堆页面。我有一个长期存在的脚本,监视memcached有关何时更新该结构的提示。基本上这是memcache的本地缓存。 (看起来很疯狂,当你达到大规模时,线上时间从memcache中获取一个大的静态对象变得不可接受每次击中。) - cabbey
@cabbey一点也不疯狂,由于往返旅行,APC比memcache快几个数量级。 - Mahn


你可以使用shm。这项技术可以访问Unix共享内存。你可以把一些变量放在shm中然后放在另一个scritp中,即使是在另一个语言中编程你也可以获得共享变量。

shm_put_var和shm_get_var。

它比APC慢,但它比memcached,redis等更快。

我希望它能帮助你,我很抱歉我的英语......


4
2017-12-06 19:59





将您的CLI称为CGI /path-to/cgi-sys/php5.cgi /home/name/crons/engine.php


1
2017-07-30 17:29



好主意,但这在CentOS上对我不起作用(/ usr / bin / php-cgi) - ColinM
这只有在你运行PHP作为(快速)CGI时才有效,而不是在Apache中使用mod_php(因为APC在Apache进程的内存中)。 - Mojah


你需要一个用php编写的web服务器 - 只有分叉的子进程共享APC缓存。如果你有一个php webserver,你可以在一个子进程中启动一个主cli,init apc,fork和加载/运行web服务器,并在另一个子进程中分叉并运行你的php cli脚本。有点粗暴,呵呵。 fork和require(),我认为apc缓存不会在exec()中存活


0
2017-12-02 00:28