Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Монопольный доступ к скрипту
 
 автор: Владимир55   (11.11.2010 в 11:01)   письмо автору
 
 

Скрипт обслуживает рекламу, а потому его вызывают в произвольный момент времени клиенты разных сайтов. При этом случается так, что к скрипту обращаются сразу несколько клиентов, что вызывает в системе какой-то сбой, который мне не удается отыскать.

Можно ли средствами РНР или иными сделать как-то так, чтобы скрипт, уже вызванный кем-то, как бы блокировал сам себя и был недоступен другим пользователям до того времени, пока полностью не выполнит свою работу?

  Ответить  
 
 автор: mihdan   (11.11.2010 в 13:01)   письмо автору
 
   для: Владимир55   (11.11.2010 в 11:01)
 

Зависит от того, каким образом читается файл. Можно попробовать flock()

  Ответить  
 
 автор: Владимир55   (11.11.2010 в 13:08)   письмо автору
 
   для: mihdan   (11.11.2010 в 13:01)
 

flock() я использую при обращении к текстовому файлу, в котором хранится информация. Для того, чтобы исключить одновременное обращение к нему. Это помогает, но не решает проблему полностью. Похоже, что где-то ещё есть "дыра".

А сейчас я подумал вот о чем.

Скрипт находится в файле abc.php. Так вот: нельзя ли в самом этом файле установить какой-то код для того, чтобы если этот файл уже кем-то вызван и работает, то другой бы его вызвать не мог?

  Ответить  
 
 автор: Trianon   (11.11.2010 в 13:37)   письмо автору
 
   для: Владимир55   (11.11.2010 в 13:08)
 

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

флажок может быть файлом,
может быть записью в БД.

  Ответить  
 
 автор: Ирбис   (11.11.2010 в 13:39)   письмо автору
 
   для: Trianon   (11.11.2010 в 13:37)
 

И кто первый? ))

  Ответить  
 
 автор: Trianon   (11.11.2010 в 13:41)   письмо автору
 
   для: Ирбис   (11.11.2010 в 13:39)
 

что - кто первый?

  Ответить  
 
 автор: Ирбис   (11.11.2010 в 13:45)   письмо автору
 
   для: Trianon   (11.11.2010 в 13:41)
 

Всё, понял кто первый.
Мы с вами практически одну и ту же рекомендацию дали. И у нас обоих время ответа одинаковое (до минут, как форум пишет), но ваше сообщение выше стоит, значит вы первый ответили Владимиру.

  Ответить  
 
 автор: Trianon   (11.11.2010 в 14:50)   письмо автору
 
   для: Ирбис   (11.11.2010 в 13:45)
 

а..
вообще-то у каждого поста нарастающий первичный ключ есть в таблице сообщений.
И по ходу пьесы он выводится в html-код.

  Ответить  
 
 автор: Ирбис   (11.11.2010 в 13:37)   письмо автору
 
   для: Владимир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();
}
?>

  Ответить  
 
 автор: Владимир55   (11.11.2010 в 14:58)   письмо автору
 
   для: Ирбис   (11.11.2010 в 13:37)
 

Спасибо, отличная идея!

Флаг в начале кода - очень удобно. В особенности, если флаг в базе -тогда точно не будет сбоев!

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования