apc_fetch() gibt false zurück

  • Ich möchte auf einer Seite eine Fortschrittsanzeige für uploads integrieren, zu diesem Zweck habe ich APC installiert. Das läuft auch laut phpinfo().

    PHP-Version 5.2.5
    APC 3.0.19

    Jetzt habe ich diverse Scripte für Upload-Fortschrittsanzeigen getestet, keins hat funktioniert. Nach ein wenig rumprobieren habe ich festgestellt, dass apc_fetch() immer false zurück liefert.

    PHP
    <?php 
    $bar = 'BAR'; 
    apc_store('foo', $bar); 
    var_dump(apc_fetch('foo')); 
    ?>

    Hier wird mir völlig korrekt ausgegeben: string(3) "BAR"

    Als Beispiel für ein getestetes Script:
    http://www.ibm.com/developerworks…v525/index.html
    Es tat sich beim upload nichts am Fortschrittsbalken, die Datei wird aber korrekt hochgeladen.

    Dann habe ich die getprogress.php folgendermaßen angepasst:

    PHP
    <?php 
    if(isset($_GET['progress_key'])) { 
      if($status = apc_fetch('upload_'.$_GET['progress_key'])) 
          echo $status['current']/$status['total']*100; 
      else echo "50"; 
    } 
    ?>

    Der ausgegebene Wert gibt den Upload-Fortschritt in Prozent an die javascript-funktion. Nach meiner Änderung springt dann der Fortschrittsbalken sofort auf 50% und bleibt da, also gibt apc_fetch() hier false zurück und springt in den else-Zweig. $_GET['progress_key'] wird korrekt übergeben.

    Meine apc-settings in der php.ini sehen folgendermaßen aus:
    [APC]
    apc.enable_cli = 1
    apc.enabled = 1
    apc.shm_segments = 1
    apc.optimization = 0
    apc.shm_size = 128
    apc.ttl = 7200
    apc.user_ttl = 7200
    apc.max_file_size = 200M
    apc.mmap_file_mask = /tmp/apc.XXXXXX
    apc.num_files_hint = 1024
    apc.rfc1867 = 1
    apc.rfc1867_prefix = upload_
    apc.rfc1867_name = APC_UPLOAD_PROGRESS
    apc.rfc1867_freq = 0

    Hat jemand eine Idee wo das Problem liegen könnte?

  • Also, wenn ich sowas machen würde, dann via Javascript einen Interval auf eine AJAX Funktion anwerfen, die dann auf eine PHP Datei zugreift und die KBs und berechnet und zurückgibt.

    Gruß crAzywuLf :)

  • Ja, so funktioniert das Script auch. Das Problem ist ja, dass die Informationen zum laufenden Upload mit apc_fetch() geholt werden und dieses mir immer false zurückgibt, statt einen Array mit Informationen zum laufenden Upload.
    Ansonsten läuft das Script fehlerfrei.

    Wo es bei mir hakt ist eben warum apc_fetch() auf die temp-datei false zurückgibt. Der upload läuft ja und die datei wird korrekt hochgeladen.

  • Das Script benutze ich selber auch für einen Upload bzw. habe ich damit "gelernt" wie man APC einsetzt.

    Wenn ich mich recht erinnere gab es im HTML-Formular eine Variable $unique_id oder so. Das Problem war, dass die Variable nie erzeugt wurde, weshalb der Upload auch nicht funktioniert hat.

    Also einfach

    Code
    <? $unique_id = rand(0,1000000); ?>


    oder

    Code
    <? $unique_id = md5(time().rand(0,100)); ?>


    etc.

    und dann im HTML Formular folgendes:

    HTML
    <input type="hidden" name="APC_UPLOAD_PROGRESS" id="progress_key" value="<?php echo $unique_id ?>"

    Dann sollte es eigentlich funktionieren :-).

    Mfg,
    Tobi

  • Die Änderungen bringen leider nichts.
    Ich hatte mir aber auch schon die über uniqid() generierte id ausgeben lassen, das passte schon.

    Ich vermute, dass irgendwelche Einstellungen in der php.ini noch nicht passen (obwohl ich schon mehrere stunden gesucht und nichts gefunden habe was noch falsch sein könnte) oder aber das apc probleme hat mit anderen extensions/modulen.
    Da habe ich bisher gefunden, dass ModSecurity, Suhosin, ZendOptimizer z.b. nicht mit APC zusammen laufen, bzw das dann APC nicht korrekt funktionieren soll.
    Davon habe ich aber nichts laufen, bzw schon deaktiviert.

  • Schreibrechte sollten da sein.

    In der php.ini sehe ich jetzt als einzigen Unterschied bei dem ich nicht weiß ob er relevant ist den Locking Type.
    Da hast du pthread mutex Locks
    Ich habe File Locks
    Allerdings wüßte ich jetzt nicht wo ich das ändern könnte.