Zobrazit příspěvky

Tato sekce Vám umožňuje zobrazit všechny příspěvky tohoto uživatele. Prosím uvědomte si, že můžete vidět příspěvky pouze z oblastí Vám přístupných.


Příspěvky - Kit

Stran: 1 ... 27 28 [29] 30 31 ... 47
421
Vývoj / Re:PHP nechce nastavit Globals
« kdy: 18. 10. 2019, 11:52:06 »
Proměnná $global neexistuje. Když ten chybující řádek vyhodíš, tak by měl problém pominout.

422
Hardware / Re:Poraďte externý box na HDD 4x3,5"
« kdy: 17. 10. 2019, 21:00:16 »
Kup si USB hub a máš vystaráno.
A kto bude tie disky v tom plastovom obale chladit? Som si myslel, že výrobca tam dá nízkopríkonové disky... no nie on tam narval desktopový seagate s 7200 rpm, bez chladenia mi teplota stúpala nad 50°C  ??? ??? ???

To je takový problém disky postavit na výšku, jednu stranu krabičky otevřít a zespodu dát ventilátorek?

423
Hardware / Re:Poraďte externý box na HDD 4x3,5"
« kdy: 17. 10. 2019, 17:18:48 »
Kup si USB hub a máš vystaráno.

425
Jenom bych upřesnil, že neustále píšete, že selhávají funkce flock() a file_put_contents() atd., ale ve skutečnosti selhává váš kód. Ty funkce fungují správně, chyby jsou ve vašem kódu.
Nic jiného netvrdím. Záleží přece na tom jakým způsobem ty funkce použijete a to jsem psal, že já hledám funkci, která umožňuje přístup k souboru více uživateli, načíst soubor, změnit soubor, zapsat soubor. V mých testech není ta změna.

Tak to jsem ti přece takový skript napsal. Fopen, flock, fread, fwrite, fclose. To funguje perfektně a bez chyby.

Samozřejmě je lepší používat file_get_contents a file_put_contents s tím, že mezi nimi ten soubor zamknutý není, což v jiných aplikacích vůbec nevadí. Obvykle se totiž používají pro zápis generovaného souboru, logu nebo čtení konfigurace.

Pro práci s daty, u kterých je riziko souběhu při R/W, je dobrá databáze SQLite. Sami autoři uvádí, že jejich cílem byla náhrada funkcí fopen, flock, fread a fwrite. Netuším, proč se tomu bráníš - na diskuzní fórum je to perfektní, rychlé, šetří to místem a má to vyřešeny všechny problémy, se kterými se potýkáš.

Těm grafům nerozumím a zřejmě nejsem jediný.

427
@Exkalibr: Pokud k tomu grafu nemáš žádné vyhodnocení, tak proč si nám ho sem dal? K čemu nám je užitečný?

Proč by měl řešit, zda je nám ten graf k užitku? Zhodnotit si ho může každý, stejně jako ho každý může ignorovat dle své volby.

428
V praxi přece nikdo nechce jen načíst data. Musíš to udělat tak, že načteš data, pak provedeš operace a pak je uložíš. Což znamená znovu zkontrolovat velikost souboru, porovnat jestli velikost sedí nebo případně načíst celý soubor v modu r+, porovnat data, dát rewind a zapsat. Jen tak si člověk může ověřit že mezi zpracováváním dat nedošlo ke změně.

Naopak. Data chci buď jen načítat (konfigurace, šablony, data z cizích webů) anebo je chci zapisovat (výstup, logy, PDF, GIF, ...) Nevzpomínám si, kdy jsem naposledy potřeboval obojí s jedním souborem, navíc s rizikem kolize.

429
Teď to čtu v manuálu, že append mode pro fopen je atomický.

"If handle was fopen()ed in append mode, fwrite()s are atomic (unless the size of string exceeds the filesystem's block size, on some platforms, and as long as the file is on a local filesystem). That is, there is no need to flock() a resource before calling fwrite(); all of the data will be written without interruption."

