Безопасная параллельная запись в файл, совместно используемый Perl и PHP-скриптом - PullRequest
2 голосов
/ 20 августа 2009

Perl-скрипт (которым я не управляю) периодически добавляет строки в конец текстового файла.

Мне нужен мой PHP-скрипт (который будет работать как задание cron), чтобы прочитать строки из этого файла, обработать их, а затем удалить их из файла. Но, похоже, что единственный способ удалить строку из файла с помощью PHP - это прочитать файл в переменную, удалить одну строку, обрезать файл и переписать файл.

Но что будет, если:

  1. PHP читает файл
  2. Скрипт Perl добавляет новую строку.
  3. PHP-скрипт записывает измененный буфер обратно в файл.

В этом случае новая строка будет потеряна, потому что она будет перезаписана, когда скрипт PHP завершит работу и обновит файл.

Есть ли способ заблокировать файл с помощью PHP таким образом, который Perl будет уважать? Похоже, что функция flock () специфична для PHP.

Ответы [ 4 ]

3 голосов
/ 20 августа 2009

Есть ли у вас свобода менять дизайн? Является ли удаление обработанных строк из файла важной частью вашей обработки?

Если у вас есть такая свобода, как насчет того, чтобы позволить файлу, производимому perl, расти. Предположительно, авторы сценария на Perl уже имеют в виду что-то вроде домашнего хозяйства? Ведение собственного «журнала» того, что вы обработали. Затем, когда ваш скрипт запускается, он читает файл perl до точки, записанной в вашем «журнале». Обработка записи, обновление журнала.

1 голос
/ 20 августа 2009

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

1 голос
/ 20 августа 2009

Если Perl-скрипт, которым вы не можете управлять, уже реализует блокировку файлов через flock, у вас все в порядке. Если этого не произойдет (и я боюсь, что мы должны это предположить), вам не повезло.

0 голосов
/ 20 августа 2009

Может быть, вместо того, чтобы работать с одним и тем же файлом, ваш PHP-скрипт может работать с копией? Я полагаю, что он может работать с тремя файлами:

  1. Файл, написанный сценарием Perl
  2. Копия файла 1
  3. Обработанная версия файла 2

Затем, когда ваш php-скрипт запускается, он проверяет, является ли файл 1 более новым, чем файл 2, и, если это так, создает новую копию, обрабатывает это (возможно, пропуская количество строк, уже обработанных ранее) и записывает это в файл 3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...