$x_amount_of_lines = 30;
$log = 'path/to/log.txt';
if (filesize($log) >= $max_size)) {
$file = file($log);
$line = $file[0];
$file = array_splice($file, 2, $x_amount_of_lines);
$file = array_splice($file, 0, 0, array($line, "\n")); // put the first line back in
...
}
изменить: с исправлением от rcar и сохранением первой строки.
Если это таблица InnoDB, см. http: // dev. mysql.com/doc/refman/5.1/en/innodb-consistent-read.html - он использует согласованное чтение (режим без блокировки) для SELECT, которые не указывают FOR UPDATE или LOCK IN SHARE MODE, если установлен параметр innodb_locks_unsafe_for_binlog, а уровень изоляции транзакции не установлен на SERIALIZABLE. Таким образом, для строк, считываемых из выбранной таблицы, не устанавливаются никакие блокировки ».
Используйте
SET TRANSACTION ISOLATION LEVEL READ UNCOMITTED.
Документы версии 5.0 здесь .
Документы версии 5.1 находятся здесь .
Нашла статью под названием «MYSQL WITH NOLOCK»
https://web.archive.org/web/20100814144042/http://sqldba.org/articles/22-mysql- with-nolock.aspx
в MS SQL Server вы должны сделать следующее:
SELECT * FROM TABLE_NAME WITH (nolock)
и эквивалент MYSQL
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
SELECT * FROM TABLE_NAME ;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ ;
EDIT
Майкл Майор предложил следующее (из комментариев)
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
SELECT * FROM TABLE_NAME ;
COMMIT ;
Вы можете прочитать эту страницу руководства MySQL. Блокировка таблицы зависит от ее типа.
MyISAM использует блокировки таблиц для достижения очень высокой скорости чтения, но если у вас есть ожидающий запрос UPDATE, то будущие SELECTS будут стоять в очереди после UPDATE.
В таблицах InnoDB используется блокировка на уровне строк, и у вас не будет блокировки всей таблицы за UPDATE. Есть и другие проблемы с блокировкой, связанные с InnoDB, но вы можете обнаружить, что это соответствует вашим потребностям.
В зависимости от типа вашей таблицы блокировка будет выполняться по-разному, но также и счетчик SELECT. Для таблиц MyISAM простая таблица SELECT count (*) FROM не должна блокировать таблицу, поскольку она обращается к метаданным для получения счетчика записей. Innodb займет больше времени, так как он должен захватить таблицу в моментальном снимке для подсчета записей, но это не должно вызывать блокировки.
Вы должны, по крайней мере, установить для concurrent_insert значение 1 (по умолчанию). Затем, если в файле данных для заполнения таблицы нет «пробелов», вставки будут добавлены к файлу, и операции SELECT и INSERT могут выполняться одновременно с таблицами MyISAM. Обратите внимание, что удаление записи создает «пробел» в файле данных, который будет пытаться заполнить будущими вставками и обновлениями.
Если вы редко удаляете записи, то вы можете установить concurrent_insert равным 2, и вставки всегда будут добавляться в конец файла данных. Тогда выбор и вставка могут происходить одновременно, но ваш файл данных никогда не станет меньше, независимо от того, сколько записей вы удаляете (кроме всех записей).
В итоге, если у вас много обновлений, вставки и выборки на table, вы должны сделать его InnoDB. Однако вы можете свободно смешивать типы таблиц в системе.
Из эта ссылка:
Если вы явно устанавливаете блокировку таблицы с LOCK TABLES вы можете запросить ЧИТАТЬ ЛОКАЛЬНУЮ блокировку, а не ЧИТАТЬ заблокировать, чтобы разрешить другим сеансам выполнять одновременные вставки, пока вы заблокируйте таблицу.
SELECT обычно не выполняет никаких блокировок, о которых вы заботитесь, в таблицах InnoDB. Уровень изоляции транзакции по умолчанию означает, что выбор не блокирует данные.
Конечно, конфликты все еще происходят.