Новости Joomla

0 Пользователей и 1 Гость просматривают эту тему.
  • 217 Ответов
  • 8025 Просмотров
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
borro, та ну что ж вы никак не отделите мух от котлет? :) вы по прежнему мешаете в кучу серверную и клиентскую части. во-первых какие "каждые 5 секунд"? во-вторых какая разница php (серверу) сколько времени на клиенте? у вас ограничение на время выполнения на сервере. какая разница сколько будет и будет ли вообще задержка в браузере? вы отправили запрос - получили ответ. следующий запрос - следующий ответ. и так далее, пока сервер возвращает вам информацию о том, что запросы нужны. и никакие "5 секунд" вы в браузере вообще не считаете.

мой вам совет - четко проясните для себя разницу между клиентом и сервером. перечитайте столько раз, сколько потребуется. вы должны четко понимать где что происходит. это не сложно, главное вникнуть. а без этого будет каша.
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
во-первых какие "каждые 5 секунд"?
во-вторых какая разница php (серверу) сколько времени на клиенте?
1. каждые 5 секунд js будет обновлять страницу добытыми данными,
2. чтобы php ответил не позднее того, когда будет отослан новый запрос к нему, чтобы было, чем перерисовать страницу. он должен ориентироваться на интервал перерисовки страницы, на js то есть, а не на то, когда команда поступила в php. Вдруг между началом выполнения задачи в js и php возникнет существенная задержка
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
 ;D
Вдруг между началом выполнения задачи в js и php возникнет существенная задержка
Что тогда случится?
Не будь паразитом, сделай что-нибудь самостоятельно!
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
;DЧто тогда случится?
нечем будет пополнять страницу в намеченное время :)
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
нечем будет пополнять страницу в намеченное время :)
Не понял, поясните.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
1. каждые 5 секунд js будет обновлять страницу добытыми данными,
нет, не будет. js не должен это делать каждые 5 секунд. js вообще не должен ориентироваться на время.

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

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

SeBun

  • BanMaster
  • 4018
  • 259 / 5
  • @SeBun48
Давайте еще раз поясню, может будет понятнее...

borro, смотрите: у вас скрипт на php. Допустим, в нем нет никаких циклов, а реализована простейшая логика - только один запрос и одно условие. Алгоритм его работы такой: после того, как будет сделан запрос и получен ответ от базы, условие определяет, есть ли указанный файл на диске и, если есть - удалить его. Все. Вы запускаете этот скрипт, он делает запрос в базу, выбирает из нее запись №1, возвращает ее, условие срабатывает, файл удаляется и скрипт завершает работу. При повторном запуске произойдет то же самое, будет сделан запрос в базу, выбрана запись №1, но файл не будет удален, т.к. его нет.

Ок, теперь наша задача - заставить скрипт пройтись по всей базе. Что мы делаем? Мы усложняем алгоритм работы: сначала делаем запрос в базу и спрашиваем у нее, сколько записей содержится в нужной нам таблице. Затем создаем цикл, в котором будет находится наше условие - запрос в базу и удаление файла. Таким образом мы получаем следующий алгоритм: вначале делается запрос в базу, получается общее количество записей в ней, далее создается цикл, внутри которого идет проход по каждой записи и удаление файлов, если есть. Все красиво, все работает как надо.

Но только когда в тестовой базе 5-10 записей. Но вот на боевом сайте таких записей около миллиона и ограничение на работу php в 30 секунд, а расчетное время работы вашего скрипта с этой базой - 15 минут. Какой может быть выход?

Для этого делаем JS, который с некоторой периодичностью перезапускает php, который обрабатывает по одной записи. То есть в php мы удаляем цикл и делаем его на JS. Теперь имеем такой алгоритм: JS запускается и дает команду php вернуть количество строк в базе. PHP задачу выполняет, делая запрос и передавая в JS количество строк. Далее JS запускает цикл, количество интераций которого равно количеству полученных от базы строк. Первый запрос - в php передается номер, он его получает, на его основании понимает, какую строку запрашивать, запрашивает эту строку, выполняет условие и завершает работу. Затем JS шлет новый запрос, с новым номером, цикл повторяется. Все работает, все красиво, но теперь ваш скрипт выполняется 30 минут (зато выполняется!).

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

