- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Все что нужно знать о DDоS-атаках грамотному менеджеру
И как реагировать на "пожар", когда неизвестно, где хранятся "огнетушители
Антон Никонов
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Создаем 2 файла php с одинаковым кодом:
Параллельно запускаем оба скрипта через браузер, суть в имитации многопоточной записи/чтения.
В итоге видим, что в файле не 2000-чи записей как хотелось бы, а рандом, обычно больше.
Естественно понимаем, что один поток вклинился в другой пока тот не отработал и во время его записи то ли считал часть того, что он уже записал то ли еще что-то. Иногда бывает конец даннных отрезан.
Где ошибка и в каком участке происходит сбой?
.
Параллельно запускаем оба скрипта через браузер, суть в имитации многопоточной записи/чтения.
Вот в этом участке ошибка. :)
Обычно такие процессы распараллеливают, чтобы они друг другу не мешали.
Ink-developer, попробуйте проверять возвращаемое функцией flock значение.
И еще flock может не всегда работать, посмотрите здесь например.
Вот в этом участке ошибка. :)
Обычно такие процессы распараллеливают, чтобы они друг другу не мешали.
Если это шутка, то прощаю, если вы серьезно, то молчу 😂
Что значит, распараллеливают? как я могу распараллелить вызов скрипта двумя посетителями одновременно? То что я сделал 1000 циклов, этим я лишь увеличил вероятность запуска в один и тот-же момент (тоесть имитировал посещаемый сайт), любой другой скрипт не меняет ситуацию просто вероятность сбоя в разы меньше но она всегда есть. Короче ответ не в тему.
Ink-developer, попробуйте проверять возвращаемое функцией flock значение.
И еще flock может не всегда работать, посмотрите здесь например.
flock проверил файл блокируется, я только убедился что она блокирует файл и все.
.
Что значит, распараллеливают? как я могу распараллелить вызов скрипта двумя посетителями одновременно? То что я сделал 1000 циклов, этим я лишь увеличил вероятность запуска в один и тот-же момент (тоесть имитировал посещаемый сайт), любой другой скрипт не меняет ситуацию просто вероятность сбоя в разы меньше но она всегда есть.
Постараюсь объяснить:
Вы попытались сымитировать нагрузку большим файлом, который читается\пишется как минимум в 2 потока одновременно. Скрипты, к которым идёт обращение на сайте (тот же PHP) рассчитаны на быстрое выполнение - "исполнился и забыл", но никак не на параллельную, безошибочную, многопоточную запись в файл.
Короче, ладно, тут долго рассуждать можно...
Проверьте сначала статус файла на ваш LOCK_EX. Если заблокирован другим скриптом - не пишите. Попробуйте повторное обращение через интервал.
ну а мануал-то на что писан?
http://ru2.php.net/flock
Returns TRUE on success or FALSE on failure.
Проверять надо (как в примере из мануала)- удачно Вы файл залочили или нет.
Если локнули неудачно, то надо снова пробовать залочить, а не ломиться сразу в него читать/писать.
Скрипты, к которым идёт обращение на сайте (тот же PHP) рассчитаны на быстрое выполнение - "исполнился и забыл", но никак не на параллельную, безошибочную, многопоточную запись в файл.
Вы недопонимаете ситуацию, сейчас поясню:
Забываем про то, что писали выше и моделируем ситуацию по вашим правилам "быстрое выполнение - исполнился и забыл"
вот код
Простейший быстрый скрипт, открыл записал закрыл, и что проблемы по вашему уже нет? Ни чего не изменилось, т.к. опять же заходят 2 пользователя в 1 единицу времени и косяк на лицо, а для того чтобы они вошли одновременно достаточно лишь высокой посещалки ресурса.
Если локнули неудачно, то надо снова пробовать залочить
Первый стоящий ответ, ушел проверять.
Простейший быстрый скрипт, открыл записал закрыл, и что проблемы по вашему уже нет? Ни чего не изменилось, т.к. опять же заходят 2 пользователя в 1 единицу времени и косяк на лицо, а для того чтобы они вошли одновременно достаточно лишь высокой посещалки ресурса.
Вам выше я и edogs указали где у вас ошибка в логике скрипта.
Если не сложно, попытайтесь мне объяснить - что общего между высокой посещаемостью и чтением\записью довольно большого файла?
Ничего.
Вам выше я и edogs указали где у вас ошибка в логике скрипта.
Мне долго не потребовалось времени чтобы выяснить что его версия тут не подходит, все проверил при каждой операции файл блокируется удачно.
Если не сложно, попытайтесь мне объяснить - что общего между высокой посещаемостью и чтением\записью довольно большого файла?
В предыдущем скрипте не имеется ввиду что файл большой, там может быть хоть 2 строки по 10 символов, сбой все равно произойдет при совпадении времени обращения, посещаемость лишь увеличивает шансы, что скрипт будет вызван одновременно больше я этим ни чего не хотел сказать.
думаю ошибка расположена между:
может функция fread глючит? не полностью считывает файл.
PHP. Defective by design.
Не ваш ли это случай?