Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [HTML][PHP]Odświeżanie wyświetlanego pliku PDF na stronie - bez rezultatu, Osadzony plik pdf bezpośrednio na stronie (zainst. AR) nie aktualizuje
wwwftp
post 28.03.2018, 02:30:49
Post #1





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 25.01.2018

Ostrzeżenie: (0%)
-----


Witam, posiadam stronę na której wstawiony jest link do pliku PDF, zainstalowany Adobe Reader umożliwia bezpośrednie otwarcie, a raczej wyświetlenie tego pliku na stronie.

Problem stanowi część odpowiedzialna za wyświetlanie, mianowicie w chwili zmiany na serwerze pliku na nowszy o tej samej nazwie, po automatycznym odświeżeniu nadal wyświetla poprzednią wersję dokumentu, rozumie że plik ten jest przechowywany w pamieci przeglądarki, niestety charakter tej strony i jej wyświetlania nie pozwala na takie zjawisko podczas przeglądania. Co zrobic aby ten plik był nadpisywany w przeglądarkach, lub najlepiej nie był przechowywany, lub tylko do czasu odświeżenia tej strony (co 4 min). Szukałem jakiegoś skryptu który automatycznie by kasował pamięć podręczną wybrane strony ale nie znalazłem.

w kodzie strony jest jeszcze część która sprawdza kiedy ten plik był modyfikowany. I to sprawdzanie atrybutów dziala bardzo dobrze. Czy ktoś może miał podobny problem?

poniżej kod str głównej, i przykładowy kod jednej ze stron .. testowo ustawiono poprawność linków dla plików 01.pdf oraz 02.pdf.

index.php
Kod
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
      <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
      
      <title>v1 grafik</title>
</head>

<body>
<p>
<div id='menu'>


<?php


$sciezka = "grafik";
$lista=array();
$katalog = opendir($sciezka);
while ($plik = strtolower(readdir($katalog))) {
  if ($plik<>"." && $plik<>"..") if(!is_dir($sciezka.$plik))
  $lista[]=$plik;
}
closedir($katalog);
sort($lista);
for ($i=0;$i<count($lista);$i++) {
  echo " &emsp;<a href=\"index.php?id=$lista[$i]\">$lista[$i]</a>";
}
?>

</div>

<div id='content'>
<?php
         switch($_GET['id']){
              case '01.pdf':
                     include 'niekasowac/01.php';
              break;

              case '02.pdf':
                     include 'niekasowac/02.php';
              break;


              default:
                     echo 'Taka strona nie istnieje';
              break;
       }
?>
</div>

</p>
</body>
</html>


pliki pdf w podkatalogu 'grafik'
a strony do wyswietlania plików w nim zawartych (z nazwami od 01 do 12.pdf) w katalogu 'niekasowac'

przykładowy plik 01.php

Kod
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>

<!--  <meta http-equiv="refresh" content="13" />   ustawienie   CZASU odswierzania w sekundach w html -->

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" />
<meta http-equiv="content-language" content="pl">
<meta name="description" content="Grafik Pracy" />
<meta name="keywords" content="operator maszyn grafik" />
<meta name="author" content="Sza+aniK" />
      <title>..:: GRAFIK :: PRACY :.: OPERATOR :: MASZYN ::..</title>
</head>

<body bgcolor="#4B66A5" text="white" style="margin-top:0cm" marginheight="0">
<p>

<table style="width: 100%;" >
<tbody>
<tr>
<td style="width: 20%;"><h3><div style="color:#FFFFFF;">01 Data ostatniej modyfikacji:  </div></h3></td>
<td style="width: 25%;">
<div style="color:#FFFFFF;"><b><h2>
<?php
//Definiujemy nazw_ pliku, wraz z jej sciezka
$name = "./grafik/01.pdf";  

function getModTime($file)
{
$time = filemtime($file);
$date = date("\n d.m.Y  \n, \g\o\d\z. \n H:i", $time);
echo "\n<h1>" . $date;
}
//Kod wy_wietlaj_cy zawarto__ funkcji
getModTime($name);
?>
</h2></b>
</div>
</td>
<td style="width: 25%;">