Вы замеряете время работы от старта php до завершения. Если быть точным - время с момента запроса в базу и завершения работы условия. Это время будет равно 0.0..сколько то долей секунды. Вы понимаете, что сделав в цикле JS интервал в 2 секунды, вы тем самым тратите впустую массу серверного времени. Вы расчитываете, что с момента получения команды PHP мог бы обработать 200 таких запросов вместо одного. Вы пишите цикл в php. Теперь алгоритм такой: JS запускается и дает команду php вернуть количество строк в базе. PHP задачу выполняет, делая запрос и передавая в JS количество строк. Далее JS запускает цикл, количество интераций которого равно количеству полученных от базы строк. Первый запрос - в php передается номер, он его получает, на его основании понимает, какую строку запрашивать. На этом этапе в переменную запоминается микротайм (старт). Делается запрос строки в базу, выполняет условие и скрипт завершает завершает работу. Регистрируется вторая временная метка и делается расчет времени, затраченного на выполнение скрипта. Это время можно передать JS, который получит его и поймет, сколько запросов можно выполнить за одну интерацию. Затем JS шлет новый запрос, с новым номером строки и количеством интераций, которое разрешается выполнить PHP. Теперь ваш скрипт отработает меньше минуты, но больше 30 сек, чего мы и добивались.

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

Уффф... осилил. Копирайтер никому не нужен? )
« Последнее редактирование: 25.07.2017, 17:31:33 от SeBun »
Оказываю услуги по Joomla | Миграция/Обновление | Сопровождение | IT-аутсорсинг | Недорогие домены и хостинг
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Не будь паразитом, сделай что-нибудь самостоятельно!
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
А я - нет :(.
я честно говоря тоже :) иду вот, заварю чай, и вернусь к прочтению :)
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

SeBun

  • BanMaster
  • 4018
  • 259 / 5
  • @SeBun48
А я - нет
я честно говоря тоже

Ппц, в копирайтеры не возьмут - надо было абзацы разделять пробелами...
Оказываю услуги по Joomla | Миграция/Обновление | Сопровождение | IT-аутсорсинг | Недорогие домены и хостинг
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Ппц, в копирайтеры не возьмут - надо было абзацы разделять пробелами...
Спойлер
[свернуть]
1. каждые 5 секунд js будет обновлять страницу добытыми данными,
2. чтобы php ответил не позднее того, когда будет отослан новый запрос к нему, чтобы было, чем перерисовать страницу. он должен ориентироваться на интервал перерисовки страницы, на js то есть, а не на то, когда команда поступила в php. Вдруг между началом выполнения задачи в js и php возникнет существенная задержка
1. Не совсем понял, что вы хотите сделать, но по-моему, выше уже писали про AJAX: не надо тупо обновлять страницу каждые 5 сек., следующее действие должно зависеть от полученного ответа сервера.
2. Тогда этот пункт отпадает.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Спасибо, SeBun. Вы просто гигант мысли :)
Теперь ваш скрипт отработает меньше минуты, но больше 30 сек, чего мы и добивались.
вы говорили, что 30 секунд не стоит превышать или речь о времени отработки задачи в js?
Задача у меня сейчас немного другая, правда - сначала сканирую все файлы, что есть в папке, а потом, проверяю фигурируют ли они в базе, если нет - удаляю. В общем пошел реализовывать, хватит забирать ваше время
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
вы говорили, что 30 секунд не стоит превышать или речь о времени отработки задачи в js?
речь идет о максимально разрешенном времени работы php. и вы должны понимать, что 30 секунд - это примерная величина. скажем так, самое распространенное время у хостеров. я видел сервера и с 10 секундами выполнения. а видел со 120, но при этом nginx ожидал ответ по-умолчанию 60, и это еще печальнее.

Задача у меня сейчас немного другая, правда - сначала сканирую все файлы, что есть в папке, а потом, проверяю фигурируют ли они в базе, если нет - удаляю. В общем пошел реализовывать, хватит забирать ваше время
Спойлер
[свернуть]
почему то совет учиться никто не хочет слышать. это видимо что-то противозаконное или аморальное, хз. последний разок попробую еще, и хватит :) задача у вас сейчас одна - читать, и понять. реализовывать еще рано.
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

