2017-03-11 37 views
2

记忆缓存我设置与命令的APC缓存阵列:APC不是从CLI

apc_add('ips', $ips); 

通过命令行。

apc_fetch('ips') 

在同一脚本:该缓存阵列可以与被检索。

但是,无法从后续的CLI脚本或通过Apache调用的PHP访问它。虽然我可以通过Apache运行的脚本调用变量。

我正在上:5.4.6-1ubuntu1.8和APC与启用:

apc.enable_cli=1 

在我的本地PC,我使用APCU与PHP7并不会出现此问题。

设置:

apc.cache_by_default => On => On 
apc.canonicalize => On => On 
apc.coredump_unmap => Off => Off 
apc.enable_cli => On => On 
apc.enabled => On => On 
apc.file_md5 => Off => Off 
apc.file_update_protection => 2 => 2 
apc.filters => no value => no value 
apc.gc_ttl => 3600 => 3600 
apc.include_once_override => Off => Off 
apc.lazy_classes => Off => Off 
apc.lazy_functions => Off => Off 
apc.max_file_size => 1M => 1M 
apc.mmap_file_mask => no value => no value 
apc.num_files_hint => 1000 => 1000 
apc.preload_path => no value => no value 
apc.report_autofilter => Off => Off 
apc.rfc1867 => Off => Off 
apc.rfc1867_freq => 0 => 0 
apc.rfc1867_name => APC_UPLOAD_PROGRESS => APC_UPLOAD_PROGRESS 
apc.rfc1867_prefix => upload_ => upload_ 
apc.rfc1867_ttl => 3600 => 3600 
apc.serializer => default => default 
apc.shm_segments => 1 => 1 
apc.shm_size => 32M => 32M 
apc.shm_strings_buffer => 4M => 4M 
apc.slam_defense => On => On 
apc.stat => On => On 
apc.stat_ctime => Off => Off 
apc.ttl => 0 => 0 
apc.use_request_time => On => On 
apc.user_entries_hint => 4096 => 4096 
apc.user_ttl => 0 => 0 
apc.write_lock => On => On 

任何想法?

+1

[The docs](http://php.net/manual/en/apc.configuration.php#ini.apc.enable-cli)意味着APC并不真正意味着可靠地为CLI工作。 – apokryfos

+0

你知道吗? –

+1

我使用[Redis](https://redis.io/)和[Predis](https://github.com/nrk/predis)库。这是非常简单的设置和使用。 – apokryfos

回答

3

是的,这是apc.enable_cli = 1参数的一个令人困惑的方面。它表明你可以获得类似于它可能与apache模块一起工作的行为。

但是,由于cli有一个进程并且没有共享状态,所以尽管在第一个cli执行完成后该参数仍然存在,但整个apc内存空间将被处理并在cli脚本停止存在做完了。

您需要一些其他机制(memcache,redis,队列,平面文件,数据库)使其能够使用除APC以外的多个CLI执行(批处理运行?)。

FWIW,APC为这些操作使用共享内存。有一个seperate shared memory api for php,其中可能工作。这个用例是根据定义被限制在一台服务器上的进程共享的东西。我能想到的用例并不多。在CLI中使用这些例程可能有用,但我没有尝试过。

如果你真的需要共享一些东西,甚至可以在多个服务器上工作(例如一批批处理工作者),那么你最好用排队,memcache或redis。

+0

即使执行没有完成,它也不起作用:https://stackoverflow.com/questions/45129579/how-to-get-php-cli-processes-share-variables-via-apc – qdinar

+0

没有你误会。仅仅因为cli进程正在运行,并不意味着你可以运行另一个cli实例并读取变量。 cli进程与其他cli进程不共享状态或内存。所以APC在CLI过程中没有任何价值。 – gview