|
Èòàê,
íà÷íåì ñ òîãî, ÷òî æå òàêîå èñêëþ÷èòåëüíàÿ áëîêèðîâêà ôàéëà è äëÿ
÷åãî îíà íåîáõîäèìà. Íå ñåêðåò, ÷òî ìíîæåñòâî ñàéòîâ õðàíÿò ñâîþ
èíôîðìàöèþ íå â áàçàõ äàííûõ, à â ïðîñòûõ òåñòîâûõ ôàéëàõ. Çäåñü ìû
íå áóäåì ñïîðèòü, ÷òî ëó÷øå è õóæå, ìû ïðîñòî ïîãîâîðèì î ñïåöèôèêå
ðàáîòû ñ äàííûìè, õðàíÿùèìèñÿ â ôàéëàõ. Ýòè äàííûå ìîãóò èìåòü
ðàçëè÷íûå ôîðìàòû, ðàçëè÷íûå ñòðóêòóðû, íî òàê èëè èíà÷å ìàíèïóëÿöèþ
ýòèìè äàííûìè ìû äîëæíû âçÿòü íà ñåáÿ. Íóæíî ÷åòêî ïîíèìàòü, ÷òî ýòî
áûâàåò èíîãäà ñëîæíåé, ÷åì êàæåòñÿ íà ïåðâûé âçãëÿä. Äåéñòâèòåëüíî,
êîãäà Âû òåñòèðóåòå ñâîè ñêðèïòû, âñå êàæåòñÿ èäåàëüíûì: èíôîðìàöèÿ
äîáàâëÿåòñÿ, èíôîðìàöèÿ óäàëÿåòñÿ... Íî ñòîèò òîëüêî íà÷àòü ðàáîòó â
ñåòè è ñèòóàöèÿ ìîæåò êàðäèíàëüíî èçìåíèòüñÿ. Â ñèòóàöèè, êîãäà ñî
ñêðèïòîì ðàáîòàåò îäíîâðåìåííî áîëüøîå êîëè÷åñòâî ëþäåé î÷åíü âàæíî
íå ïîòåðÿòü êîíòðîëü íàä îïåðàöèÿìè ðàáîòû ñ ôàéëîì. Âîçìîæíû
ñèòóàöèè, êîãäà äâîå èëè áîëåå ëþäåé îäíîâðåìåííî çàïðîñÿò îïåðàöèè
çàïèñè â ôàéë è ïðîèçîéäåò ñåðüåçíûé ñáîé, êîòîðûé ïîâëå÷åò ïîòåðþ
èíôîðìàöèè. Ìîäåëü èñêëþ÷èòåëüíîé áëîêèðîâêè ïðåäîòâðàùàåò ïîäîáíûå
ñèòóàöèè, "ðàçðóëèâàÿ" ïðîöåññû , ðàáîòàþùèå ñ ôàéëîì è íå äàâàÿ èì
îäíîâðåìåííî âûïîëíÿòü îïàñíûå îïåðàöèè.
Îáû÷íî
ðàáîòà ñ ôàéëîì (íåáåçîïàñíàÿ ìîäåëü áåç áëîêèðîâêè ôàéëà)
ïðåäñòàâëÿåò ñîáîé ïîñëåäîâàòåëüíîñòü äåéñòâèé â âèäå: îòêðûòèå
ôàéëà (ïîëó÷åíèå åãî äåñêðèïòîðà), ðàáîòà ñ ñîäåðæèìûì, çàêðûòèå
ôàéëà. È â ñàìîì ðàñïðîñòðàíåííîì âàðèàíòå âûãëÿäèò òàê:
<? $fp = fopen ("path_to_file","a");//ÎÒÊÐÛÒÈÅ
fputs($fp ,"$data\r\n");//ÐÀÁÎÒÀ Ñ ÔÀÉËÎÌ
fclose ($fp);//ÇÀÊÐÛÒÈÅ
?>
Çäåñü
ìû îòêðûëè ôàéë â ðåæèìå äîáàâëåíèÿ èíôîðìàöèè â êîíåö ôàéëà,
çàïèñàëè â íåãî ïîðöèþ èíôîðìàöèè $data è çàòåì çàêðûëè åãî
(Ïðåäïîëàãàåòñÿ, ÷òî ó íàñ åñòü ïðàâà íà çàïèñü â ôàéë). Ýòî ñàìîå
ïðîñòîå è ñàìîå ïåðâîå, ÷òî íàì ìîãëî ïðèéòè â ãîëîâó è ÷òî ìû
ðåàëèçîâàëè. Åñëè âû óâåðåíû, ÷òî íèêàêèõ ïðîáëåì ñ ôàéëîì íå
âîçíèêíåò èëè ÷òî ó âàñ íå òàê ìíîãî ïîñåòèòåëåé, ÷òîáû ÷òî-òî
ñëîìàëîñü, òî ýòî âàøå ïðàâî - ìîæåòå çàêðûòü ñòàòüþ è æèòü
ñïîêîéíî! ;) Íî íóæíî ÷òî-òî äåëàòü. Îäíèì èç ïðèìåðîâ òðàãåäèé
ìîæåò ñëóæèòü ñàéò https://manlix.ru, â êîòîðîì ïîñòîÿííî "ïàäàåò"
ôîðóì è/èëè ñ÷åò÷èê ïîñåòèòåëåé. ß, êîíå÷íî, íå áåðóñü ñóäèòü, ÷òî
òîëüêî íåêîððåêòíàÿ ðàáîòà ñ ôàéëàìè òîìó âèíîé, íî, ïî-ìîåìó, ýòî
î÷åâèäíî. Ïîêà ÷èñëî ïîñåòèòåëåé áûëî ñðàâíèòåëüíî íåáîëüøèì, âñå
êîððåêòíî ôóíêöèîíèðîâàëî, êàê òîëüêî èíîãäà îäíîâðåìåííî ñòàëî
ïîÿâëÿòüñÿ äî 10 ïîëüçîâàòåëåé îäíîâðåìåííî, íà÷àëèñü êàçóñû ñ
ñ÷åò÷èêîì è ôîðóìîì. Êàê æå ýòî ïðåîäîëåòü? Îêàçûâàåòñÿ ïðîñòî,
âñåãî ëèøü äîáàâèâ íåñêîëüêî ñòðîê â îïåðàöèþ ðàáîòû ñ ôàéëàìè:
<? $fp = fopen ("path_to_file","a");//îòêðûòèå
flock ($fp,LOCK_EX);//ÁËÎÊÈÐÎÂÊÀ ÔÀÉËÀ
fputs($fp ,"$data\r\n");//ðàáîòà ñ ôàéëîì
fflush ($fp);//Î×ÈÙÅÍÈÅ ÔÀÉËÎÂÎÃÎ
ÁÓÔÅÐÀ È ÇÀÏÈÑÜ Â ÔÀÉË flock
($fp,LOCK_UN);//ÑÍßÒÈÅ ÁËÎÊÈÐÎÂÊÈ fclose ($fp);//çàêðûòèå ?>
Â
äàííîì ïðèìåðå ìû îòêðûëè ôàéë äëÿ äîáàâëåíèÿ â íåãî èíôîðìàöèè
Ïðåäïîëàãàåòñÿ, ÷òî ó íàñ åñòü ïðàâà íà çàïèñü â ôàéë). Çàòåì
ïðèìåíèëè èñêëþ÷èòåëüíóþ áëîêèðîâêó è òåì ñàìûì ñäåëàëè íàø ñêðèïò
åäèíñòâåííûì ïðîöåññîì, êîòîðûé â òåêóùèé ìîìåíò èìååò äîñòóï ê
ôàéëó. Áëîêèðîâêà äåéñòâèòåëüíà âñå âðåìÿ îò âûïîëíåíèÿ ôóíêöèè
flock ($fp,LOCK_EX) è äî âûïîëíåíèÿ flock ($fp,LOCK_UN). Ìåæäó ýòèìè
ôóíêöèÿìè íàõîäÿòñÿ îïåðàòîðû, âûïîëíåíèå êîòîðûõ áóäåò "áåçîïàñíûì"
äëÿ ôàéëà. Äðóãèå ïðîöåññû ñìîãóò ïîëó÷èòü äîñòóï ê ôàéëó íå ðàíüøå
ñíÿòèÿ áëîêèðîâêè. Âàæíûì ìîìåíòîì ÿâëÿåòñÿ ïðèìåíåíèå ôóíêöèè
fflush ($fp). Òðàíçàêöèè èçìåíåíèÿ äàííûõ ìîãóò áûòü çàïèñàíû ñ
ñïåöèàëüíûé ôàéëîâûé áóôåð è ñáðîøåíû íà äèñê ïîçæå, êîãäà
áëîêèðîâêà áóäåò óæå ñíÿòà è ñíîâà áóäåò îïàñíîñòü ñáîÿ â ðàáîòå.
Ïîýòîìó äàííîé ôóíêöèåé ìû ïðèíóäèòåëüíî çàïèñûâàåì èçìåíåíèÿ íà
äèñê, ñáðàñûâàÿ ñîäåðæèìîå áóôåðà. Åùå îäíèì íå ìåíåå âàæíûì
ìîìåíòîì ÿâëÿåòñÿ, ñàìî îòêðûòèå ôàéëà! Ìû íå ñëó÷àéíî èñïîëüçóåì
ðåæèì "a" ("a+"). Åñëè íàì áóäåò íåîáõîäèìà çàïèñü â íà÷àëî ôàéëà ñ
óäàëåíèåì ïðåäûäóùåãî ñîäåðæèìîãî, òî ñëåäóåò âîçäåðæàòüñÿ îò
ïðèìåíåíèÿ ðåæèìà "w" ("w+"), ïîñêîëüêó î÷èùåíèå ôàéëà ïðåäïîëàãàåò
óäàëåíèå íå òîëüêî ñîäåðæèìîãî, íî è ñàìîãî ôàéëà ñ ïîñëåäóþùèì
ñîçäàíèåì àíàëîãè÷íîãî. Òàê êàê ýòîò ïðîöåññ áóäåò âûïîëíåí äî
èñêëþ÷èòåëüíîé áëîêèðîâêè, òî òàêæå ñóùåñòâóåò âåðîÿòíîñòü ñáîÿ â
ðàáîòå.  äàííîì ñëó÷àå ñòîèò ïðèìåíÿòü ñëåäóþùèé ïðèåì :
<? $fp = fopen ("path_to_file","a");//îòêðûòèå
flock ($fp,LOCK_EX);//áëîêèðîâêà ôàéëà
ftruncate ($fp,0);//ÓÄÀËßÅÌ ÑÎÄÅÐÆÈÌÎÅ
ÔÀÉËÀ fputs($fp ,"$data\r\n");//ðàáîòà ñ ôàéëîì
fflush ($fp);//î÷èùåíèå ôàéëîâîãî
áóôåðà è çàïèñüâ ôàéë flock
($fp,LOCK_UN);//ñíÿòèå áëîêèðîâêè fclose ($fp);//çàêðûòèå ?>
Çäåñü
ìû îòêðûëè ôàéë äëÿ çàïèñè â íåãî, çàòåì ïðèìåíèëè èñêëþ÷èòåëüíóþ
áëîêèðîâêó, è òîëüêî óæ ïîòîì ïðèìåíèëè ôóíêöèþ ftruncate ($fp,0)
êîòîðàÿ âûïîëíèëà òàê íåîáõîäèìóþ íàì î÷èñòêó ôàéëà îò ñîäåðæèìîãî.
Âîò âðîäå áû è âñå, ÷òî ÿ õîòåë âàì äëÿ íà÷àëà ðàññêàçàòü! Óñïåõîâ
Âàì â íàøåì íåëåãêîì òðóäå! Äî íîâûõ âñòðå÷, äî íîâûõ ñòàòåé!
|