Архив рубрики: PHP

Простой способ сохранить файл по нажатию кнопки на странице (HTML)

Задача: по нажатию кнопки на странице, чтоб вызывался диалог сохранения файла и собственно сохранялся произвольный файл с сервера.

Решение:

В коде html страницы упоминаем скрытую форму:

<form method="post" action="inc/csvExport.php">
	<input type="hidden" name="csvBuffer" id="csvBuffer" value="" />
</form>

Добавляем туда же обработчик нажатия вида:

    $("#viewwork").click(function(){       
            document.forms[0].method='POST';
            document.forms[0].action=save_file.php; 
            document.forms[0].target='_self';
            document.forms[0].submit();  	    	    
       return false;
    });

Ну код на сервере для:

save_file.php:

<?php

// Данный код создан и распространяется по лицензии GPL v3
// Изначальный автор данного кода - Грибов Павел
// http://грибовы.рф

$ex= "1;2;3;4;5;6;7";
 header("Content-type: application/msexcel");
    header("Accept-Ranges: bytes");
    header("Content-Length: " . strlen($ex));
    header("Content-Disposition: attachment; filename=rep_by_addr.csv");

?>

csvExport.php:

<?php

// Данный код создан и распространяется по лицензии GPL v3
// Изначальный автор данного кода - Грибов Павел
// http://грибовы.рф

header('Content-type: application/vnd.ms-excel');
if (isset($_GET["csv"])==true){
    header("Content-Disposition: attachment; filename=file.csv");
} else {
    header("Content-Disposition: attachment; filename=file.xls");
};
header("Pragma: no-cache");

$buffer = $_POST['csvBuffer'];

try{
    echo $buffer;
}catch(Exception $e){

}
?>

php: Fatal error: Allowed memory size of 134217728 bytes exhausted

Эта ошибка может возникать при использовании больших массивов или строк большой величины.

Решение: увеличиваем размер памяти под скрипты php в php.ini (по умолчанию 128М), например до:

memory_limit = 256M

Сохранение конфигурации Dlink в файл через SNMP

Иногда требуется на всякий случай иметь бекапы конфигурации работающих в данный момент свичей. Один из вариантов — поднимаем сервер TFTP и просим свич сохранить свою конфигурацию на него.

Пример скрипта:

      PutLog("-- Стартуем сохранение конфиги у $device_name");    
      $cm="snmpset -v2c -c X-Files $ip 1.3.6.1.4.1.171.12.1.2.18.1.1.3.3 a $tftpserver";
      PutLog("--- устанавливаем tftp сервер: $cm");    
      $rez=`$cm`;      
      if (strripos($rez,"IpAddress")>0){
        $cm="snmpset -v2c -c X-Files $ip 1.3.6.1.4.1.171.12.1.2.18.1.1.5.3 s $device_name.cfg";
        PutLog("---- устанавливаем имя файла: $cm");              
        $rez=`$cm`;      
        if (strripos($rez,"STRING")>0){
            $cm="snmpset -v2c -c X-Files $ip 1.3.6.1.4.1.171.12.1.2.18.1.1.8.3 i 2";
            PutLog("----- устанавливаем конфиг для сохранения: $cm");              
            $rez=`$cm`;                  
            if (strripos($rez,"INTEGER")>0){
                $cm="snmpset -v2c -c X-Files $ip 1.3.6.1.4.1.171.12.1.2.18.1.1.12.3 i 3";
                PutLog("----- сохраняем конфиг : $cm");              
                $rez=`$cm`;                  
              if (strripos($rez,"INTEGER")>0){                
                  sleep(10);
                  //переименуем полученный файл
                  $newname=$device_name.Date("-Y-m-d-H-i");
                  $rez=`mv /var/tftp/$device_name.cfg /var/tftp/$newname.cfg`;
                   echo "$rez\n";
                  //добавим в архив
                  $rez=`zip /var/tftp/$device_name.zip -m /var/tftp/$newname.cfg`;
                  echo "$rez\n";
              } else {
               PutLog("-- ОШИБКА сохранения конфига");    
            };
            } else {
            PutLog("-- ОШИБКА установки конфига");    
            };            
        } else {
        PutLog("-- ОШИБКА установки имени файла");    
      };
      } else {
        PutLog("-- ОШИБКА установки tftp сервера у $device_name");    
      };

Перебор каждого дня месяца за выбранный период, с выделением последнего дня месяца

Задача: перебрать каждый день, в выбранном периоде, отдельно выделяя последний день месяца.

Решение:

echo "<h1>Расчет за период с $dtstart по $dtend</h1>";

$date=$dtstart;   
while($date <= $dtend){
    echo "$date<br/>";    
    if (trim($date)==getLastDayOfMonth2(trim($date))) {
	echo "<b>$date</b><br/>";	
    };
  $date = date('Y-m-d', strtotime($date.' + 1 days'));       
};
function getLastDayOfMonth2($dateInISO8601){    
    $date = explode('-', $dateInISO8601);
    $zx=$date;
    if ( !checkdate ( $date[1] , $date[2] , $date[0] ) )
        return false; 
    $start = new DateTime( $dateInISO8601 );
    $end = new DateTime( $dateInISO8601 );
    $end->add( new DateInterval( 'P2M' ) );
    $interval = new DateInterval( 'P1D' );
    $daterange = new DatePeriod($start, $interval, $end);
    $prev = $start;
    foreach ($daterange as $date){
        if ($prev->format('m') != $date->format('m') )
            return  $zx[0]."-".$zx[1]."-".(int) $prev->format('d'); 
        $prev = $date;
    }    
    return false;
}