|
|
|
| Мне нужно, что бы каждую секунду у меня происходило определенное действие. у меня есть файл, в котором просто бесконечный while, в котором происходят действия (беру из таблицы мускуля данные и перемещаю в другую таблицу), но может получиться так, что у меня этот процесс может остановиться. Как мне избежать остановления этого процесса? Мне ни в коем случае нельзя, что бы этот процесс остановился.
Крон на запуск этого файла - повторно будет запускать процесс, или о посмотрти, если процесс запущен, тогда не запускать, а если такого процесса нет, тогда крон его запустить.
Вообще, бесконечный цикл , в конце которого стоит usleep(500000); сильно будет грузить сервер? (в этом цикле беруться данные из базы и переносятся в другую базу)
Либо есть другие методы?
Заранее спасибо | |
|
|
|
|
|
|
|
для: FaStY
(12.07.2009 в 18:01)
| | на мой взгляд, удобнее будет переписать скрипт, чтоб он отработал 1 раз, в начале скрипта ставить какой-то флаг, а в конце скрипта - снимать флаг..
и кроном запускать этот скрипт каждые 5 мин (или сколько он у вас там работает...)
ещё одно.. скрипт должен проверять флаг, и если он установлен, значит работает другая его копия
подумал... нужен ещё 1 флаг, который говорил бы о том, что скрипт выполнился успешно... | |
|
|
|
|
|
|
|
для: MIchail1982
(12.07.2009 в 18:12)
| | дело в том, что кром на 1 секунду не поставишь. а мне нужно, что бы скрипт каждую секунду работал | |
|
|
|
|
|
|
|
для: FaStY
(12.07.2009 в 18:20)
| | ну циклом сделайте.. доведите кол-во повторов до времени, которое можно в крон поставить | |
|
|
|
|
|
|
|
для: MIchail1982
(12.07.2009 в 18:23)
| | не, так не пойдет. там может быть вообще ничего в цикле не будет делаться, а может 100 итераций... | |
|
|
|
|
|
|
|
для: FaStY
(12.07.2009 в 18:41)
| | а если так?
<?php
$timeToWork = 5;//minut
$Time = time();
$endtime = $Time + ($timeToWork*60);
while($Time < $endtime){
//do something
$Time = time();
}
?>
|
| |
|
|
|
|
|
|
|
для: MIchail1982
(12.07.2009 в 18:51)
| | да, так мона, но вот как быть, если этот цикл будет не 5 минут, а он задержиться и будет выполняться 6 минут. а кроновский скрипт тоже примется за работу и будет путаница( | |
|
|
|
|
|
|
|
для: 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);
?>
|
| |
|
|
|
|
|
|
|
для: FaStY
(12.07.2009 в 18:01)
| | эта другая таблица на том же сервере?
Тогда почему не заполнять её параллельно с первой тем скриптом, что помещает строки в первую?
Если Вы пытаетесь на лету копировать данные на другой сервер - смотрите в сторону репликации (связка master - slave) | |
|
|
|
|
|
|
|
для: Trianon
(12.07.2009 в 20:32)
| | да, это одна и та же таблица. дело в том, что мне нужно помещать только в одну таблицу, временная таблица служит только для обеспечения очереди, т.е. так у меня не будет возникать вопросов с дублированием одинаковых данных. | |
|
|
|
|
|
|
|
для: FaStY
(12.07.2009 в 20:39)
| | >да, это одна и та же таблица.
Так одна или две?!
можно попробовать создать на таблице триггер, перекидывающий данные в другую таблицу. | |
|
|
|
|
|
|
|
для: Trianon
(12.07.2009 в 20:45)
| | у меня есть 2 таблицы. game и game_request.
Таблица game хранит в себе информацию о пользователе и игре, а так же статусе. Есть 3 статуса - игра добавлена, игра сыграна, игра не сыграна. Вот мне нужно добавить данные в таблицу, и изменить статус, если игра только что добавлена, либо сыграна, либо игра не сыграна.
И вот если например одновременно несколько пользователей добавят в таблицу, что игра была добавлена, то в таблице будет путаница, и статусы добавяться направильно, а game_request - она определяет порядок добавления в базу game, которая будет обрабатываться кроном.
Или может подскажите, как мне другим методом добавлять в таблицу game сразу, минуя game_request | |
|
|
|
|
|
|
|
для: FaStY
(12.07.2009 в 21:01)
| | что-что у вас в БД неправильно, если
>одновременно несколько пользователей добавят в таблицу, что игра была добавлена, то в таблице будет путаница, и статусы добавяться направильно
структуру покажите? | |
|
|
|
|
|
|
|
для: 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. Вы путаете базы и таблицы. Причем уже после намека, что путать такие вещи, задавая вопрос и рассчитывая получить ответ - недопустимо.
Успехов. | |
|
|
|
|
|
|
|
для: 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-ый раз ее добавляем в базу.
теперь понятно? | |
|
|
|
|
|
|
|
для: FaStY
(12.07.2009 в 22:34)
| | ни чего не понятно.
если Вам нужно исключить повторное добавление одинаковых данных, то INSERT IGNORE
алгоритмы решения задачи на ПХП и при помощи БД абсолютно разные и если вы пытаетесь использовать знания по РНР для решения задачи с помощью базы... получается полная ерунда. | |
|
|
|
|
|
|
|
для: FaStY
(12.07.2009 в 22:34)
| | Каково назначение полей id и game_id ?
В чем их отличие?
Вероятно, есть возможность обойтись оператором INSERT ... ON DUPLICATE KEY UPDATE
>добавить в базу со статусом (
добавить в таблицу !!!!
Да что же это за (beep beep beep)?!
На сервер добавляются базы
В базу добавляются таблицы (в процессе определения данных)
В таблицу добавляются столбцы (в процессе определения данных) и строки (в процессе манипулирования данными).
Уже установленный скрипт обычно не определяет данные, а только манипулирует ими. | |
|
|
|
|
|
|
|
для: Trianon
(12.07.2009 в 22:47)
| | id - это просто id записи, primary_key, unique - ничего в себе не несет. game_id - это id таблицы games (т.е. игры, которая добавляется в таблицу)
Insert on dublicate не получится, потому что мне нужно добавлять в таблицу и новые данные, а так же обновлять старые (в том случае, если новые данные после проверки, например совпадают со старыми данными) | |
|
|
|
|
|
|
|
для: 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 применяется для реализации именно такой логики.
Не обнаружен ключ - добавляется новый. Обнаружен - в строку вносятся изменения.
Обнаружение ключа - это и есть та самая проверка. | |
|
|
|
|
|
|
|
для: Trianon
(12.07.2009 в 23:59)
| | game_id не может быть уникальным, так как многие user_id могут добавлять одинаковые game_id, т.е. может быть такое:
user_id | game_id
1 1
2 1
1 2
3 1
|
| |
|
|
|
|
|
|
|
для: FaStY
(13.07.2009 в 00:10)
| | Какой смысл тогда вообще этот game_id несет? Кто его генерирует? И что мешает его убрать из таблицы вообще?
Тогда как у Вас всё таки идентифицируется игра?
Две игры являются одной и той же если... ? | |
|
|
|
|
|
|
|
для: Trianon
(13.07.2009 в 00:18)
| | все, я окончательно вас запутал. вопрос закрывается) | |
|
|
|
|
|
|
|
для: FaStY
(13.07.2009 в 00:57)
| | Да я-то что... Себя Вы запутали куда раньше. | |
|
|
|
|
|
|
|
для: Trianon
(13.07.2009 в 01:04)
| | возможно, просто я не знаю как это расписать( если че придумаю - напишу еще) | |
|
|
|
|
|
|
|
для: FaStY
(13.07.2009 в 01:06)
| | да напридумали уже)
Вы лучше опишите суть всего происходящего.. что за игры, взаимодействие юзеров и тп. попорядку. | |
|
|
|