Cancellazione File dal Server.

My Design Community

Nuovo Utente
2 Nov 2015
17
0
0
Salve, complimenti per il Forum ... davvero molto utile ed interessante.

Non sono molto pratico con il linguaggio PHP e dovrei inserire in un file PHP (di seguito allegato) una funzione che mi permette di cancellare il file più vecchio in una cartella specifica nel Server.

FILE PHP ESISTENTE

PHP:
<?php
$curl_handle=curl_init();
curl_setopt($curl_handle, CURLOPT_URL, 'http://www.cs.....');
curl_setopt($curl_handle,CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($curl_handle,CURLOPT_MAXREDIRS, 10000);
curl_setopt($curl_handle,CURLOPT_RETURNTRANSFER, 1);
$buffer = curl_exec($curl_handle);
curl_close($curl_handle);
if (empty($buffer))
echo "Spiacente ma qualcosa non ha funzionato.";
else
echo $buffer;
?>

Grazie per il vostro aiuto.

:byebye:
 
Ultima modifica di un moderatore:
ciao, io uso:

PHP:
<?php
$path = "UserData/";
if ($handle = opendir($path)) {
  while (false !== ($file = readdir($handle))) {
    if ((time()-filectime($path.$file)) > 2*24*60*60) {
      $per = "$path$file";
      unlink($per);
    }
  }
}
?>

Dove 2*24*60*60 il 2 in grassetto è il numero di giorni dopo il quale il codice elimina i file.
 
ciao, io uso:

PHP:
<?php
$path = "UserData/";
if ($handle = opendir($path)) {
  while (false !== ($file = readdir($handle))) {
    if ((time()-filectime($path.$file)) > 2*24*60*60) {
      $per = "$path$file";
      unlink($per);
    }
  }
}
?>

Dove 2*24*60*60 il 2 in grassetto è il numero di giorni dopo il quale il codice elimina i file.

Il file che dovrei cancellare ha sempre la stessa estensione ma il nome non è mai lo stesso.
Inoltre, dovrebbe funzionare che si attiva se tutto ha funzionato bene quindi integrandolo al codice che ho scritto nel post precedente se e solo se l'esito è positivo.

Quando scrivi 2*24*60*60 ti riferisci ai giorni, quindi ad esempio basterebbe solo scrivere così ?

if ((time()-filectime($path.$file)) > 30) {

Grazie.
 
prova questa soluzione, sperando di aver interpretato bene la necessità
PHP:
<?php 
$curl_handle=curl_init();
curl_setopt($curl_handle, CURLOPT_URL, 'http://www.cs.....');
curl_setopt($curl_handle,CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($curl_handle,CURLOPT_MAXREDIRS, 10000);
curl_setopt($curl_handle,CURLOPT_RETURNTRANSFER, 1);
$buffer = curl_exec($curl_handle);
curl_close($curl_handle);
if (empty($buffer))
  echo "Spiacente ma qualcosa non ha funzionato.";
else
  {
  DeleteOldestFile();
  echo $buffer;
}

function DeleteOldestFile() {

  $directory = "C:/Web_Sites/__Test/PHP/SolarPower/js"; // <- inserisci path senza barra finale
  $FileExt = ".txt"; // <- inserisci l'estensione del file o comunque la parte finale da controllare

  if (is_dir($directory))
  { 
    if ($directory_handle = opendir($directory))
    { 
      while (($FileName = readdir($directory_handle)) !== false)
      { 
        $FileRef = $directory."/".$FileName;

        if ( !is_dir($FileRef) )
        { 
          $FileCtime = filectime($FileRef);

          // echo $FileName."<br />".$FileCtime."<br />";

          if ( substr($FileName, -strlen($FileExt)) == $FileExt and ( empty($OldestFile) or $FileCtime < $OldestCtime ) )
          { 
            $OldestFile  = $FileRef;
            $OldestCtime = $FileCtime;
          }
        }
      }
      closedir($directory_handle);

      if ( empty($OldestFile) ) return false;
      else
      { 
        echo $OldestFile."<br />";
//      unlink($OldestFile); 
        return $OldestFile;
      } 
    } 
  } 
}
?>

ps ho commentato unlink giusto perché tu possa fare delle prove in sicurezza
 
prova questa soluzione, sperando di aver interpretato bene la necessità
PHP:
<?php 
$curl_handle=curl_init();
curl_setopt($curl_handle, CURLOPT_URL, 'http://www.cs.....');
curl_setopt($curl_handle,CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($curl_handle,CURLOPT_MAXREDIRS, 10000);
curl_setopt($curl_handle,CURLOPT_RETURNTRANSFER, 1);
$buffer = curl_exec($curl_handle);
curl_close($curl_handle);
if (empty($buffer))
  echo "Spiacente ma qualcosa non ha funzionato.";
else
  {
  DeleteOldestFile();
  echo $buffer;
}

function DeleteOldestFile() {

  $directory = "C:/Web_Sites/__Test/PHP/SolarPower/js"; // <- inserisci path senza barra finale
  $FileExt = ".txt"; // <- inserisci l'estensione del file o comunque la parte finale da controllare

  if (is_dir($directory))
  { 
    if ($directory_handle = opendir($directory))
    { 
      while (($FileName = readdir($directory_handle)) !== false)
      { 
        $FileRef = $directory."/".$FileName;

        if ( !is_dir($FileRef) )
        { 
          $FileCtime = filectime($FileRef);

          // echo $FileName."<br />".$FileCtime."<br />";

          if ( substr($FileName, -strlen($FileExt)) == $FileExt and ( empty($OldestFile) or $FileCtime < $OldestCtime ) )
          { 
            $OldestFile  = $FileRef;
            $OldestCtime = $FileCtime;
          }
        }
      }
      closedir($directory_handle);

      if ( empty($OldestFile) ) return false;
      else
      { 
        echo $OldestFile."<br />";
//      unlink($OldestFile); 
        return $OldestFile;
      } 
    } 
  } 
}
?>

ps ho commentato unlink giusto perché tu possa fare delle prove in sicurezza

Ciao, ma le parti nel codice che sono commentate per provare se funziona devo togliere il commento ? A che servono ?
Grazie.
 
no, ho lasciato l'echo nella parte centrale, nel caso si vogliano vedere i valori che vengono presi in considerazione,
ma non è necessaria e quindi è commentata

vanno modificate, la directory e l'estensione dei file, che mi sembrano delle costanti
l'estensione viene usata per controllo

dopo le prove, unlink deve essere resa operativa e commentata l'echo che la precede

non sapendo se lo script originale è attivato da una chiamata Ajax, ho evitato di mettere echo che potrebbero disturbare il funzionamento
 
no, ho lasciato l'echo nella parte centrale, nel caso si vogliano vedere i valori che vengono presi in considerazione,
ma non è necessaria e quindi è commentata

vanno modificate, la directory e l'estensione dei file, che mi sembrano delle costanti
l'estensione viene usata per controllo

dopo le prove, unlink deve essere resa operativa e commentata l'echo che la precede

non sapendo se lo script originale è attivato da una chiamata Ajax, ho evitato di mettere echo che potrebbero disturbare il funzionamento

Ho provato e non funziona ma forse sbaglio qualcosa ...

$FileRef = $directory."/".$FileName;

Al posto della / devo mettere qualcosa ?
 
Ho provato e non funziona ma forse sbaglio qualcosa ...

$FileRef = $directory."/".$FileName;

Al posto della / devo mettere qualcosa ?
no assolutamente no,

devi modificare
PHP:
  $directory = "C:/Web_Sites/__Test/PHP/SolarPower/js"; // <- inserisci path senza barra finale 
  $FileExt = ".txt"; // <- inserisci l'estensione del file o comunque la parte finale da controllare
avendo cura di non mettere la barra alla fine della $directory
 
no, ho lasciato l'echo nella parte centrale, nel caso si vogliano vedere i valori che vengono presi in considerazione,
ma non è necessaria e quindi è commentata

vanno modificate, la directory e l'estensione dei file, che mi sembrano delle costanti
l'estensione viene usata per controllo

dopo le prove, unlink deve essere resa operativa e commentata l'echo che la precede

non sapendo se lo script originale è attivato da una chiamata Ajax, ho evitato di mettere echo che potrebbero disturbare il funzionamento

Il file funziona però c'è un problema ... non cancella il più vecchio ma tutti i files con quella estensione.
Inoltre, la prima parte di codice non viene eseguita e riporta errori interni, tutto questo accade dopo che " unlink deve essere resa operativa e commentata l'echo che la precede " mentre prima di effettuare questa operazione usciva scritto il percorso, il file e 200 OK e la prima parte del file funzionava.
 
per sicurezza sostituisci le righe con,
PHP:
      if ( empty($OldestFile) ) return; 
      else 
      {  
        echo $OldestFile."<br />"; 
//      unlink($OldestFile);  
        return;
evitiamo di restituire valori con "return"
riprova ancora con echo e lasciando commentato unlink
se non esce il nome del file corretto riposta il tuo script completo
ciao
Marino
 
per sicurezza sostituisci le righe con,
PHP:
      if ( empty($OldestFile) ) return; 
      else 
      {  
        echo $OldestFile."<br />"; 
//      unlink($OldestFile);  
        return;
evitiamo di restituire valori con "return"
riprova ancora con echo e lasciando commentato unlink
se non esce il nome del file corretto riposta il tuo script completo
ciao
Marino

La prima parte dello script non funziona ... poi esce scritto il nome corretto almeno 100 volte e poi il seguente errore:

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.

Questo è lo script attuale:

PHP:
<?php 
$curl_handle=curl_init();
curl_setopt($curl_handle, CURLOPT_URL, 'http://www...');
curl_setopt($curl_handle,CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($curl_handle,CURLOPT_MAXREDIRS, 10000);
curl_setopt($curl_handle,CURLOPT_RETURNTRANSFER, 1);
$buffer = curl_exec($curl_handle);
curl_close($curl_handle);
if (empty($buffer))
  echo "Spiacente ma qualcosa non ha funzionato.";
else
  {
  DeleteOldestFile();
  echo $buffer;
}

function DeleteOldestFile() {

  $directory = "/web/..."; // <- inserisci path senza barra finale
  $FileExt = ".jpa"; // <- inserisci l'estensione del file o comunque la parte finale da controllare

  if (is_dir($directory))
  { 
    if ($directory_handle = opendir($directory))
    { 
      while (($FileName = readdir($directory_handle)) !== false)
      { 
        $FileRef = $directory."/".$FileName;

        if ( !is_dir($FileRef) )
        { 
          $FileCtime = filectime($FileRef);

          // echo $FileName."<br />".$FileCtime."<br />";

          if ( substr($FileName, -strlen($FileExt)) == $FileExt and ( empty($OldestFile) or $FileCtime < $OldestCtime ) )
          { 
            $OldestFile  = $FileRef;
            $OldestCtime = $FileCtime;
          }
        }
      }
      closedir($directory_handle);

      if ( empty($OldestFile) ) return;
      else
      {
        echo $OldestFile."<br />";
//      unlink($OldestFile);
        return;
      }
    }
  }
}
?>
 
Ultima modifica di un moderatore:
poi esce scritto il nome corretto almeno 100 volte e poi il seguente errore:

il comportamento dello script, che segnali, non dipende certamente dalla cancellazione del file,
se esce almeno 100 volte il nome del file, visto che non lo cancelliamo, vuol dire che lo script viene eseguito almeno 100 volte

quindi ti rivolgo la domanda, cosa fare ?

ps, se avessimo lasciato la cancellazione ti avrebbe cancellato almeno 100 files diversi
come hai scritto in un post precedente, "ha cancellato tutti i files con la terminazione ..."

forse la logica del processo è diversa rispetto alla variazione che hai chiesto di introdurre
 
Ultima modifica:
il comportamento dello script, che segnali, non dipende certamente dalla cancellazione del file,
se esce almeno 100 volte il nome del file, visto che non lo cancelliamo, vuol dire che lo script viene eseguito almeno 100 volte

quindi ti rivolgo la domanda, cosa fare ?

ps, se avessimo lasciato la cancellazione ti avrebbe cancellato almeno 100 files diversi
come hai scritto in un post precedente, "ha cancellato tutti i files con la terminazione ..."

forse la logica del processo è diversa rispetto alla variazione che hai chiesto di introdurre

Però ti voglio dire una cosa ...

Questa soluzione funzionava:

PHP:
<?php  
$curl_handle=curl_init(); 
curl_setopt($curl_handle, CURLOPT_URL, 'http://www.cs.....'); 
curl_setopt($curl_handle,CURLOPT_FOLLOWLOCATION, TRUE); 
curl_setopt($curl_handle,CURLOPT_MAXREDIRS, 10000); 
curl_setopt($curl_handle,CURLOPT_RETURNTRANSFER, 1); 
$buffer = curl_exec($curl_handle); 
curl_close($curl_handle); 
if (empty($buffer)) 
  echo "Spiacente ma qualcosa non ha funzionato."; 
else 
  { 
  DeleteOldestFile(); 
  echo $buffer; 
} 

function DeleteOldestFile() { 

  $directory = "C:/Web_Sites/__Test/PHP/SolarPower/js"; // <- inserisci path senza barra finale
  $FileExt = ".txt"; // <- inserisci l'estensione del file o comunque la parte finale da controllare

  if (is_dir($directory)) 
  {  
    if ($directory_handle = opendir($directory)) 
    {  
      while (($FileName = readdir($directory_handle)) !== false) 
      {  
        $FileRef = $directory."/".$FileName; 

        if ( !is_dir($FileRef) ) 
        {  
          $FileCtime = filectime($FileRef); 

          // echo $FileName."<br />".$FileCtime."<br />"; 

          if ( substr($FileName, -strlen($FileExt)) == $FileExt and ( empty($OldestFile) or $FileCtime < $OldestCtime ) )
          {  
            $OldestFile  = $FileRef; 
            $OldestCtime = $FileCtime; 
          } 
        } 
      } 
      closedir($directory_handle); 

      if ( empty($OldestFile) ) return false; 
      else 
      {  
        echo $OldestFile."<br />"; 
//      unlink($OldestFile);  
        return $OldestFile; 
      }  
    }  
  }  
} 
?>

Ma se togliamo il commento su unlink e lo inseriamo su echo precedente non funziona più.
 
Ultima modifica di un moderatore:
cosa succede commentando entrambi ?
PHP:
// echo $OldestFile."<br />"; 
 // unlink($OldestFile);
scusa la banalità ma, prova per cortesia

meglio sarebbe provare con,
PHP:
if ( empty($OldestFile) ) return; 
else 
{ 
// echo $OldestFile."<br />"; 
// unlink($OldestFile); 
return;
 
cosa succede commentando entrambi ?
PHP:
// echo $OldestFile."<br />"; 
 // unlink($OldestFile);
scusa la banalità ma, prova per cortesia

meglio sarebbe provare con,
PHP:
if ( empty($OldestFile) ) return; 
else 
{ 
// echo $OldestFile."<br />"; 
// unlink($OldestFile); 
return;

Ho provato, lo script nella prima parte non parte e poi genera a video questo errore:

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.
 
ho deciso di provare lo script completo, compresa la parte di lettura dei dati da remoto (curl)
PHP:
<?php

require_once 'Config_DB.php';

$inverterID	= '0001';

$sql		= "select Apikey, SystemId from PVoutput_ident where inverterID='".$inverterID."'";
$data		= $db->queryS($sql);
$Apikey		= $data[0][0];
$SystemId	= $data[0][1];

$url="http://pvoutput.org/service/r2/getstatistic.jsp?sid=".$SystemId."&key=".$Apikey."&df=20151105&dt=20151105";

$curl_handle=curl_init();
curl_setopt($curl_handle, CURLOPT_URL, $url); 
curl_setopt($curl_handle,CURLOPT_FOLLOWLOCATION, TRUE); 
curl_setopt($curl_handle,CURLOPT_MAXREDIRS, 10000); 
curl_setopt($curl_handle,CURLOPT_RETURNTRANSFER, 1); 
$buffer = curl_exec($curl_handle); 
curl_close($curl_handle); 
if (empty($buffer)) 
  echo "Spiacente ma qualcosa non ha funzionato."; 
else 
  { 
  DeleteOldestFile(); 
  var_dump($buffer); 
} 

function DeleteOldestFile() { 

  $directory = "/web/files_jpa"; // <- inserisci path senza barra finale 
  $FileExt = ".jpa"; // <- inserisci l'estensione del file o comunque la parte finale da controllare 

  if (is_dir($directory)) 
  {  
    if ($directory_handle = opendir($directory)) 
    {  
      while (($FileName = readdir($directory_handle)) !== false) 
      {  
        $FileRef = $directory."/".$FileName; 

        if ( !is_dir($FileRef) ) 
        {  
          $FileCtime = filectime($FileRef); 

          // echo $FileName."<br />".$FileCtime."<br />"; 

          if ( substr($FileName, -strlen($FileExt)) == $FileExt and ( empty($OldestFile) or $FileCtime < $OldestCtime ) ) 
          {  
            $OldestFile  = $FileRef; 
            $OldestCtime = $FileCtime; 
          } 
        } 
      } 
      closedir($directory_handle); 

      if ( empty($OldestFile) ) return; 
      else 
      { 
        echo $OldestFile."<br />"; 
//      unlink($OldestFile); 
        return; 
      } 
    } 
  } 
} 
?>


devo estrarre i dati presenti sul sito pvoutput.org per il giorno 5/11/2015

Curl_1.PNG


ho creato il folder dove parcheggiare i dati ".jpa"

Curl_2.PNG


eseguo lo script con attivo "echo" e commentato "unlink"
come vedi, sceglie il file più vecchio e visualizza con "var_dump" il contenuto di "$buffer" ricevuto dal sito remoto


Curl_3.PNG


adesso commento "echo" e attivo "unlink"

Curl_4.PNG


rieseguo lo script, che mi visualizza solo i dati ricevuti

Curl_5.PNG

nel folder dei file (continua)
 
Ultima modifica:
Curl_6.PNG

quindi l'errore che ottieni non dipende da queste modifiche ma da altro ...
non solo, il processo di scelta del file e cancellazione, funziona correttamente
 
Ultima modifica:

Discussioni simili