<p style="text-align:center; color:#99CCFF;">
uaktual. za:  
<span id="sekundy"></span>
<script type="text/javascript">
o = document.getElementById('sekundy')
   function odliczaj(o,sek)
   {
      o.innerHTML=sek
      if(sek > 0)
      {
         set = setTimeout(function(){odliczaj(o,--sek)},1e3)
      }
      if (sek == 0)
      {
         div = document.getElementById('hide');
         div.style.display = 'block';
      }
   }
  
odliczaj(document.getElementById('sekundy'), 240)
</script>
 sek.</p>


</td>
<td style="width: 30%; style="color: #ffffff;">
<h1>
<?php

//Deklaracja funkcji
function ost_mod($file)
{
$name = "./grafik/01.pdf";
// pobranie unixowej daty ostatniej modyfikacji pliku
$time = filemtime($name);

// obliczenie ile sekund minelo od ostatniej modyfikacji do teraz
$roznica_czas = time() - $time;

// Jezeli roznica jest mniejsza niz 3600 sekund (godzina)
if ($roznica_czas < 3600)
{
// Jezeli roznica jest mniejsza niz 120 sekund (2 minuty)
if ($roznica_czas < 120)
{
  $komunikat = "<font color=#FFEE22><b> 1 minute temu.</b></font> ";
}
// Jezeli roznica jest wieksza niz 120 sekund
else
{
  $komunikat = intval($roznica_czas / 60) . "<font color=#FFCC55><b> minut(y) temu.</b></font>";
}
}

// Jezeli roznica jest mniejsza niz 7200 sekund (2 godziny)
else if ($roznica_czas < 7200)
{
$komunikat =  "1 godzine\n" .intval(($roznica_czas -3600) / 60) .  " minut temu.";
}

// Jezeli roznica jest mniejsza niz 10800 sekund (3 godziny)
else if ($roznica_czas < 10800)
{
$komunikat =  "2 godziny\n" .intval(($roznica_czas -7200) / 60) .  " minut temu.";
}

// Jezeli roznica jest mniejsza niz 14400 sekund (4 godziny)
else if ($roznica_czas < 14400)
{
$komunikat =  "3 godziny\n" .intval(($roznica_czas -10800) / 60) .  " minut temu.";
}

// Jezeli roznica jest mniejsza niz 18000 sekund (5 godzin)
else if ($roznica_czas < 18000)
{
$komunikat =  "4 godziny\n" .intval(($roznica_czas -14400) / 60) .  " minut temu.";
}

// Jezeli roznica jest mniejsza niz 21600 sekund (6 godzin)
else if ($roznica_czas < 21600)
{
$komunikat =  "5 godzin\n" .intval(($roznica_czas -18000) / 60) .  " minut temu.";
}

// Jezeli roznica jest mniejsza niz 25200 sekund (7 godzin)
else if ($roznica_czas < 25200)
{
$komunikat =  "6 godzin\n" .intval(($roznica_czas -21600) / 60) .  " minut temu.";
}

// Jezeli roznica jest mniejsza niz 28800 sekund (2 godziny)
else if ($roznica_czas < 28800)
{
$komunikat =  "7 godzin\n" .intval(($roznica_czas -25200) / 60) .  " minut temu.";
}
// Jezeli roznica jest mniejsza niz 86400 sekund (jedna doba)
else if ($roznica_czas < 86400)
{
$komunikat = intval($roznica_czas / 3600) . " godziny temu.";
}

// Jezeli roznica jest mniejsza niz 172800 sekund (2 doby)
else if ($roznica_czas < 172800)
{
$komunikat = "1 dzien temu.";
}

// Jezeli roznica jest mniejsza niz 604800 sekund (1 tydzien)
else if ($roznica_czas < 604800)
{
$komunikat = intval($roznica_czas / 86400) . " dni temu.";
}

// Jezeli roznica jest mniejsza niz 1209600 sekund (2 tygodnie)
else if ($roznica_czas < 1209600)
{
$komunikat = "1 tydzen temu.";
}

// Jezeli roznica nie miesci sie w powyzszych warunkach
else
{
$komunikat = "ponad 2 tygodnie temu";
}

return "<em>zmiana:</em>\n " .$komunikat;

}

