Реклама на сайте Advertise with us

Подскажите, как лучше реализовать на PHP.

Расширенный поиск по форуму
 
Новая тема Новая тема   
Автор
Поиск в теме:

Люблю то, что делаю!

С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418


Передовик Master-X (16.12.2014) Передовик Master-X (16.02.2017) Передовик Master-X (01.03.2017) Передовик Master-X (16.03.2017) Передовик Master-X (01.09.2017) Ветеран трепа Master-X (16.09.2017)
Ссылка на сообщениеДобавлено: 15/12/16 в 22:18       Ответить с цитатойцитата 

Нужно реализовать генерацию с определенным повторением имен, без БД, только файлы.
Нюанс в том, что генерация не разовая, а дергается по крону и затем имя пишется в файл, при всем при этом имена должны генерироваться рандомно, но учитывая % повторяемости
К примеру:
имя|% повторяемости
A|40
B|20
C|15
D|10
E|5
F|5
G|3
H|2
J|1
На основе подобного дампа всё и должно генерироваться, в данном примере только 9 имен, по факту их может быть до нескольких тысяч.
Как вариант, добавить еще один параметр в дамп (относительный %):
На начальной стадии относительный % = 0, у всех
имя|% повторяемости|относительный %
A|40|0
B|20|0
C|15|0
D|10|0
E|5|0
F|5|0
G|3|0
H|2|0
J|1|0
Затем после первой генерации, относительный процент у одного из имен (кторое сгенерировано первым) будет равен 100%, затем второй раз рандомно берем из дампа строку и сравниваем, если относительный процент меньше должного %-повторяемости, то генерим это имя, если больше, то берем другую строку дампа и также сравниваем, при этом вероятнее всего, нужно будет добавить еще один параметр, это число сгенерированных имен, чтоб можно было высчитывать относительны процент.
Надеюсь поймете мысль icon_smile.gif
Спасибо!

PS: возможно это было бы проще реализовать с использованием БД, но в них я ноль, хотя вещь полезная. Но меня у меня фобия того, что из-за незнания БД могут ломануть SQL инъекцией или чем-то подобным.

2
 



С нами с 22.05.04
Сообщения: 268
Рейтинг: 251

Ссылка на сообщениеДобавлено: 16/12/16 в 01:50       Ответить с цитатойцитата 

1. определись как с конечным результатом, так и с оптимальным алгоритмом того что ты хочешь реализовать. пока что тут слегка каша

2. если нужно много и часто и с хранением результатов - заранее посмотри в сторону redis/memcached

ну и про цепи маркова почитай, по ним уже много много лет существуют готовые алгоритмы - например для генерации текста древних дорвеев trollface.png

Нестандартные задачи. Кастом программинг на ПХП. Оптимизация стороннего кода. Недорого, недешево.

7
 

Люблю то, что делаю!

С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418


Передовик Master-X (16.12.2014) Передовик Master-X (16.02.2017) Передовик Master-X (01.03.2017) Передовик Master-X (16.03.2017) Передовик Master-X (01.09.2017) Ветеран трепа Master-X (16.09.2017)
Ссылка на сообщениеДобавлено: 16/12/16 в 19:36       Ответить с цитатойцитата 

Вот по сути рабочий вариант, написан на основе имеющихся знаний, я не волшебник, я только учусь icon_smile.gif icon_razz.gif .
Код: [развернуть]



dbFrequencyOfUse.dat
Код: [развернуть]


Всё работает. Но есть один момент. Если тупо зажать F5, т.е. исполняться код будет очень быстро, в конечном итоге данные в dbFrequencyOfUse.dat херятся и получается пустой файл.
В чем может быть причина?

3
 

📈sflash.biz

С нами с 03.11.12
Сообщения: 3912
Рейтинг: 4447


Передовик Master-X (16.04.2018) Передовик Master-X (16.07.2018) Передовик Master-X (16.12.2022) Передовик Master-X (01.01.2023)
Ссылка на сообщениеДобавлено: 16/12/16 в 19:57       Ответить с цитатойцитата 

Lexikon писал:
В чем может быть причина?

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

11
 

Люблю то, что делаю!

С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418


Передовик Master-X (16.12.2014) Передовик Master-X (16.02.2017) Передовик Master-X (01.03.2017) Передовик Master-X (16.03.2017) Передовик Master-X (01.09.2017) Ветеран трепа Master-X (16.09.2017)
Ссылка на сообщениеДобавлено: 16/12/16 в 20:22       Ответить с цитатойцитата 

S_Flash писал:
Если я попробую угадать, то в тестах у тебя всё хорошо, а в продакшене на сервере, в момент нагрузки - плохо, верно?

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

3
 

📈sflash.biz

