Hej,

Mam taki skrypt generujący pewien obrazek na podstawie jakiś tam danych pobieranych z serwera, wprowadziłem sobie prosty cache żeby nie generować tego obrazka częściej niż jakiś czas T (docelowo ~600s). Wszystko działa dobrze, poza przypadkiem w którym użytkownik trafia na to wywołanie kodu które generuje obrazek na następny czas, wtedy nic się nie wyświetla. Czy moglibyście spojrzeć?

  1. $sys_tab = unserialize(file_get_contents('sys/dane')); //pobranie informacji o wieku cache i dodatkowych info do zapisania w sesji
  2.  
  3. if ($sys_tab['age'] < (time() - 600)) {
  4. include('sys/gen.php');
  5. gen($_GET['u']); // wywolanie funkcji generującej
  6. $sys_tab = unserialize(file_get_contents('sys/dane'));// ponowne pobranie danych
  7.  
  8. }
  9.  
  10. //Ciastka i sesje - zapisanie jakiś potrzebnych informacji
  11. $coo = base64_encode(serialize($sys_tab['alleid']));
  12. $_SESSION['co2_'.$_GET['u']] = $coo;
  13. setcookie("ln".$_GET['u'], $coo, time()+3600*7, "/", "");
  14.  
  15. //Wyświetlanie obrazka
  16. $imgX = imagecreatefromjpeg('sys/cache.jpg');
  17. header ('Content-type: image/jpeg');
  18. imagejpeg($imgX, NULL, 95);
  19. imagedestroy($imgX);


  1. function gen($uid) {
  2. require_once '../nusoap.php';
  3.  
  4. /*
  5.  
  6. Tu pobieram dane z serwera SOAP
  7.  
  8. */
  9.  
  10. $im = imagecreatetruecolor(560,280);
  11.  
  12. $ix = 0;
  13. $iy = 0;
  14. $ii = 0;
  15. for ($i=0; $i<12; $i++) {
  16. if ($ii == 8/2) {
  17. $ix = 0;
  18. $iy = 140;
  19. }
  20. $img1 = imagecreatefromjpeg('tlo.jpg');
  21. $img = @imagecreatefromjpeg($pro[$i]['img']);
  22. if ($img) {
  23. @imagecopy($img1, $img, 6, 6, 0, 0, 128, 96);
  24. $col_tx = imagecolorallocate($img1, 0,0,0);
  25. $tt = explode(".", $pro[$i]['cena']);
  26. $tt[1] = substr_replace("00", $tt[1],0,strlen($tt[1]));
  27. $tt[0] = substr_replace(" ", $tt[0],max(-strlen($tt[0]),-2));
  28. imagettftext($img1, 10, 0, 20, 122, $col_tx, 'verdana.ttf', "Cena: ".$tt[0].",".$tt[1]."zł");
  29. imagecopy($im, $img1, $ix, $iy, 0, 0, 140, 140);
  30. @imagedestroy($img);
  31. $co[$ii] = $pro[$i]['id'];
  32. $ix += 140;
  33. $ii++;
  34. if($ii == 8) break;
  35. }
  36. }
  37. imagejpeg($im, 'sys/cache.jpg', 85);
  38. imagedestroy($im);
  39. imagedestroy($img1);
  40. $fp = fopen('sys/dane', 'w');
  41. $sys_tab['age'] = time();
  42. $sys_tab['alleid'] = $co;
  43. fwrite ($fp, serialize($sys_tab));
  44. fclose($fp);
  45.  
  46. }


co przeoczyłem że obrazek się nie wyświetla dla wywołania generującego obrazek??


Na pewno przeszkadza to że przed ostatecznym wywołaniem imagejpeg() które wyświetla obrazek, następuje zapis do pliku 'dane', jednak poprawienie tego jeszcze nie wystarczyło. Żeby chodziło sprawnie zrezygnowałem z wywoływania tego jako funkcji wkleiłem kod w skrypt, oraz w przypadku wywołania skryptu z generacją obrazka obrazek jest wyświetlany od razu ze zmiennej z której jest zapisywany. Jednak wydaje mi się że musi być inny sposób żeby to dobrze rozwiązać, ale na razie w wersji tym czasowej to działa.