[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как поведет себя php скрипт
SoMeOnE
На сервере имеется скрипт, на который каждую минуту посылается порция информации. Он ее парсит и заносит в базу. Что случиться если он не успеет пропарсить имеющуюся инфу, до того как поступит другая (а это скорей всего и произойдет скоро)
И не подскажите как нужно работать в данном случае
sergeiss
Цитата (SoMeOnE @ 3.09.2013 - 00:00)
И не подскажете как нужно работать в данном случае

Вариант раз: есть некий файлик-индикатор, который содержит статус скрипта.
1. При запуске скрипта проверяю этот файл.
2. Если всё ОК, то сначала пишу в этот файл статус "занято", затем обрабатываю данные. При выходе перезаписываю статус на "свободно". Иначе - см. п..3
3. Если во время обработки будет запущен второй экземпляр, то см. п.1.

Второй вариант: работатает один скрипт, который по окончании загрузки вычисляет затраченное время, если надо "засыпает" на какой-то интервал времени, затем делает повторную загрузки. И т.д. по циклу. Единственная проблема - надо следить "вручную" за удалением ненужных переменных, потому что можно забить всю доступную для ПХП память и скрипт упадет.

Третий вариант smile.gif Комбинация первых двух, наиболее работоспособная система. Работаем по "второму варианту". Но периодически запускаем скрипт "по варианту один". Если время обработки превышает все разумные пределы (например, минут 15, хотя должно быть не более 1-2 минут), то считаем предыдущую версию скрипта упавшей до окончания обработки (он не выставил статус "свободно") и продолжаем обработку.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
SoMeOnE
Допустим рассмотрим первый вариант. Я правильно понимаю, что если скрипт занят, то запрос будет теряться.
Если даже его откладывать, потом давать на обработку, уже не реал-тайм получится. Если создать много одинаковых файлов парсеров и отдавать им работу в данном случае, то вся равно, во первых запись может непредсказуемо пойти, а во ввторых сколько бы не создать файлов, они вся равно рано или поздно закончаться.
sergeiss
В таком случае поясни вот это:
Цитата (SoMeOnE @ 3.09.2013 - 00:00)
На сервере имеется скрипт, на который каждую минуту посылается порция информации.

Что это означает: что если информация не принята в жестко определенное время, то она будет потеряна? Об этом в начальном условии не было сказано.

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

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
vagrand
SoMeOnE
А можно подробнее о том каким способом скрипту присылают информацию? Это обычный HTTP запрос?

_____________
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
SoMeOnE
Суть вот в чем. На скрипт посылается информация о воздушных рейсах.
Я не могу влиять на ту сторону. Они как всем послают, так и мне посылают.
Посылают в POST и в GET тоже некоторые параметры, исходя из которых я знаю данная информация относится к вылетам или прилетам.

Как мне сказали инфа обновляется каждую минту. Вроде так и есть.
Но у меня могут быть случаи в которых скрипт будет обрабатывать дольше чем минуту. Там идет обращение к апи (просто чужой сервис, я код аэропорта получаю там, так как они не посылают). Скоро я его вырублю. Какой нибудь ручной массив соответствия напишу. В этом случае несколько секунд будет обрабатываться.

Но интересно как сделать это правильно. А если у меня инфы в дальнейшем будет столько, что он действительно будет дольше минуты обрабатывать.
sergeiss
Ну.... В таком случае, для начала, оптимизировать обработку, чтобы она была гарантированно меньше минуты wink.gif

А если серьёзно, то почему бы просто не позволить работать параллельно нескольким экземплярам скрипта? Пусть себе обрабатывают. Ты когда в БД будешь класть, то какие-нибудь метки времени будут, наверное (это к тому, чтобы данные в нужном порядке класть)? Если нет, то тогда будем дальше думать.

Цитата (SoMeOnE @ 3.09.2013 - 09:29)
Там идет обращение к апи (просто чужой сервис, я код аэропорта получаю там, так как они не посылают). Скоро я его вырублю. Какой нибудь ручной массив соответствия напишу.

Что мешает это сделать сейчас? Если я правильно тебя понял, то основное время уходит на то, чтобы получить некий код аэропорта, который установлен один раз и не собирается меняться? Ну тогда, действительно, сделай у себя это соответствие. Лучше, я думаю, в виде таблицы в БД. И обновляй/дополняй её (автоматически!!!) только в том случае, если получишь неизвестный ранее (я предполагаю что новый) код.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
vagrand
SoMeOnE
Цитата
Посылают в POST и в GET тоже некоторые параметры, исходя из которых я знаю данная информация относится к вылетам или прилетам.


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

_____________
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
SoMeOnE
Метки времни есть.

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

Насчет АПИ. Я жду чтобы как можно больше аэропортов попало в базу))
На основании их создам таблицу или массив)
Потом уже редкие буду вылавливать вручную, по записям базы типа N/A, по мере работы программы)
SoMeOnE
Цитата (vagrand @ 3.09.2013 - 07:11)
SoMeOnE
Цитата
Посылают в POST и в GET тоже некоторые параметры, исходя из которых я знаю данная информация относится к вылетам или прилетам.