capricorn

  • Завсегдатай
  • 1949
  • 118 / 3
Цитировать
реализовывать еще рано

а вдруг получится, и мы узнаем, как неправильную, и поэтому медленную, работу с БД на уровне MySQL для задач VM разбить каким-то образом с помощью JavaScript и php на маленькие быстрые части на чужом сервере, где у пользователя практически нет никаких прав.

*

SeBun

  • BanMaster
  • 4018
  • 259 / 5
  • @SeBun48
почему то совет учиться никто не хочет слышать. это видимо что-то противозаконное или аморальное
Когда я выхожу из дома, я с трудом свыкаюсь с мыслью, что живу на той же самой планете, на которой родился...
Оказываю услуги по Joomla | Миграция/Обновление | Сопровождение | IT-аутсорсинг | Недорогие домены и хостинг
*

Филипп Сорокин

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
Что-то я потерял нить дискуссии. Оффтоп: почто несчастную итерацию так настойчиво обзывают интерацией?
*

SeBun

  • BanMaster
  • 4018
  • 259 / 5
  • @SeBun48
почто несчастную итерацию так настойчиво обзывают интерацией?
Привычка )
Оказываю услуги по Joomla | Миграция/Обновление | Сопровождение | IT-аутсорсинг | Недорогие домены и хостинг
*

SmokerMan

  • Гуру
  • 5293
  • 720 / 26
Давайте еще раз поясню, может будет понятнее...
а я не понял
правда до конца не смог прочесть)
подробнее можно?
*

capricorn

  • Завсегдатай
  • 1949
  • 118 / 3
Цитировать
EXPLAIN SELECT самый объективный метод сравнить трудновыполнимость запросов? Я там не вижу стоимостных(временных) оценок выполнения запроса

Можете использовать внутренний профайлер MySQL. https://stackoverflow.com/questions/4031934/getting-the-actual-absolute-execution-time-of-the-last-query-in-php-excluding. Скрипт выводит нечто подобное

Цитировать
array(3) {
  • => string(1) "1" [1]=> string(10) "0.00012600" [2]=> string(29) "SELECT * FROM `jw578_content`" }


array(2) {
  • => string(8) "starting" [1]=> string(8) "0.000012" } array(2) {
  • => string(28) "Waiting for query cache lock" [1]=> string(8) "0.000003" } array(2) {
  • => string(30) "checking query cache for query" [1]=> string(8) "0.000029" } array(2) {
  • => string(20) "checking permissions" [1]=> string(8) "0.000005" } array(2) {
  • => string(14) "Opening tables" [1]=> string(8) "0.000046" } array(2) {
  • => string(9) "query end" [1]=> string(8) "0.000003" } array(2) {
  • => string(14) "closing tables" [1]=> string(8) "0.000002" } array(2) {
  • => string(13) "freeing items" [1]=> string(8) "0.000008" } array(2) {
  • => string(18) "logging slow query" [1]=> string(8) "0.000002" } array(2) {
  • => string(11) "cleaning up" [1]=> string(8) "0.000018" }
Те же результаты выводит режим debug Joomla - профилирование sql запросов.

О добавлении индексов к стандартным таблицам VM можете забыть - никакой вменяемый пользователь не будет ставить такой компонент.




« Последнее редактирование: 25.07.2017, 20:57:11 от capricorn »
*

Филипп Сорокин

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
Цитировать
О добавлении индексов к стандартным таблицам VM можете забыть - никакой вменяемый пользователь не будет ставить такой компонент.
Да им, на самом деле, пофигу, какова будет внутренняя логика. Главное, чтоб работало, а религиозные ценности на тему "ставить индекс/не ставить индекс" пользователя вообще не заботит в 99% случаев. Я даже больше скажу: на JED есть несколько популярных расширений, которые дописывают столбцы к родным табличкам Joomla! -- и ничего -- куча отзывов, все довольны :)
*

capricorn

  • Завсегдатай
  • 1949
  • 118 / 3
Цитировать
и ничего -- куча отзывов, все довольны

