2013-02-13 146 views
0

是否可以让PHP服务器(通过php5-fpm)在启动后立即运行PHP脚本,并且在客户端访问它之前运行它,以便执行变量的初始化为APC在启动时运行PHP脚本(APC变量初始化)

基本上某些事件被服务器生命期间经由apc_inc计数,像

apc_inc('event-xyz-happened'); 

事件-XYZ-发生 APC变种是永久的(寿命服务器寿命,不请求寿命)。

问题是,在第一次增加(不像Perl)时,APC var必须存在。 apc_inc是蛮快的,我想避免像

if (! apc_exists('event-xyz-happened')) { 
    apc_store('event-xyz-happened', 1); 
} 
else { 
    apc_inc('event-xyz-happened'); 
} 

的解决方案,不仅需要调用apc_exists('event-xyz-happened'),也可以从比赛疾病的困扰时还不存在它。

-

有没有一种解决方案来创建一些APC变量客户端访问服务器之前?

+0

说不上约PHP5-FPM但我知道,在工作中,我们将在我们的虚拟主机的配置在以下apache这看起来实现类似的东西,你到底是什么: 'php_value auto_prepend_file/var/www/xhprof_gui/xhprof_session.php – Jason 2013-02-13 09:23:24

+0

@Jason这是设置配置指令,而不是APC变量(加号,我使用* nginx *) – 2013-02-13 09:25:21

回答

2

您可以使用apc_add其次apc_inc(见http://www.php.net/manual/en/function.apc-add.php

// if it doesn't exist, it gets created 
// if it does exist, nothing happens, no race condition 
apc_add('event-xyz-happened', 0); 
apc_inc('event-xyz-happened', 1); 
+0

确实是个好主意。我仍然更喜欢*初始化*解决方案,这将避免'apc_add'开销。但这是迄今为止最好的选择。 – 2013-02-13 10:07:15

0

您不应该为此使用apc变量。

APC是一个缓存引擎,它不是一个快速的数据库引擎。 作为一个缓存引擎,它可以并且迟早地移除你的变量来清除其他变量或操作码缓存的内存。您分配给APC的内存越多,您的变量将被删除的可能性越小,但您不能确定该变量会在那里。

所有的php脚本都必须检查变量是否在apc缓存中,如果不是,则初始化它。

如果您需要以非常快的速度存储一些变量,您可以设置一个本地mysql服务器并创建一个带有“内存”引擎的表格。它几乎和apc一样快,但只要服务器正在运行,我就会成为permament。

好运 SWilk

+0

这是不正确的。如果未指定[* ttl *](http://www.php.net/manual/en/function.apc-store.php),则该变量不会过期(只要有可用内存)。至于在数据库中创建一个*内存*表,我在性能之后,并且我怀疑数据库中的inc + query + fetch ...可能甚至接近'apc_inc'(它会返回增加的值)的表现。 – 2013-02-13 10:13:33

+0

我只是说,你不能依赖缓存中的变量beeing。如果内存不足并且没有变量ttl用完,则整个缓存将被清除。请参阅 http:// stackoverflow。com/questions/1053810/php-apc-what-happens-when-apc-cache-is-full 由于mysql内存表的性能,我可能会夸大了一点;) – SWilk 2013-02-13 10:50:56

+0

当然,谢谢,我依靠缓存。这就是为什么要采取所有预防措施 - 自动检查脚本,大量内存 - 不要溢出分配给缓存的内存。内存将不会溢出。 – 2013-02-13 10:57:55