С нами с 03.11.12
Сообщения: 3912
Рейтинг: 4447


Передовик Master-X (16.04.2018) Передовик Master-X (16.07.2018) Передовик Master-X (16.12.2022) Передовик Master-X (01.01.2023)
Ссылка на сообщениеДобавлено: 16/12/16 в 22:25       Ответить с цитатойцитата 

Lexikon писал:
Но всё же, стало интересно, как то можно организовать это так, чтоб оно работало и на нагрузке?

- Ну либо юзать вместо file_xxx_contents - fopen() в сочетании с flock() по старинке,
- либо посмотреть внимательнее мануал по file_put_contents, там вроде есть имитация лока в виде LOCK_EX.

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

5
 

www.phpdevs.com

С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105


Передовик Master-X (01.09.2005) Передовик Master-X (16.09.2005) Передовик Master-X (01.10.2005) Передовик Master-X (16.08.2006) Передовик Master-X (16.10.2006) Ветеран трепа Master-X ()
Ссылка на сообщениеДобавлено: 17/12/16 в 01:08       Ответить с цитатойцитата 

Дались вам эти файлы. PDO->sqlite и куча проблем будет решена. Вон что хром, что фаерфокс - все куки, сессии, логины и т.п. пишут именно в sqlite.

Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.

10
 



С нами с 18.10.02
Сообщения: 4165
Рейтинг: 3365

Ссылка на сообщениеДобавлено: 17/12/16 в 01:17       Ответить с цитатойцитата 

Lexikon:
Что по-твоему делает вот эта строчка?
Код: [развернуть]


Stek писал:
PDO->sqlite и куча проблем будет решена.

И появится куча других, если основ не понимать.

2
 

www.phpdevs.com

С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105


Передовик Master-X (01.09.2005) Передовик Master-X (16.09.2005) Передовик Master-X (01.10.2005) Передовик Master-X (16.08.2006) Передовик Master-X (16.10.2006) Ветеран трепа Master-X ()
Ссылка на сообщениеДобавлено: 17/12/16 в 03:03       Ответить с цитатойцитата 

Mika писал:
И появится куча других

Каких именно ?

Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.

2
 

Люблю то, что делаю!

С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418


Передовик Master-X (16.12.2014) Передовик Master-X (16.02.2017) Передовик Master-X (01.03.2017) Передовик Master-X (16.03.2017) Передовик Master-X (01.09.2017) Ветеран трепа Master-X (16.09.2017)
Ссылка на сообщениеДобавлено: 17/12/16 в 06:55       Ответить с цитатойцитата 

Вот этот вопрос мне адресован?
Mika писал:
Lexikon:
Что по-твоему делает вот эта строчка?
Код: [свернуть]
      if (copy($pathToTmpFileDump, $pathToFileDump)){

Или это к:
S_Flash писал:
то лучше раздели на 2 отдельных и копируй обновлённый, только когда тот готов и читай уже с него.



Stek писал:
Дались вам эти файлы. PDO->sqlite и куча проблем будет решена. Вон что хром, что фаерфокс - все куки, сессии, логины и т.п. пишут именно в sqlite.

Изучу, что это такое. Спасибо.

2
 

📈sflash.biz

С нами с 03.11.12
Сообщения: 3912
Рейтинг: 4447


Передовик Master-X (16.04.2018) Передовик Master-X (16.07.2018) Передовик Master-X (16.12.2022) Передовик Master-X (01.01.2023)
Ссылка на сообщениеДобавлено: 17/12/16 в 10:19       Ответить с цитатойцитата 

Кстати, кто-то знает file_put_contents - атомарна по отношению к чтению из этого же файла или можно поймать запись на середине заполнения файла и прочитать только тот кусок, что учпел записаться на данный момент?

5
 

💀💀💀

С нами с 31.05.10
Сообщения: 4688
Рейтинг: 727

Ссылка на сообщениеДобавлено: 17/12/16 в 10:50       Ответить с цитатойцитата 

не атомарна. Развернутый ответ:

http://stackoverflow.com/questions/4899737/should-lock-ex-on-both-r…1&lq=1

7
 

📈sflash.biz

С нами с 03.11.12
Сообщения: 3912
Рейтинг: 4447


Передовик Master-X (16.04.2018) Передовик Master-X (16.07.2018) Передовик Master-X (16.12.2022) Передовик Master-X (01.01.2023)
Ссылка на сообщениеДобавлено: 17/12/16 в 11:02       Ответить с цитатойцитата 

тогда хуййознает, как читатать только "готовый файл" в многозадачных системах и стоит ли юзать тут именно файловую систему.

5
 

💀💀💀

С нами с 31.05.10
Сообщения: 4688
Рейтинг: 727

Ссылка на сообщениеДобавлено: 17/12/16 в 11:20       Ответить с цитатойцитата 

Для таких целей обычно семафоры используют. (сам не юзал, тока теорию читал =))

