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

Форум PHP

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

 

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

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

тема: Cron на проверку процесса
 
 автор: FaStY   (12.07.2009 в 18:01)   письмо автору
 
 

Мне нужно, что бы каждую секунду у меня происходило определенное действие. у меня есть файл, в котором просто бесконечный while, в котором происходят действия (беру из таблицы мускуля данные и перемещаю в другую таблицу), но может получиться так, что у меня этот процесс может остановиться. Как мне избежать остановления этого процесса? Мне ни в коем случае нельзя, что бы этот процесс остановился.
Крон на запуск этого файла - повторно будет запускать процесс, или о посмотрти, если процесс запущен, тогда не запускать, а если такого процесса нет, тогда крон его запустить.
Вообще, бесконечный цикл , в конце которого стоит usleep(500000); сильно будет грузить сервер? (в этом цикле беруться данные из базы и переносятся в другую базу)
Либо есть другие методы?
Заранее спасибо

  Ответить  
 
 автор: MIchail1982   (12.07.2009 в 18:12)   письмо автору
 
   для: FaStY   (12.07.2009 в 18:01)
 

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

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

  Ответить  
 
 автор: FaStY   (12.07.2009 в 18:20)   письмо автору
 
   для: MIchail1982   (12.07.2009 в 18:12)
 

дело в том, что кром на 1 секунду не поставишь. а мне нужно, что бы скрипт каждую секунду работал

  Ответить  
 
 автор: MIchail1982   (12.07.2009 в 18:23)   письмо автору
 
   для: FaStY   (12.07.2009 в 18:20)
 

ну циклом сделайте.. доведите кол-во повторов до времени, которое можно в крон поставить

  Ответить  
 
 автор: FaStY   (12.07.2009 в 18:41)   письмо автору
 
   для: MIchail1982   (12.07.2009 в 18:23)
 

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

  Ответить  
 
 автор: MIchail1982   (12.07.2009 в 18:51)   письмо автору
 
   для: FaStY   (12.07.2009 в 18:41)
 

а если так?
<?php
$timeToWork 
5;//minut
$Time time();
$endtime $Time + ($timeToWork*60);
while(
$Time $endtime){
    
//do something
    
$Time time();
}
?>

  Ответить  
 
 автор: FaStY   (12.07.2009 в 19:36)   письмо автору
 
   для: MIchail1982   (12.07.2009 в 18:51)
 

