Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Zipowanie plików
Forum PHP.pl > Forum > Przedszkole
atom90
Witam od pewnego czasu mam dziwny problem.

Skrypt, który używałem do pakowania/ robienia kopii zapasowej zawsze działał.
Od pewnego czasu nie potrafi poradzić sobie z prawdopodobnie wiekszą ilościa plików. Mimo to, że wcześniej wykonywał te kopie.
Przykładowo stosuje go do kopii wordpresów. teraz niestety, nie kończy wykonanie skryptu Tworząc plik:
2017-10-16-backup.zip.VVlEF3

czyli w którymś momencie kończy wykonywać się i nie dochodzi do:
$zip->close();


Tutaj kod skryptu:
Kod
<?php
session_start();
$when=date("Y-m-d");
if (!file_exists('../BackUp')) {
    mkdir('../BackUp', 0777, true);
    echo 'Utworzono katalog BackUp <br>';
}
else{

}

// Get real path for our folder
$rootPath = realpath('../');

// Initialize archive object
$zip = new ZipArchive();
$zip->open('../BackUp/'.$when.'-backup.zip', ZipArchive::CREATE | ZipArchive::OVERWRITE);

// Create recursive directory iterator
/** @var SplFileInfo[] $files */
$files = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($rootPath),
RecursiveIteratorIterator::LEAVES_ONLY
);

foreach ($files as $name => $file)
{
// Skip directories (they would be added automatically)
if (!$file->isDir())
{
// Get real and relative path for current file
$filePath = $file->getRealPath();

$relativePath = substr($filePath, strlen($rootPath));
//if((strpos($relativePath, 'BackUp') !== false) || (strpos($relativePath, 'zipper') !== false)){

//Dla m-foto/ bez sklepu
if((strpos($relativePath, 'BackUp') !== false) || (strpos($relativePath, 'zipper') !== false) ){
}

// Add current file to archive
else{
  $_SESSION["show_path"]=$relativePath;
  //echo $relativePath."<br>";
echo '<pre>' . print_r($_SESSION["show_path"], TRUE) . '</pre>';
$zip->addFile($filePath, $relativePath);
}
}
}

// Zip archive will be created only after closing object
$zip->close();
echo "BackUp plików zakończony";


?>



Może ktoś wie dlaczego tak się dzieje?
nospor
Wlacz logowanie bledow i sprawdz na czym sie wykrzacza.
atom90
Kod
error_reporting = E_ALL & ~E_NOTICE
error_log = /errors.log
log_errors = On



utworzyłem plik dałem mu prawa do zapisu i nic nie ma tam :/
nospor
Drobna dygresja: czemu uwazasz ze E_NOTICE to nie blad?

Gdzie dales te zmiany? Zrestartowales serwer www by zmiany weszly w zycie?
atom90
zrobilem na przykladzie home.pl (tam np mam jedna ze stron). dzialac to dziala. bo wywolalem specjalnie blad np funkcje ktora nie istnieje. zapisuje do tego pliku.
Ale sam skrypt wykonuje sie bez bledu i go nie notuje. ale plik nie zostaje poprawnie stworzony.

Moze na localu sproboje to zasymulowac, tylko jak poprawnie utworzyc taki log.
nospor
ok, uzyj tego do wyswietlenia stanu
http://php.net/manual/en/ziparchive.getstatusstring.php
atom90
Ale gdzie, jak to się używa....
nospor
zgodnie co napisali w manualu, funkcja zwraca blad/status zip. No to albo sobie wyswietl to co zwraca ta funkcja albo sobie zapisz do pliku/logu.... A gdzie? A chociazby przed zamknieciem/close() zipa tudziez za
atom90
w string mam dac to gdzie sie zapisuje?

echo $zip ZipArchive::getStatusString();

bo naprawde nie wiem jak to użyć....
nospor
$zip->close();
echo $zip->getStatusString();
echo "BackUp plików zakończony";


zakladam ze widzisz na ekranie text 'BackUp plików zakończony'
atom90
Właśnie nie. Ostatnie co widze to jedna ze sciezek po której skrypt chodził.
wiec do tej lini jakby nie dociera. I do funkcji, która podałeś
nospor
No to ewidentnie skrypt sie wywala i musi pluc bledem.
atom90
z listingow jak wyswietlam te sciezki to konczy sie tak:
/local/wp-content/plugins/updraftplus/includes/updraft-notices.php

/local/wp-content/plugins/updraftplus/in

urwana sciezka i kuniec
sabat24
Wygląda na przekroczenie czasu wykonywania albo przekroczenie pamięci czy innego zasobu. Czasami na niektórych hostingach nie wyrzuca o tym błędu, bo taki skrypt jest zwyczajnie zestrzeliwany przez jakiegoś demona na serwerze, który dba o niską zasobożerność. Odpal to lokalnie przez CLI i zobacz wtedy.
atom90
na xampie jak odpalilem:

Fatal error: Maximum execution time of 30 seconds exceeded in /PRACA/www/langpartest/zipper/ziper.php on line 26

Warning: Unknown: Cannot destroy the zip context in Unknown on line 0


to jest 26 linia

foreach ($files as $name => $file)


lub 46 wskazal:
Fatal error: Maximum execution time of 30 seconds exceeded in /PRACA/www/langpartest/zipper/ziper.php on line 46

$zip->addFile($filePath, $relativePath);


Czyli wychodzi na to, że jak jest za dużo plików to skrypt zbyt długo się wykonuje co powoduje jego nie ukończenie?
Coś w tym da się zrobić?
sabat24
Najprościej podziel to na jakieś paczki. Zlicz wielkość poszczególnych plików, by wyestymować czas pracy skryptu i np. dodawaj do archiwum po X plików. Zapisz w bazie, czy w jakimś pliku, na czym skończyłeś i w kolejnym kroku dodaj kolejne pliki do archiwum. Nie musisz od razu stworzyć całego archiwum. Możesz dodawać pliki do już stworzonego częściowo archiwum.
Możesz też zliczać czas pracy skryptu, by wyrobić się zamknąć archiwum, nim skrypt przekroczy 30 sekund.

Możesz także spróbować zwiększyć limit czasu pracy skryptu. Niektóre hostingi pozwalają na to, aczkolwiek to nie rozwiąże nigdy problemu, że trafi się jakieś wielkie archiwum, które i tak przekroczy ten czas.

Alternatywnie odpalaj skrypt z lini poleceń, która zazwyczaj ma większe (niekiedy nieograniczone) limity czasu pracy skryptu. Ale tego się dowiedz od firmy, gdzie masz serwer.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.