4
 

💀💀💀

С нами с 31.05.10
Сообщения: 4688
Рейтинг: 727

Ссылка на сообщениеДобавлено: 17/12/16 в 11:27       Ответить с цитатойцитата 

или как вариант юзать бдшные транзации и всякие лок тейблы для хранения.
У редиса также все операции атомарны, т.к. работают в 1 потоке + есть транзакции. Тож можно юзать.

4
 



С нами с 13.01.03
Сообщения: 1032
Рейтинг: 1146

Ссылка на сообщениеДобавлено: 18/12/16 в 19:19       Ответить с цитатойцитата 

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

5
 

Люблю то, что делаю!

С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418


Передовик Master-X (16.12.2014) Передовик Master-X (16.02.2017) Передовик Master-X (01.03.2017) Передовик Master-X (16.03.2017) Передовик Master-X (01.09.2017) Ветеран трепа Master-X (16.09.2017)
Ссылка на сообщениеДобавлено: 19/12/16 в 19:35       Ответить с цитатойцитата 

Скрипт который обращается к файлу запускается по крону и во время работы скрипта его больше ни кто не беспокоит.
Проблема в принципе раскрыта в этом топике, множественные обращение, которые так же происходят во время записи и перезаписи файла, соответственно в какой то момент получается, что одно перекрывается другим, и в конечном итоге всё херится.
Проблему решил достаточно просто:
Код:

$pathToStatusFile = "status.dat";
      if (!is_writable($pathToFileDump)) {
         exit();
      }

      if (!is_writable($pathToStatusFile) OR file_get_contents($pathToStatusFile) == 1) {
         exit();
      }else{

         file_put_contents($pathToStatusFile, 1);
# тут основной код
         file_put_contents($pathToStatusFile, 0);   
      }      

   return $result;


Смысл в том, что пока выполняется скрипт, в дополнительном файле status.dat ставим метку, в данном случае это 0, типа ЗАНЯТО! icon_smile.gif и при попытке обратиться во время исполнения скрипта вторым запросом, получаем выход из скрипта exit() и всё. Статус же меняется по окончанию выполнения и после этого уже можно обращаться. Пока писал этот пост, подумал, что примерно так же можно вместо exit() запускать цикл, но он скорее всего будет полезен только том случае, если не нужно выходить из скрипта.

2
 

💀💀💀

С нами с 31.05.10
Сообщения: 4688
Рейтинг: 727

Ссылка на сообщениеДобавлено: 19/12/16 в 20:10       Ответить с цитатойцитата 

вместо метки можно работать с файлом в режиме лока на запись.
Т.е. пока какой-то скрипт работает на запись, никто другой к нему не лезет.
http://php.net/manual/ru/function.flock.php

Код:

if (is_file($pathToFileDump) && !is_writable($pathToFileDump)) {
   exit();
}


Этого должно быть достаточно, и убрать файловый семафор ;D

П.С.
Хотя там в примерах есть годные функции по работе с залоченым файлом без искусственных проверок на запись.

4
 



С нами с 09.08.12
Сообщения: 185
Рейтинг: 378

Ссылка на сообщениеДобавлено: 20/12/16 в 16:15       Ответить с цитатойцитата 

Stek писал:
PDO->sqlite и куча проблем будет решена


лучше mysql - он есть на всех хостингах. а sqlite - не всегда доступен.

5
 



С нами с 09.08.12
Сообщения: 185
Рейтинг: 378

Ссылка на сообщениеДобавлено: 20/12/16 в 16:17       Ответить с цитатойцитата 

Lexikon писал:
возможно это было бы проще реализовать с использованием БД, но в них я ноль, хотя вещь полезная. Но меня у меня фобия того, что из-за незнания БД могут ломануть SQL инъекцией или чем-то подобным.


экранируй весь пользовательский ввод mysqli_real_escape_string
http://php.net/manual/ru/mysqli.real-escape-string.php

или используй prepared statement
http://php.net/manual/ru/mysqli.quickstart.prepared-statements.php

10
 

Люблю то, что делаю!

С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418


Передовик Master-X (16.12.2014) Передовик Master-X (16.02.2017) Передовик Master-X (01.03.2017) Передовик Master-X (16.03.2017) Передовик Master-X (01.09.2017) Ветеран трепа Master-X (16.09.2017)
Ссылка на сообщениеДобавлено: 20/12/16 в 18:37       Ответить с цитатойцитата 

rickdeckard писал:
лучше mysql - он есть на всех хостингах. а sqlite - не всегда доступен.