Ну так при каждом новом запросе будет запущена новая копия вашего скрипта в отдельном потоке

Я точно не знал этот момент. Спасибо

А насчет изменения таблицы, одно и тоже они изменить не могут если Вы об этом. Они только добавляют.
Что случиься если они синхронно добавят в базу свои данные? Что произойдет с автоинкрементом и тд. Как себя поведет база.
vagrand
SoMeOnE
Цитата
Насчет паралельности работы. Так несколько экземпляров тоже в какой-то момент будут все заняты. Скорей всего получится такой момент времени, сколько бы я экземпляров не создал.


У вас повидимому не хватает знаний о том как работает веб сервер. максимальное количество запущеных скриптов зависит от настроек сервера и его мощьности. Вам нужно только обеспечить как можно более оптимальную работуваше кго скрипта и разрулить возможные колизи с одновременны доступом к одним и тем же данным в БД. Все остальное это работа веб сервера.

Цитата
Насчет АПИ. Я жду чтобы как можно больше аэропортов попало в базу))
На основании их создам таблицу или массив)
Потом уже редкие буду вылавливать вручную, по записям базы типа N/A, по мере работы программы)


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


_____________
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
vagrand
SoMeOnE
Цитата
Что случиься если они синхронно добавят в базу свои данные? Что произойдет с автоинкрементом и тд. Как себя поведет база.

Если мы говорим о реляционной БД, например MySQL то абсолбтно синхронно нельзя добавить данные в пределах одной таблицы это контролирует сам MySQL. Если же вы добавляете данные в несколько таблиц и потом берете их id через last_insert_id() и используете их для связи, то в этом случае используйте механизмы блокировки таблиц на запись.

_____________
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
SoMeOnE
Цитата
Это в корне не верный подход. Вы же как то привязываете аэрополры полученные из этого апи к тем данным, которые присылают скрипту. Ну так запрашивайте это апи только в тех случаех когда у вас в локальном "кеше" нету нужных аэропортов. Вот это правильный и оптимальный подход.

Ок спасибо. Сделаю через кеш. Такой подход мне тоже понравился.

Цитата
Если мы говорим о реляционной БД, например MySQL то абсолбтно синхронно нельзя добавить данные в пределах одной таблицы это контролирует сам MySQL

Т.е mysql сам разрулит ситуацию в этом случае? Или же произойдет сбой?
vagrand
SoMeOnE
Цитата
Т.е mysql сам разрулит ситуацию в этом случае? Или же произойдет сбой?


В этом конкретном случае сбоя не будет.

_____________
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
SoMeOnE
vagrand
ок, спасибо за объяснения
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.