да, так мона, но вот как быть, если этот цикл будет не 5 минут, а он задержиться и будет выполняться 6 минут. а кроновский скрипт тоже примется за работу и будет путаница(

  Ответить  
 
 автор: MIchail1982   (12.07.2009 в 19:49)   письмо автору
 
   для: FaStY   (12.07.2009 в 19:36)
 

я же писал, что нужно флаги какие-то ставить.... вот пример
<?php
$dbcon 
mysql_connect('localhost','user','pass');
mysql_select_db('someDb');
if(
mysql_num_rows(mysql_query('select `working` from `sometable` where `working` =0 ;',$dbcon))==0){
    
//nobody working
    
mysql_query('update `sometable` set `working` = 1 ;',$dbcon);
    
$timeToWork 5;//minut
    
$Time time();
    
$endtime $Time + ($timeToWork*60);
    while(
$Time $endtime){
        
//do something
        
$Time time();
    }
    
mysql_query('update `sometable` set `working` = 0 ;',$dbcon);
}
@
mysql_close($dbcon);
?>

  Ответить  
 
 автор: Trianon   (12.07.2009 в 20:32)   письмо автору
 
   для: FaStY   (12.07.2009 в 18:01)
 

эта другая таблица на том же сервере?
Тогда почему не заполнять её параллельно с первой тем скриптом, что помещает строки в первую?

Если Вы пытаетесь на лету копировать данные на другой сервер - смотрите в сторону репликации (связка master - slave)

  Ответить  
 
 автор: FaStY   (12.07.2009 в 20:39)   письмо автору
 
   для: Trianon   (12.07.2009 в 20:32)
 

да, это одна и та же таблица. дело в том, что мне нужно помещать только в одну таблицу, временная таблица служит только для обеспечения очереди, т.е. так у меня не будет возникать вопросов с дублированием одинаковых данных.

  Ответить  
 
 автор: Trianon   (12.07.2009 в 20:45)   письмо автору
 
   для: FaStY   (12.07.2009 в 20:39)
 

>да, это одна и та же таблица.
Так одна или две?!

можно попробовать создать на таблице триггер, перекидывающий данные в другую таблицу.

  Ответить  
 
 автор: FaStY   (12.07.2009 в 21:01)   письмо автору
 
   для: Trianon   (12.07.2009 в 20:45)
 

у меня есть 2 таблицы. game и game_request.
Таблица game хранит в себе информацию о пользователе и игре, а так же статусе. Есть 3 статуса - игра добавлена, игра сыграна, игра не сыграна. Вот мне нужно добавить данные в таблицу, и изменить статус, если игра только что добавлена, либо сыграна, либо игра не сыграна.
И вот если например одновременно несколько пользователей добавят в таблицу, что игра была добавлена, то в таблице будет путаница, и статусы добавяться направильно, а game_request - она определяет порядок добавления в базу game, которая будет обрабатываться кроном.
Или может подскажите, как мне другим методом добавлять в таблицу game сразу, минуя game_request

  Ответить  
 
 автор: MIchail1982   (12.07.2009 в 21:25)   письмо автору
 
   для: FaStY   (12.07.2009 в 21:01)
 

что-что у вас в БД неправильно, если
>одновременно несколько пользователей добавят в таблицу, что игра была добавлена, то в таблице будет путаница, и статусы добавяться направильно
структуру покажите?

  Ответить  
 
 автор: Trianon   (12.07.2009 в 21:48)   письмо автору
 
   для: FaStY   (12.07.2009 в 21:01)
 

>у меня есть 2 таблицы. game и game_request.
>Таблица game хранит в себе информацию о пользователе и игре, а так же статусе. Есть 3 статуса - игра добавлена, игра сыграна, игра не сыграна. Вот мне нужно добавить данные в таблицу, и изменить статус, если игра только что добавлена, либо сыграна, либо игра не сыграна.
>И вот если например одновременно несколько пользователей добавят в таблицу, что игра была добавлена, то в таблице будет путаница, и статусы добавяться направильно, а game_request - она определяет порядок добавления в базу game, которая будет обрабатываться кроном.
>Или может подскажите, как мне другим методом добавлять в таблицу game сразу, минуя game_request

1. При одновременном добавлении строк в таблицу со стороны скиптов нескольких пользователей, каждый из них полчает свой собственный mysql_insert_id() . И путаницы обычно не происходит.

2. Очевидно, никакой cron Вам не нужен.
Нет в излагаемом ничего такого, зачем бы он понадобился...

>Таблица game хранит
>добавления в базу game
3. Вы путаете базы и таблицы. Причем уже после намека, что путать такие вещи, задавая вопрос и рассчитывая получить ответ - недопустимо.
Успехов.

  Ответить  
 
 автор: FaStY   (12.07.2009 в 22:34)   письмо автору
 
   для: Trianon   (12.07.2009 в 21:48)
 

так, давайте я все поподробнее распишу, извините что запутал.
Есть таблица games, в ней есть поля: id, user_id, game_id, game_status, game_winner. Game_status может быть 1- добавлена, 2 - сыграна 1 раз, 3 - сыграна более 1 раза
Задача:
нужно перед добавлением игры в таблицу games проверить, добавлена ли эта игра, если она добавлена, тогда проверить сыграна ли она более 1 раза. в общем проверить по всем статусам. И в зависимости от проверок добавить в базу со статусом (если эта игра не была добавлена, тогда просто добавить со статусом 1, если игра уже была добавлена, тогда той, что была добавлена поставить статус 2 (сыграна 1 раз), и той, что добавляем тоже поставить статус 2 (сыграна 1 раз), ну и т.д. по проверкам)
Проблема в чем. если несколько пользователей одновременно решат добавить текущую игру в таблицу games, тогда их статусы мы не правильно добавим их. Т.е. если мы добавляем игру, которая еще не была добавлена, то мы 2 раза добавим ее со статусом 1, а хотя нужно уже ставить статус 2, так как мы не 1-ый раз ее добавляем в базу.
теперь понятно?

  Ответить  
 
 автор: Valick   (12.07.2009 в 22:40)   письмо автору
 
   для: FaStY   (12.07.2009 в 22:34)
 

ни чего не понятно.
если Вам нужно исключить повторное добавление одинаковых данных, то INSERT IGNORE
алгоритмы решения задачи на ПХП и при помощи БД абсолютно разные и если вы пытаетесь использовать знания по РНР для решения задачи с помощью базы... получается полная ерунда.

  Ответить  
 
 автор: Trianon   (12.07.2009 в 22:47)   письмо автору
 
   для: FaStY   (12.07.2009 в 22:34)
 

Каково назначение полей id и game_id ?
В чем их отличие?
Вероятно, есть возможность обойтись оператором INSERT ... ON DUPLICATE KEY UPDATE

>добавить в базу со статусом (

добавить в таблицу !!!!

Да что же это за (beep beep beep)?!

На сервер добавляются базы
В базу добавляются таблицы (в процессе определения данных)
В таблицу добавляются столбцы (в процессе определения данных) и строки (в процессе манипулирования данными).

Уже установленный скрипт обычно не определяет данные, а только манипулирует ими.

  Ответить  
 
 автор: FaStY   (12.07.2009 в 23:53)   письмо автору
 
   для: Trianon   (12.07.2009 в 22:47)
 

id - это просто id записи, primary_key, unique - ничего в себе не несет. game_id - это id таблицы games (т.е. игры, которая добавляется в таблицу)
Insert on dublicate не получится, потому что мне нужно добавлять в таблицу и новые данные, а так же обновлять старые (в том случае, если новые данные после проверки, например совпадают со старыми данными)

  Ответить  
 
 автор: Trianon   (12.07.2009 в 23:59)   письмо автору
 
   для: FaStY   (12.07.2009 в 23:53)
 

>id - это просто id записи, primary_key, unique - ничего в себе не несет. game_id - это id таблицы games (т.е. игры, которая добавляется в таблицу)

если id ничего в себе не несет, то что мешает убрать его вообще, а game_id сделать первичным ключом (возможно даже с автоинкрементом) ?

Вообще-то первичный ключ применяется именно для идентификации объекта.
Ну или если неохота первичный ключ менять, то почему не поставить unique на поле game_id?

>Insert on dublicate не получится, потому что мне нужно добавлять в таблицу и новые данные, а так же обновлять старые (в том случае, если новые данные после проверки, например совпадают со старыми данными)

INSERT ... ON DUPLICATE KEY UPDATE применяется для реализации именно такой логики.
Не обнаружен ключ - добавляется новый. Обнаружен - в строку вносятся изменения.

Обнаружение ключа - это и есть та самая проверка.

  Ответить  
 
 автор: FaStY   (13.07.2009 в 00:10)   письмо автору
 
   для: Trianon   (12.07.2009 в 23:59)
 

game_id не может быть уникальным, так как многие user_id могут добавлять одинаковые game_id, т.е. может быть такое:

user_id | game_id
    1                 1
    2                 1
    1                 2
    3                 1

  Ответить  
 
 автор: Trianon   (13.07.2009 в 00:18)   письмо автору
 
   для: FaStY   (13.07.2009 в 00:10)
 

Какой смысл тогда вообще этот game_id несет? Кто его генерирует? И что мешает его убрать из таблицы вообще?

Тогда как у Вас всё таки идентифицируется игра?
Две игры являются одной и той же если... ?

  Ответить  
 
 автор: FaStY   (13.07.2009 в 00:57)   письмо автору
 
   для: Trianon   (13.07.2009 в 00:18)
 

все, я окончательно вас запутал. вопрос закрывается)

  Ответить  
 
 автор: Trianon   (13.07.2009 в 01:04)   письмо автору
 
   для: FaStY   (13.07.2009 в 00:57)
 

Да я-то что... Себя Вы запутали куда раньше.

  Ответить  
 
 автор: FaStY   (13.07.2009 в 01:06)   письмо автору
 
   для: Trianon   (13.07.2009 в 01:04)
 

возможно, просто я не знаю как это расписать( если че придумаю - напишу еще)

  Ответить  
 
 автор: Valick   (13.07.2009 в 01:25)   письмо автору
 
   для: FaStY   (13.07.2009 в 01:06)
 

да напридумали уже)
Вы лучше опишите суть всего происходящего.. что за игры, взаимодействие юзеров и тп. попорядку.

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

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