Ðàáîòà ñ ôàéëàìè: php-áëîêèðîâêà

Çàï÷àñòè äëÿ ñïåöòåõíèêè ñî ñêëàäà îò êîìïàíèè Ñèáìàøèíåðè íà sibmashineri.ru.

PHP - Ãðàìîòíàÿ ðàáîòà ñ ôàéëàìè: Èñêëþ÷èòåëüíàÿ áëîêèðîâêà ôàéëîâ

   Èòàê, íà÷íåì ñ òîãî, ÷òî æå òàêîå èñêëþ÷èòåëüíàÿ áëîêèðîâêà ôàéëà è äëÿ ÷åãî îíà íåîáõîäèìà. Íå ñåêðåò, ÷òî ìíîæåñòâî ñàéòîâ õðàíÿò ñâîþ èíôîðìàöèþ íå â áàçàõ äàííûõ, à â ïðîñòûõ òåñòîâûõ ôàéëàõ. Çäåñü ìû íå áóäåì ñïîðèòü, ÷òî ëó÷øå è õóæå, ìû ïðîñòî ïîãîâîðèì î ñïåöèôèêå ðàáîòû ñ äàííûìè, õðàíÿùèìèñÿ â ôàéëàõ. Ýòè äàííûå ìîãóò èìåòü ðàçëè÷íûå ôîðìàòû, ðàçëè÷íûå ñòðóêòóðû, íî òàê èëè èíà÷å ìàíèïóëÿöèþ ýòèìè äàííûìè ìû äîëæíû âçÿòü íà ñåáÿ. Íóæíî ÷åòêî ïîíèìàòü, ÷òî ýòî áûâàåò èíîãäà ñëîæíåé, ÷åì êàæåòñÿ íà ïåðâûé âçãëÿä. Äåéñòâèòåëüíî, êîãäà Âû òåñòèðóåòå ñâîè ñêðèïòû, âñå êàæåòñÿ èäåàëüíûì: èíôîðìàöèÿ äîáàâëÿåòñÿ, èíôîðìàöèÿ óäàëÿåòñÿ... Íî ñòîèò òîëüêî íà÷àòü ðàáîòó â ñåòè è ñèòóàöèÿ ìîæåò êàðäèíàëüíî èçìåíèòüñÿ.  ñèòóàöèè, êîãäà ñî ñêðèïòîì ðàáîòàåò îäíîâðåìåííî áîëüøîå êîëè÷åñòâî ëþäåé î÷åíü âàæíî íå ïîòåðÿòü êîíòðîëü íàä îïåðàöèÿìè ðàáîòû ñ ôàéëîì. Âîçìîæíû ñèòóàöèè, êîãäà äâîå èëè áîëåå ëþäåé îäíîâðåìåííî çàïðîñÿò îïåðàöèè çàïèñè â ôàéë è ïðîèçîéäåò ñåðüåçíûé ñáîé, êîòîðûé ïîâëå÷åò ïîòåðþ èíôîðìàöèè. Ìîäåëü èñêëþ÷èòåëüíîé áëîêèðîâêè ïðåäîòâðàùàåò ïîäîáíûå ñèòóàöèè, "ðàçðóëèâàÿ" ïðîöåññû , ðàáîòàþùèå ñ ôàéëîì è íå äàâàÿ èì îäíîâðåìåííî âûïîëíÿòü îïàñíûå îïåðàöèè.

   Îáû÷íî ðàáîòà ñ ôàéëîì (íåáåçîïàñíàÿ ìîäåëü áåç áëîêèðîâêè ôàéëà) ïðåäñòàâëÿåò ñîáîé ïîñëåäîâàòåëüíîñòü äåéñòâèé â âèäå: îòêðûòèå ôàéëà (ïîëó÷åíèå åãî äåñêðèïòîðà), ðàáîòà ñ ñîäåðæèìûì, çàêðûòèå ôàéëà. È â ñàìîì ðàñïðîñòðàíåííîì âàðèàíòå âûãëÿäèò òàê:

<?
$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) êîòîðàÿ âûïîëíèëà òàê íåîáõîäèìóþ íàì î÷èñòêó ôàéëà îò ñîäåðæèìîãî. Âîò âðîäå áû è âñå, ÷òî ÿ õîòåë âàì äëÿ íà÷àëà ðàññêàçàòü! Óñïåõîâ Âàì â íàøåì íåëåãêîì òðóäå! Äî íîâûõ âñòðå÷, äî íîâûõ ñòàòåé!


Àâòîð Art1st




Ïðè ïåðåïå÷àòêå èíôîðìàöèè äåëàéòå, ïîæàëóéñòà, ññûëêó íà íàø ñàéò (ëèáî ïîäåëèòüñÿ âêîíòàêòå, ãóãë+ èëè äåëèòåñü â îäíîêëàññíèêàõ ñòàòü¸é). Ñïàñèáî!

Èñòî÷íèê: www.wr-script.ru©, 2004-2026ã.

Äåëèòåñü ñ äðóçüÿìè â ñîöñåòÿõ. Àêòèâíûå êîììåíòàòîðû ïîëó÷àþò ñâåæèå ñêðèïòû è áåñïëàòíûå äîðàáîòêè îò WR-Script.ru!

Âåðíóòüñÿ ê ñòàòüÿì ïîìîùè WEB-ìàñòåðó
WR-Счётчик