2017-03-11 3 views
2

Erinnerung:APC nicht Cache von CLI

apc_add('ips', $ips); 

über die Kommandozeile. Dieses zwischengespeicherte Array kann mit dem folgenden Code abgerufen werden:

im selben Skript.

Es kann jedoch weder von nachfolgenden CLI-Skripten noch über von Apache aufgerufenes PHP zugegriffen werden. Während ich Variablen über Skripte hinweg aufrufen kann, die von Apache ausgeführt werden.

Ich laufe auf: 5.4.6-1ubuntu1.8 und APC aktiviert mit:

apc.enable_cli=1 

auf meinem lokalen PC, ich bin mit APCU mit PHP7 und dieses Problem nicht auftritt.

Einstellungen:

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 

Irgendwelche Ideen?

+1

[Die Dokumente] (http://php.net/manual/en/apc.configuration.php#ini.apc.enable-cli) implizieren, dass APC nicht wirklich für die CLI zuverlässig arbeiten soll. – apokryfos

+0

Kennen Sie eine Alternative? –

+1

Ich benutze [Redis] (https://redis.io/) und die [Predis] (https://github.com/nrk/predis) Bibliothek. Es ist ziemlich einfach einzurichten und zu verwenden. – apokryfos

Antwort

3

Ja, das ist ein verwirrender Aspekt des Parameters apc.enable_cli = 1. Es deutet darauf hin, dass Sie ein ähnliches Verhalten wie mit einem Apache-Modul erhalten könnten.

Allerdings gibt es mit CLI einen Prozess und keinen gemeinsamen Status. Obwohl der Parameter existiert, sobald die erste CLI-Ausführung abgeschlossen ist, wird der gesamte APC-Speicherbereich gelöscht und ist nicht mehr vorhanden, wenn das CLI-Skript existiert ist komplett.

Sie benötigen einen anderen Mechanismus (Memcache, Redis, Warteschlangen, Flatfile, Datenbank), um dies mit mehreren CLI-Ausführungen (Batch-Läufe?) Außer APC zu ermöglichen.

FWIW, APC verwendet für diese Operationen den gemeinsamen Speicher. Es gibt eine seperate shared memory api for php, die könnte arbeiten. Der Anwendungsfall dafür ist etwas, das zwischen Prozessen geteilt wird, die definitionsgemäß auf einen einzelnen Server beschränkt sind. Es gibt nicht viele Anwendungsfälle, die mir einfallen. Die Verwendung dieser Routinen mit CLI funktioniert möglicherweise, aber ich habe sie nicht ausprobiert.

Wenn Sie wirklich etwas Shared benötigen, das würde sogar über mehrere Server funktionieren (zum Beispiel ein Cluster von Batch-Verarbeitung Worker), dann sind Sie besser mit der Warteschlange, Memcache oder Redis.

+0

es funktioniert nicht, auch wenn die Ausführung nicht abgeschlossen ist: https://stackoverflow.com/questions/45129579/how-to-get-php-cli-processes-share-variables-via-apc – qdinar

+0

Nein, Sie missverstehen. Nur weil ein CLI-Prozess läuft, bedeutet das nicht, dass Sie eine andere CLI-Instanz ausführen und die Variablen lesen können. Ein CLI-Prozess teilt keinen Zustand oder Speicher mit anderen CLI-Prozessen. Daher hat APC in CLI-Prozessen keinen Wert. – gview