Ako fungujú zámky na súbory ? – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Ako fungujú zámky na súbory ? – PHP – Fórum – Programujte.comAko fungujú zámky na súbory ? – PHP – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
lukas.balaz0
Super člen
10. 9. 2014   #1
-
0
-

Hi,

potrebujem sa spýtať na niečo, čo mi nie je celkom jasné. Ako funguju locky na súboroch ? PHP manual som nepochopil.

Potrebujem urobiť, že ak je niekde otvorený súbor tak je zároveň zamknutý, a ak niekto chce otvoriť zamknutý súbor (teda že ho má otvorený niekto iný), tak to bude skúšať otvárať až dokedy sa neodomkne (okrem toho, je toto bežný postup ? teda čakanie na odomknutie ? je nutné aby sa zo súboru prečítali data a potom tam treba aj ničo zapísať, takže preskočiť to možné nebude .., a preto ma iný spôsob nenapadol, ale neviem ...).

Prosím mohli by ste mi ukázať celý kód ? aj s lockovaním, aj s kontrolovaním či je zamknutý ? Ďakujem za pomoc

Nahlásit jako SPAM
IP: 80.242.41.–
Reklama
Reklama
Kit+11
Guru
10. 9. 2014   #2
-
0
-

#1 lukas.balaz
Všechny varianty jsou možné a jsou popsané v manuálu. Osobně se zámkům vyhýbám velkým obloukem, protože nesprávně použité zámky nadělají víc škody než užitku. Zkus si raději promyslet, zda ke svému účelu skutečně potřebuješ pracovat s fyzickými soubory. Pokud nemusíš, tak to raději nedělej a použij nějakou nadstavbu, která různé kolize vyřeší za tebe.

Nahlásit jako SPAM
IP: 147.229.242.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
lukas.balaz0
Super člen
10. 9. 2014   #3
-
0
-

#2 Kit
môžeš mi niečo poradiť ? Zdá sa mi sprosté kvôli pár stringom používať databázu ... ale neviem. Jednoucho to potrebujem to niekde bezpečne uložiť (a ide o prevod peňazí pomocou paypalu, takže chcem aby to išlo vždy)

Nahlásit jako SPAM
IP: 80.242.41.–
Řešení
Kit+11
Guru
10. 9. 2014   #4
-
0
-
Vyřešeno Nejlepší odpověď

#3 lukas.balaz
Databázi používám i když potřebuji uložit 4 stringy. Je to rychlé, pohodlné a bezpečné. Nemusím řešit zámky. Pokud to potřebuješ uložit jen dočasně pro dané spojení, použij session.

Nahlásit jako SPAM
IP: 147.229.242.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
lukas.balaz0
Super člen
10. 9. 2014   #5
-
0
-

#4 Kit
Dobre ďakujem, nakoniec som sa rozhodol pre databázu. Aj keď som s tým nikdy nepracoval, aspoň som sa naučil niečo nové (a určite sa mi to ešte mnohokrát zíde).

Nahlásit jako SPAM
IP: 80.242.41.–
Kit+11
Guru
10. 9. 2014   #6
-
0
-

#5 lukas.balaz
Bez databáze se u většího projektu stejně neobejdeš.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:221:5...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
peter
~ Anonymní uživatel
2551 příspěvků
11. 9. 2014   #7
-
-1
-
Mimo téma
Kit -

Zkus si nasimulovat opacnou situaci. Mas chat s mnoha uzivateli online. Co se stane, kdyz tam locky nedas?
Zapis do souboru nejakou dobu trva. Php preda funkci zapis parametry a dal si dela svoje. Pokud dva uzivatele pres php provedou fwrite a ten druhy se trefi zrovna do okamziku, kdy ten jeden jeste neudelal fclose. Php mu to dovoli a cele se to znici, nuluje velikost souboru. Pro takovy pripad se vymysleli flock, ktery druhemu uzivateli blokuje pristup ke zmene obsahu, kdyz s nim pracuje jiny uzivatel. Pred db jsem pouzival tento kod

function writeFile($file_name,$data_to_save,$end_time,$type='w')
{
global $ERRORS;
$fp = fopen($file_name,$type);
if ($fp)
	{
	$start_time = microtime();
	do	{
		$can_write = flock($fp, LOCK_EX);
		if (!$can_write)
			{usleep(round(rand(0,100)*1000));}
		}
	while ((!$can_write) and ((microtime() - $start_time) < $end_time));
	if ($can_write)
		{fputs($fp,$data_to_save);}
	else	{$ERRORS[] = 'writeFile: file write error!'; return false;}
	@chmod($file_name,0755);		//!nastavit prava k zapisu souboru, 755 (rwx r.x r.x) nebo 644 (rw. r.. r..) (owner-vlastnik, group-skupina, other-ostatni, r-read, w-write, x-execute; umask, mkdir)
	fclose($fp); 
	}
else	{$ERRORS[] = 'writeFile: file open error!'; return false;}
return true;
}

U db muze nastat neco podobneho. Tam jsou zamky take. Ale u db se vykonavaji prikazy postupne a ne najednou, jak to umoznuje server/php. Samozrejme, kdy dva lide edituji jeden zaznam, tak se prepise udaji, ktere poslal posleni z nich. Ale nezkolabuje kvuli tomu soubor s databazi, jak se to stane u fwrite bez flocku.

Nahlásit jako SPAM
IP: 2001:718:2601:1f7:bcfb:c6...–
Kit+11
Guru
11. 9. 2014   #8
-
0
-

#7 peter
Tohle je hodně, hodně zastaralý způsob. Dnes je místo toho jedna standardní funkce file_put_contents().

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:221:5...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
lukas.balaz0
Super člen
12. 9. 2014   #9
-
0
-

#8 Kit
Ako som písal, nakoniec to riešim databázou, ale aj keby som to robil pomocou súborou, zabudol som spomenúť, že na zápis do súboru používam vždy file_put_contents(). Tak ma zaujíma, ako pomocou tohto urobiť, aby ak sa mu nepodarí otvoriť súbor kvôli locku, tak to bude skúšať až dokedy to nebude možné.

Nahlásit jako SPAM
IP: 80.242.41.–
Kit+11
Guru
13. 9. 2014   #10
-
0
-

#9 lukas.balaz
Implicitní chování file_put_contents() je takové, že čeká na uvolnění souboru, aby ho mohl zamknout pro sebe. Obvykle nečeká dlouho. Tato vlastnost se dá vypnout dalším parametrem.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:221:5...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
lukas.balaz0
Super člen
13. 9. 2014   #11
-
0
-

#10 Kit
Aha tak to mi naozaj nenapadlo že je to také múdre   . Ale dáva to zmysel ... ďakujem, budem si pamätať.

Nahlásit jako SPAM
IP: 80.242.41.–
Kit+11
Guru
13. 9. 2014   #12
-
0
-
Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:221:5...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 30 hostů

Podobná vlákna

Súbory — založil Samuel Lehotský

Hlavickove subory — založil Tom@sQo

*.dat subory — založil delphak

Typove subory — založil lukas

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý