2016-06-22 11 views
1

** Update ** 23.06apciterator kann Einzelteile nicht nach einiger Zeit abrufen

An diesem Punkt konnte ich das Problem auf ein einfaches Beispiel isolieren. Erstens speichere ich einige Beispiel Artikel:

apc_add('MY_APC_TESTA_1','1'); 
apc_add('MY_APC_TESTA_2','2'); 
apc_add('MY_APC_TESTA_3','3'); 
apc_add('MY_APC_TESTB_4','4'); 
apc_add('MY_APC_TESTB_5','5'); 
apc_add('MY_APC_TESTB_6','6'); 

Dann verwende ich APCIterator für die Elemente, Abrufen, sie mit einer foreach Schleifenzählung und zusätzlich getTotalCounts Methode der apciterator Klasse für doppelte Überprüfung verwenden.

$iterator = new APCIterator('user', '/^MY_APC/', APC_ITER_VALUE); 

function showCache() { 

    echo "keys in cache<br>-------------<br>"; 
    foreach ($items AS $key => $value) { 
     echo $key . "<br>"; 
    } 
} 


$i = 0;  
foreach ($iterator as $current_item) { 
     $i++; 
} 

echo 'getTotalCount: '.$iterator->getTotalCount().'<br>'; // output: 6 
echo 'foreach count: '.$i.'<br>'; // output: 6 

showCache(); 

dieses Skript aufrufen direkt nach dem Speichern von Elementen ich diesen Ausgang bin immer:

getTotalCount: 6 
foreach count: 6 
keys in cache 
------------- 
MY_APC_TESTA_1 
MY_APC_TESTA_2 
... 

Aufruf dieses Skripts paar Stunden oder einen Tag später erhalte ich diese Ausgabe:

getTotalCount: 6 
foreach count: 0 
keys in cache 
------------- 

Wie Sie sehen können, kann die Iterator-Klasse trotzdem die Gesamtanzahl mit ihrer Methode getTotalCount abrufen, aber eine foreach-Schleife bringt leere Ergebnisse, obwohl sie einige Stunden früher funktionierte. Das ist der Grund, warum meine Cache-Handler nicht funktionieren, weil sie Apciterator in Verbindung mit apc_delete($iterator) verwenden, um entsprechende Elemente zu erhalten und sie zu löschen, sobald eine Änderung vorgenommen wurde. Da foreach/array leer ist, gibt es nichts zu löschen. Das ist ein großes Problem. Ich gehe nicht davon aus, dass dies erwartetes Verhalten ist. Irgendwelche Ideen wie ist das möglich?

Ich habe das folgende Setup auf meinem VPS:

  • CentOS 7
  • Nginx mit PHP-FPM
  • PHP 5.4.16
  • APC 3.1.13

APC-Einstellungen:

apc.cache_by_default 1 
apc.canonicalize 1 
apc.coredump_unmap 0 
apc.enable_cli 0 
apc.enabled 1 
apc.file_md5 0 
apc.file_update_protection 2 
apc.filters 
apc.gc_ttl 3600 
apc.include_once_override 0 
apc.lazy_classes 0 
apc.lazy_functions 0 
apc.max_file_size 1M 
apc.mmap_file_mask /tmp/apc.Z1n8dS 
apc.num_files_hint 512 
apc.preload_path  
apc.report_autofilter 0 
apc.rfc1867 0 
apc.rfc1867_freq 0 
apc.rfc1867_name APC_UPLOAD_PROGRESS 
apc.rfc1867_prefix upload_ 
apc.rfc1867_ttl 3600 
apc.serializer default 
apc.shm_segments 1 
apc.shm_size 256M 
apc.shm_strings_buffer 4M 
apc.slam_defense 1 
apc.stat 1 
apc.stat_ctime 0 
apc.ttl 7200 
apc.use_request_time 1 
apc.user_entries_hint 4096 
apc.user_ttl 7200 
apc.write_lock 1 
+0

Es ist wie Ihre Regex scheint nicht die restlichen Tasten entsprechen, was ist, wenn Sie es ändern passiert: 'neue APCIterator (‚user‘, '/\\ resource\/schx_web\/.*/ ', APC_ITER_KEY); '? – Paradoxis

+0

@Paradoxis Dies gibt 'bool (false)' zurück und nichts wird gelöscht. Weiteres Debugging: Die Zahl 'APCIterator :: getTotalCount 'liefert keine Übereinstimmung mit den Elementen, die gelöscht werden, wenn eine foreach-Schleife verwendet wird, um über die' $ iterator '-Variable zu iterieren. Also muss das Problem irgendwo hier sein ... – travisbotello

+0

Versuchen Sie, Ihren Webserver neu zu starten – Paradoxis

Antwort

1

APCIterator gibt fälschlicherweise nur Cache-Einträge zurück, die jünger als apc.ttl sind, aber sie enthält diese in der Zahl, die von getTotalCount() zurückgegeben wird.

ich eine Pull-Anforderung für diesen Fehler hier vorgelegt haben: https://github.com/krakjoe/apcu/pull/253

Verwandte Themen