Додайте свій проект безкоштовно і почніть отримувати пропозиції від фрілансерів-виконавців вже через хвилини після публікації!

PHP запись в файл

закрито без виконання
PHP


Есть простейших код удаления последней строки в файле

<?php 


// load the data and delete the line from the array 

$lines = file('filename.txt'); 

$last = sizeof($lines) - 1 ; 

unset($lines[$last]); 


// write the new data to the file 

$fp = fopen('filename.txt', 'w'); 

fwrite($fp, implode('', $lines)); 

fclose($fp); 


?>


Нужно доработать его так, чтобы в момент изменения файла, не могла произойти коллизий из-за  запуска копии скрипта, т.е. перед записью нужно добавить блокировку файла. Либо я ошибаюсь и этото код вполне будет работать правильно без блокировку и коллизия произойти не сможет.

Пример взят здесь qaru.site/questions/798915/how-can-i-remove-the-last-line-of-a-file-using-php




  1. 1 день3 000 ₽
    Narek Vardanyan
     297 

    Привет,
    Я из Армении, и у меня 3-летний опыт работы в области веб-разработки, если хотите, я могу работать на вас.
    Я посылаю это, чтобы попросить ваше одобрение, которое поможет мне создать мой профиль на freelancehunt.com и выиграть больше работы.
    Нарек Варданян

    Вірменія Erebuni | 2 січня о 18:49 |
  2. ставка прихована фрілансером
  3. 2 дні1 500 ₴
    Макс К.
     1083  перевірений   8  3   2

    Добрый день
    Понял ваше задание, поставлю блокироуку на время оиработки скрипта и автомат будет снимать после, для работы с файлом.

    Україна Київ | 2 січня о 18:50 |
  4. 1 день100 ₴
    Andrej Haas
     741   39  1

    Можете взять и использовать другую фцию на сохранение и чтение

    Україна Київ | 2 січня о 18:51 |
  5. 1 день200 ₴
    Игорь Евтушенко
     4259   129  0   1

    Здравствуйте. Готов сделать лучше этого.

    Україна Мелітополь | 2 січня о 18:53 |
  6. ставка прихована фрілансером
  7. 1 день200 ₴
    Юрий Кайдан
     2570  перевірений   138  0

    Здравствуйте.

    Возьмусь прямо сейчас. Сделаю все быстро и качественно.

    Україна Львів | 2 січня о 19:05 |
  8. ставка прихована фрілансером
  9. 1 день1 000 ₴
    Артем Н.
     2218  перевірений   43  0   2

    Добрый вечер!
    Для Вашей задачи есть решения поизящнее, суть предельно ясна, готов выполнить.
    Читайте отзывы, обращайтесь :)

    Україна Миколаїв | 2 січня о 20:02 |
  10. 1 день100 ₴
    Николай Кодер
     289   9  0

    $fp = fopen ( "filename.txt","w" );
    flock ( $fp,LOCK_EX ); // БЛОКИРОВКА ФАЙЛА
    ... //работа с файлом
    flock ( $fp,LOCK_UN ); // СНЯТИЕ БЛОКИРОВКИ
    fclose ( $fp );

    if ( !is_writable ( "filename.txt" ) ) {
    echo "файл filename.txt не доступен для записи";
    }

    источник http://www.php.su/flock()

    Україна Житомир | 3 січня о 08:52 |
  11.  726 
       8  1

    1 день600 ₴

    готов выполнить сегодня. свяжитесь удобным способом

    Есть положительные отзывы на других биржах.
    Опыт программирования и администрирования GNU/Linux 16+ лет. Надёжно, качественно, реально.
    Telegram: @linuxsys
    Email: [email protected]
    Jabber: [email protected]
    Skype: [email protected]
    Tox: [email protected]

    Есть положительные отзывы на других биржах. Опыт программирования и администрирования GNU/Linux 16+ лет. Надёжно, качественно, реально. Telegram: @linuxsys; Email/Jabber/Skype: [email protected]

    Україна Київ | 3 січня о 12:37 |
  12. 1 день100 ₴
    Олександр Шпак
     222   1  0

    Сделаю за час, большой опыт в РНР. Пишите, если заинтересует.

    Україна Ужгород | 3 січня о 12:55 |
  • Ваня Кутузов  (спілкування на форумах обмежено до 20 вересня)

    это устаревший метод

  • Dmitry Andrushchenko — замовник проекту

    Скрипт в который я вношу правку тоже устаревший, переписывать сейчас никто не будет, библиотека создана 6 лет назад.


    Я надеюсь так надежнее?


    $fp = fopen('2.csv', 'w'); 

    flock($fp, LOCK_EX + LOCK_NB)

    fwrite($fp, implode('', $lines)); 

    flock($fp,  LOCK_UN);



    Чем без блокировки вообще?

  • В момент работы с файлом другой скрипт не сможет с ним что-либо сделать до завершения процесса чтения/записи предыдущим потоком.

  • Для защиты файла с которым работает текущий процесс от изменений со стороны любого другого процесса в операционных системах применяются так называемые блокировки (locks). Для этого в PHP используется функция flock(). Пока на файле стоит блокировка все остальные делающие записать что-либо в этот файл стоят в очереди и дожидаются снятия блокировки. Подробнее почитать можно вот здесь - https://metanit.com/web/php/5.3.php, но в принципе можно найти и другие инструкции с примерами. Так что вам просто надо пару строчек в код добавить и всё.

  • Я один юзаю file_get_contents и file_put_contents?

  • Dmitry Andrushchenko — замовник проекту

    Я один юзаю file_get_contents и file_put_contents?

    Это позволит лишь добавить последнюю строку, но не удалить..

    А нужно подобие стека, последнюю положил строку, последнюю и взял.

  • file_get_contents

    explode("\n")

    ....

    implode("\n")

    file_put_contents