// wywolanie funkcji


echo ost_mod("");
?>
</h1>
</td>
</tr>
</tbody>
</table>
<!-- <embed src="../grafik/01.pdf" width="100%" height="600" />  -->
<?php

echo "<iframe src=\"./grafik/01.pdf\" width=\"100%\" style=\"height:100%\"></iframe>";
header('refresh: 13;');
?>
// testowo odswierzanie co 13 sek

</p>
</body>
</html>


może jest jakiś lepszy sposób/biblioteka umożliwiający wyświetlanie pdf/xdoc w php. Szukałem ale nie znalazłem lepszego rozwiązania.
Ważne aby po aktualizacji plików pdf były wyświetlane caly czas tylko aktualne, nie zachowane w pamieci, ręczne kasowanie pamięci podręcznej co kilka min odpada.

Udało mi się rozwiązać problem, poprzez wykorzystanie na serwerze php modułu mod_expires.c który testowo w programie XAMPP aktywować dla Apache.

w pliku .htaccess w katalogu głównym umieściłem kod:
Kod
<ifmodule mod_expires.c>
  ExpiresActive On
  ExpiresDefault "access plus 235 seconds"
  ExpiresByType text/html "access plus 600 seconds"
  ExpiresByType image/gif "access plus 2678400 seconds"
  ExpiresByType image/jpeg "access plus 3600 seconds"
  ExpiresByType image/png "access plus 3600 seconds"
  ExpiresByType text/css "access plus 600 seconds"
  ExpiresByType text/javascript "access plus 3600 seconds"
  ExpiresByType application/x-javascript "access plus 400 seconds"
  ExpiresByType application/pdf "access plus 20 seconds"
</ifmodule>


ExpiresByType application/pdf "access plus 20 seconds" - wpisy dokonały tego co potrzebuję
ExpiresDefault "access plus 235 seconds"

po określonym czasie pliki pdf tracą swą ważność w wyniku czego kasowane są z pamięci przeglądarki a w ich miejsce pobierane nowe/ponownie pliki z serwera.
no niestety nikt nie pomógł ale być może moje doświadczenia i rozwiązania komuś się przydadzą

Gdyby ktoś chciał wiedzieć do czego te strony są potrzebne - na dysku NAS firmy Synologic uruchomiony jest serwer PHP, do katalogu dla serwera php umieszczane są pliki w formacie PDF w folderze 'grafik' , odpowiednio dla danego miesiąca : styczeń '01.pdf', luty to '02.pdf' itd.
W plikach tych są zapiski aktualnych i przyszłych prac w firmie , serwisowania maszyn itp.
Osoba odpowiedzialna za dopilnowanie grafiku prac może utworzyć plik na maj 05.pdf, oraz z wyprzedzeniem na czerwiec itp. I pojawią sie do wyboru tylko dostępne miesiące dla ramki div menu.
Odpowiedni kod sprawdza po stronie serwera czy plik jak w przykładzie maj został zmodyfikowany i kiedy to nastąpiło, w ten sposób osoby odczytujace prace na dany miesiąc po otwarciu strony z serwera NAS wiedzą czy jakieś zmiany zaszły.

Co prawda strona nie est dopracowana do końca, są potrzebne poprawki, może jakieś style CSS . Ale już działa poprawnie i wg wytycznych zaplanowanych:
1. strona główna wyświetla w górnym menu tylko dostępne pliki dla danego miesiąca (nie więcej niż 4 w ciągu roku.
2. podczas zmiany plików na serwerze NAS/ ich edycji aktualizacji nie może dochodzić do blokowania edycji ze względu na otwarcie plikow przez jeden z komputerów w sieci - sytuacja taka miała miejsce gdy pliki były przeglądane (z prawem tylko do odczytu) z dołączonego dysku sieciowego.
3. strona ma się samoczynnie aktualizować i wyświetlane pliki PDF osadzone w stronie co określony przedział czasu
4. pliki PDF po odświeżeniu muszą być zawsze aktualne - problem w sytuacji wyświetlania plików z pamięci przeglądarki starszych niż pliki na serwerze.


zamykam temat happy.gif
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 27.05.2025 - 21:58