Obvykle je ten block size nastaven na 8 KiB, takže na běžné logování je to vyhovující. Ovšem pokud napíšeš
Kód: [Vybrat]
fwrite($f, "Hello, ");
fwrite($f, "World");
tak musíš počítat s tím, že se ti mezi ta dvě slova může vecpat něco jiného. Na to je však snadný recept: Naskládáš si vše do jednoho stringu a ten atomicky zapíšeš jedním vrzem. Je to i rychlejší.

430
Aplikace prvního zámku:
Kód: [Vybrat]
    $start = AtomicityTestLockTimes($n,$n,1,7);
    if ( $start )
      {
      $success = @mkdir("$n.t1");
      if ( $success == false )
         echo "<b>Failed to lock;</b><br>";
      $result = copy($original_fname, $cname);
      if ( $result == false )
        echo "<h4>BACKUP failed.</h4>";
      $result = @rmdir("$n.t1");
      if ( $result == false )
        echo "<h4>Directory lock was not removed</h4>";
      }

A druhý zámek jsem neaplikoval, jak jsem už napsal.

Zkusil jsem tuto část kódu přepsat podle sebe, tak jen pro inspiraci:

if (AtomicityTestLockTimes($n,$n,1,7) === false) {
    throw new Exception("Selhalo");
}
if (@mkdir("$n.t1") === false) {
    throw new Exception("Failed to lock;");
}
if (copy($original_fname, $cname) === false) {
    throw new Exception("BACKUP failed.");
}
if (@rmdir("$n.t1") === false) {
    throw new Exception("Directory lock was not removed");
}

431
přidávání dat do souboru pomocí fopen(filename, "a") je taky neatomicitní?

Zkus raději podle manuálu
Kód: [Vybrat]
file_put_contents($filename, $data, FILE_APPEND | LOCK_EX);

To mohu použít jen v případě, že ve scriptu nejedou dva procesy paralelně, já myslel právě pro to použití dvou skriptů. Dám příklad:

Co chci zapsat do logu:
"Byl jsem tady Skript 2 čas 1:00:11.000"
"Byl jsem tady Skript 1 čas 1:00:11.002"
"Byl jsem tady Skript 3 čas 1:00:11.001"

Jestli je zapíše za sebou - jedno v jakém pořadí,
nebo se může stát, že vznikne kolize

např

Kód: [Vybrat]
Byl jsem tady Skript 2 čas 1:00:11.00
Byl jsem tady Skript 1 čas 21:00:11.002
Byl jsem tady Skript 3 čas 1:00:11.001

(Ubral nulu na konci prvního řádku)

To jsem zkusil už kdysi dávno a fungovalo to spolehlivě, k promíchání dat z osmi procesů nedošlo ani jednou.

432
přidávání dat do souboru pomocí fopen(filename, "a") je taky neatomicitní?

Zkus raději podle manuálu
Kód: [Vybrat]
file_put_contents($filename, $data, FILE_APPEND | LOCK_EX);

433
Na endoru jsem se kdysi díval a byla omezená trafikem. Pokud se nepletu. Už jsem se před časem díval ale to bylo mnoho lez zpátky a narážel jsem na samé limity. Například limit odeslaných požadavků na server databáze.

Tak si najdi nějaké žebříčky freehostingů a vyber si takový, který ti bude vyhovovat.

Narazil jsem na tohle: https://infinityfree.net/

434
Sqlite nemá administrátorské prostředí ne? Nebo se to změnilo od těch dob co existovalo Moxo?

Doporučíš mi nějaký hosting?

SQLite se dá dobře spravovat skriptem Adminer.

Zkus endora.cz

435
Na začátku téhle diskuse jsem pracoval s odlišným souborem, zdroj a cíl byly odlišné soubory. Četl jsem z jednoho a zapisoval do druhého. Teď jsem ten algoritmus změnil, takže čtu z toho, do kterého jsem zapisoval. Což mimochodem znamená, že jsem musel implementovat dva adresářové locky, jeden na zazálohování souboru a druhý na jeho obnovu když dojde k selhání.

Vyzkoušej SQLite, který tohle všechno dělá za tebe.

Stran: 1 ... 27 28 [29] 30 31 ... 47