Вчера в качестве вечернего просмотра организовал себе просмотр видоса по sqlite, как я понял sqlite идет в PHP 5. У меня WAMP установлен, там тоже есть icon_smile.gif

2
 

Люблю то, что делаю!

С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418


Передовик Master-X (16.12.2014) Передовик Master-X (16.02.2017) Передовик Master-X (01.03.2017) Передовик Master-X (16.03.2017) Передовик Master-X (01.09.2017) Ветеран трепа Master-X (16.09.2017)
Ссылка на сообщениеДобавлено: 20/12/16 в 18:44       Ответить с цитатойцитата 

rickdeckard писал:
экранируй весь пользовательский ввод mysqli_real_escape_string
http://php.net/manual/ru/mysqli.real-escape-string.php

или используй prepared statement
http://php.net/manual/ru/mysqli.quickstart.prepared-statements.php

Благодарю!
Это да, но вот всё же, меня не покидает мысль, что как-то относительно просто ломают базы, х.з. может всё так изначально криво пишут, чтоб специально ломать. Знаю существуют большие базы с SQL запросами инъекций и ими хуярят различные форумы и сайты. Разве те, кто писал код сайта, не в курсе что да как? Может я что-то не понимаю, касаемо этого. icon_confused.gif
Вот уже наверное года 3-4 использую ПХП, но всё организовывал на файлах, наверное всё таки фобия smail101.gif

1
 

💀💀💀

С нами с 31.05.10
Сообщения: 4688
Рейтинг: 727

Ссылка на сообщениеДобавлено: 20/12/16 в 19:27       Ответить с цитатойцитата 

Движки форумов и сайтов ооочень древние, никто не апгрейдит их и не переписывает. Ибо нахуя? Работает - не трожь. =)
Вот. А еще в сети мегатонны старых манов, где все примерны на старых мускульных функциях, и всякие новички пишут по ним свои велосипеды. А потом удивляются как это все ломается весело и задорно.

Вот к примеру яркий пример: https://toster.ru/q/381480
Просто первый попавшийся кликнул на тематику пхп+мускул =)

Может и не сильно будет понятно с первого раза, но когда въедешь во всю эту кухню, поймешь какой это пездец. Если в краце, то у чувака вообще никаких проверок и экранирования, уже молчу про использование prepareStatement.

9
 

Люблю то, что делаю!

С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418


Передовик Master-X (16.12.2014) Передовик Master-X (16.02.2017) Передовик Master-X (01.03.2017) Передовик Master-X (16.03.2017) Передовик Master-X (01.09.2017) Ветеран трепа Master-X (16.09.2017)
Ссылка на сообщениеДобавлено: 20/12/16 в 19:56       Ответить с цитатойцитата 

Ailk писал:
Движки форумов и сайтов ооочень древние, никто не апгрейдит их и не переписывает. Ибо нахуя? Работает - не трожь. =)
Вот. А еще в сети мегатонны старых манов, где все примерны на старых мускульных функциях, и всякие новички пишут по ним свои велосипеды. А потом удивляются как это все ломается весело и задорно.

Вот к примеру яркий пример: https://toster.ru/q/381480
Просто первый попавшийся кликнул на тематику пхп+мускул =)

Может и не сильно будет понятно с первого раза, но когда въедешь во всю эту кухню, поймешь какой это пездец. Если в краце, то у чувака вообще никаких проверок и экранирования, уже молчу про использование prepareStatement.

Ясно. Благодарю! icon_smile.gif

1
 

Люблю то, что делаю!

С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418


Передовик Master-X (16.12.2014) Передовик Master-X (16.02.2017) Передовик Master-X (01.03.2017) Передовик Master-X (16.03.2017) Передовик Master-X (01.09.2017) Ветеран трепа Master-X (16.09.2017)
Ссылка на сообщениеДобавлено: 20/12/16 в 20:05       Ответить с цитатойцитата 

Кстати, тут задался таким вопросом, а как правильно проверить существование файла, встречал варианты проверок: is_file() и file_exists(), но и опять же, бывает такой вариант, что файл то существует, но вот для чтения и записи не доступен, т.е. тут нужны функции is_readable(), is_writable().
Как правило для создания и чтения файлов использую file_put_contents() и file_get_contents().

1
 
Новая тема Новая тема   

Текстовая реклама в форме ответа
Заголовок и до четырех строчек текста
Длина текста до 350 символов
Купить рекламу в этом месте!


Перейти:  



Спонсор раздела Стань спонсором этого раздела!

Реклама на сайте Advertise with us

Опросы

Рецепт новогоднего блюда 2022



Обсудите на форуме обсудить (11)
все опросы »