Autor Zpráva
ondra256
Profil
Zdravím,

mám skript v PHPčku, který proskenuje adresář ($path) a uloží si do databáze názvy všech souborů, které najde. Když narazí na nějakou složku tak se rekurzivně volá funkce znovu a proskenuje adresář. Programuju to na Windowsu, kde používám WAMP server a skript bezproblémů vyhledá všechny soubory. Po nasazení skriptu na Linux (ubuntu) se skript vždy zastaví a neprovede se celý. Projde soubory, pak třeba 2 podsložky a zastaví se. V logu žádná chyba není. Na linuxu používám také wamp.

Skript vyvolává stisknutí tlačítka ve webové aplikaci. Vše vypadá, že se bez problémů vykoná, žádná chyba. Skript běží cca 5 sekund.

Napadlo mně se podívat na max_execution_time. Tam je hodnota 30. Pro jistotu jsem ji zvýšil na 60, ale na nic to vliv nemělo. Skript běží stále 5 sekund a nevykonná se celý.

Skript je ve stylu:
        if ($handle = opendir($path)) {
            while (false !== ($entry = readdir($handle))) {...}

Myslím, že chyba bude spíš v konfiguraci apache/php, ale nenapadá mně kde. Nevíte si někdo rady?
Joker
Profil
K té konfiguraci připomínám, protože sám jsem si jednou takhle naběhl, že PHP může používat jiný konfigurák při běhu přes webserver a jiný při běhu přes CLI (příkazový řádek).
ondra256
Profil
Tak jsem přišel kde je zhruba problém. Složky, které v názvu obsahují diakritiku jsou přeskočeny. Zároveň, když chci přes php stahnout soubor s diakritikou tak ho to nenalezne.

Nevíte jak to vyřešit? Ubuntu je sice instalovaný v angličtině, ale i na českém windowsu mám problém, že názvy souborů a adresáů s diakritikou dělají neplechu.

    public function scanDirectory($path = NULL)
    {
        if ($path === NULL) {
            $path = $this->path;
        }

        if ($handle = opendir($path)) {
            while (false !== ($entry = readdir($handle))) {
                $entry = utf8_encode($entry); // kdyz nazev souboru obsahuje diakritiku, tak jsou znaky s diakritikou nahrazeny divnými znaky, tento řádek to vrátí do původního stavu, když, ale pak na disku hledám soubor, který má takto opravený název, tak není nalezen

                if (is_dir($path . DIRECTORY_SEPARATOR . $entry)) {
                    if ($entry === '..' || $entry === '.') continue;
                    $this->scanDirectory($path. DIRECTORY_SEPARATOR . $entry); // skenuj podadresář
                } else {
                    if (!$this->exist($entry, $path)) {
                        // přidej do db
                    }
                }
            }
            }
            closedir($handle);
    }
Joker
Profil
ondra256:
Viz ten komentář:
kdyz nazev souboru obsahuje diakritiku, tak jsou znaky s diakritikou nahrazeny divnými znaky, tento řádek to vrátí do původního stavu, když, ale pak na disku hledám soubor, který má takto opravený název, tak není nalezen

Název souboru se nesmí překódovávat.

Předpokládám se v tom Ubuntu díváte na soubory pojmenované ve Windows?
Tam je ten problém, že Windows používají pro názvy souborů nějaké divné kódování, zatímco Linuxové aplikace vesměs očekávají Unicode (navíc mají k dispozici vlastně jen ten název a z něj nevyplývá, v jakém je kódování).

V tomhle ohledu je diakritika v názvech souborů opravdu problém, často obtížně řešitelný. Ale v tomhle případě by možná stačilo nepřekódovávat ty znaky (nepotřebujete lidsky čitelný název, ale ty původní bajty).

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0