|
|
|
| Скрипт обслуживает рекламу, а потому его вызывают в произвольный момент времени клиенты разных сайтов. При этом случается так, что к скрипту обращаются сразу несколько клиентов, что вызывает в системе какой-то сбой, который мне не удается отыскать.
Можно ли средствами РНР или иными сделать как-то так, чтобы скрипт, уже вызванный кем-то, как бы блокировал сам себя и был недоступен другим пользователям до того времени, пока полностью не выполнит свою работу? | |
|
|
|
|
|
|
|
для: Владимир55
(11.11.2010 в 11:01)
| | Зависит от того, каким образом читается файл. Можно попробовать flock() | |
|
|
|
|
|
|
|
для: mihdan
(11.11.2010 в 13:01)
| | flock() я использую при обращении к текстовому файлу, в котором хранится информация. Для того, чтобы исключить одновременное обращение к нему. Это помогает, но не решает проблему полностью. Похоже, что где-то ещё есть "дыра".
А сейчас я подумал вот о чем.
Скрипт находится в файле abc.php. Так вот: нельзя ли в самом этом файле установить какой-то код для того, чтобы если этот файл уже кем-то вызван и работает, то другой бы его вызвать не мог? | |
|
|
|
|
|
|
|
для: Владимир55
(11.11.2010 в 13:08)
| | проверьте флажок в начале кода, и установите, если его еще не было.
если был - завершите выполнение
выполняйте обработку
снимите флажок.
флажок может быть файлом,
может быть записью в БД. | |
|
|
|
|
|
|
|
для: Trianon
(11.11.2010 в 13:37)
| | И кто первый? )) | |
|
|
|
|
|
|
|
для: Ирбис
(11.11.2010 в 13:39)
| | что - кто первый? | |
|
|
|
|
|
|
|
для: Trianon
(11.11.2010 в 13:41)
| | Всё, понял кто первый.
Мы с вами практически одну и ту же рекомендацию дали. И у нас обоих время ответа одинаковое (до минут, как форум пишет), но ваше сообщение выше стоит, значит вы первый ответили Владимиру. | |
|
|
|
|
|
|
|
для: Ирбис
(11.11.2010 в 13:45)
| | а..
вообще-то у каждого поста нарастающий первичный ключ есть в таблице сообщений.
И по ходу пьесы он выводится в html-код. | |
|
|
|
|
|
|
|
для: Владимир55
(11.11.2010 в 13:08)
| | Можно. В начало скрипта допишите код, который будет в файл или в базу записывать 1 (это будет означать, что скрипт "занят"), а в конец скрипта код, который будет записывать в этот же файл/поле в таблице 0 (это означает, что скрипт свободен). И в самом начале скрипта (еще до записи 1-цы) проверяйте, какое значение храниться в файле/базе. Если 1 - значит выполнять скрипт дальше нельзя, если 0 - значит можно
<?php
//Функция, устанавливающая занятое состояние
function set_lock()
{
.....
}
//Функция, сбрасывающая занятое состояние
function flush_lock()
{
..
}
//Функция, проверяющая занят скрипт или нет
function is_lock()
{
.........
}
//Если занято - выходим из программы
if(is_lock())
{
exit();
}
//Код, который должен выполниться только при одном одновременном обращении к скрипту
{
set_lock();
.......
flush_lock();
}
?>
|
| |
|
|
|
|
|
|
|
для: Ирбис
(11.11.2010 в 13:37)
| | Спасибо, отличная идея!
Флаг в начале кода - очень удобно. В особенности, если флаг в базе -тогда точно не будет сбоев! | |
|
|
|