Индекс заставляет MySQL выполнять дополнительную работу. И не факт, что можно насовать индексов где попало в чужих расширениях без последствий. Дело ваше, но я предпочитаю не использовать такие расширения.
« Последнее редактирование: 25.07.2017, 23:03:08 от capricorn »
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Скрипт выводит нечто подобное
Ничего себе, это скрипт выводит столько смайликов?
Индекс заставляет MySQL выполнять дополнительную работу. И не факт, что можно насовать индексов где попало в чужих расширениях без последствий. Дело ваше, но я предпочитаю не использовать такие расширения.
Конечно, нельзя применять индекс где попало, но если в целом работа будет выполняться в разы быстрее с дополнительной работой, чем без нее, то какие выводы можно сделать?
Не будь паразитом, сделай что-нибудь самостоятельно!
*

capricorn

  • Завсегдатай
  • 1949
  • 118 / 3
Цитировать
Ничего себе, это скрипт выводит столько смайликов?

Это SMF заменил. Видимо, он прочел своеобразную параллель SeBun между женщинами и программами, и мою фразу о вставке индексов.

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

Вывод простой - не надо лезть туда, куда не надо. Почему бы вообще все не индексировать? Вы лучше ответьте на вопрос, каким образом могут быть незаполненными поля, описанные как Not Null и как нужно обработать всего примерно 20 000 строк, чтобы все упало.


« Последнее редактирование: 26.07.2017, 00:54:15 от capricorn »
*

Филипп Сорокин

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
Цитировать
Это SMF заменил.
Для кода используйте шорткод code, а не quote.

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

Цитировать
каким образом могут быть незаполненными поля, описанные как Not Null.
Когда происходит Left Join, Null добавляется туда, где нет совпадений.
*

capricorn

  • Завсегдатай
  • 1949
  • 118 / 3
Цитировать
Когда происходит Left Join, Null добавляется туда, где нет совпадений.

Православно - необходимо следить за целостностью данных.

Цитировать
каким образом могут быть незаполненными поля, описанные как Not Null.
Когда происходит Left Join, Null добавляется туда, где нет совпадений.

Я о том, как в бд они могут появиться, а не о том, как искать несовпадения.
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Вывод простой - не надо лезть туда, куда не надо.
Правильно.
Почему бы вообще все не индексировать?
Можно, почему нет? Просто иногда будет долго, а иногда - белый экран.
Смотрите: допустим, вы делаете запрос с условием
Код: sql
WHERE мой_столбик=100500
Если мой_столбик не проиндексирован и строка со значением 100500 лежит где-то на 100501-м месте, то MySQL придется перебирать 100501 строку, чтобы найти нужную. В противном случае она просто идет прямиком к нужной строке.
Конечно, это идеальный случай, но в целом индексирование очень хорошо помогает там, где его применение приемлемо.

P.S.
Я о том, как в бд они могут появиться, а не о том, как искать несовпадения.
А они в БД и не появляются. Тут как раз работает ваш принцип
не надо лезть туда, куда не надо.
« Последнее редактирование: 26.07.2017, 01:22:18 от robert »
Не будь паразитом, сделай что-нибудь самостоятельно!
*

capricorn

  • Завсегдатай
  • 1949
  • 118 / 3
На мой взгляд Филипп ТС-а с толку сбил своим Left Join запросом.
Цитировать
Если мой_столбик не проиндексирован...

Индексация по Null работает. Не в этом вопрос. Вопрос в поиске по Null, где его быть не должно. См. выше мои тесты. Споткнулся запрос на моей платформе, чего быть не должно было.
« Последнее редактирование: 26.07.2017, 02:10:35 от capricorn »
*

SeBun

  • BanMaster
  • 4018
  • 259 / 5
  • @SeBun48
Короче. Вот готовое решение, расписанное уже с примером. Смотрите, как там сделано, и делайте так же. Немного не то, что я рассказывал, но в целом похоже.

Здесь реализована сама логика. Разбирайтесь, как работает, меняйте под свои нужды, и будет вам счастье.
Оказываю услуги по Joomla | Миграция/Обновление | Сопровождение | IT-аутсорсинг | Недорогие домены и хостинг
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Всем доброго утра!
Короче. Вот готовое решение, расписанное уже с примером. Смотрите, как там сделано, и делайте так же. Немного не то, что я рассказывал, но в целом похоже.

Здесь реализована сама логика. Разбирайтесь, как работает, меняйте под свои нужды, и будет вам счастье.
Спасибо!
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться