Использование sleep

Автор alex_qrlogin, 20 декабря 2017, 10:32:47

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

alex_qrlogin

Получил рекомендацию не использовать sleep в плагинах - с чем это связано?? Есть какие то проблемы с ним у ПХП?
У меня не много опыта с ПХП))
И если есть проблемы, то как иначе организовать в скрипте ожидание события?

И второй вопрос - есть ли возможность на пхп как то сказать разорвать связь с клиентом(браузером) без ответа? (если скрипт определил попытку взлома)

iaroslav

Цитата: alex_qrlogin от 20 декабря 2017, 10:32:47Получил рекомендацию не использовать sleep в плагинах - с чем это связано?? Есть какие то проблемы с ним у ПХП?
У меня не много опыта с ПХП))
sleep не рекомендуют использовать так как скрипт получается жрущим много ресурсов. То есть он же начинает использование ресурсов с момента запуска. И заканчивает после слипа уже. Таким образом если без слипа, скажем, скрипт отжирает ресурсы 1 секунду. То со слипом он может начать отжирать столько, сколько написано в слипе.
Цитата: alex_qrlogin от 20 декабря 2017, 10:32:47И если есть проблемы, то как иначе организовать в скрипте ожидание события?
Именно ожидание события? Просто sleep это пауза выполнения скрипта, а не ожидание чего-либо.
А если требуется просто что-то запускать с определённой периодичностью или регулярно но в определённое время, то лучше воспользоваться тем же кроном, например. Благо сейчас многие хостинги дают возможность его использования клиентам, даже если у них виртуальный или выделенный сервер не покупаешь.
Цитата: alex_qrlogin от 20 декабря 2017, 10:32:47И второй вопрос - есть ли возможность на пхп как то сказать разорвать связь с клиентом(браузером) без ответа? (если скрипт определил попытку взлома)
Функция die("текст сообщения.");
Именно она используется в этом движке для аналогичных случаев. Мгновенно прекращает выполнение скрипта и выводит какое-то заданное сообщение. Если написать просто die(); то на выходе получите прекращение выполнения скрипта без ответа.

alex_qrlogin

Цитата: iaroslav от 20 декабря 2017, 15:13:42sleep не рекомендуют использовать так как скрипт получается жрущим много ресурсов. То есть он же начинает использование ресурсов с момента запуска. И заканчивает после слипа уже. Таким образом если без слипа, скажем, скрипт отжирает ресурсы 1 секунду. То со слипом он может начать отжирать столько, сколько написано в слипе.Именно ожидание события? Просто sleep это пауза выполнения скрипта, а не ожидание чего-либо.
А если требуется просто что-то запускать с определённой периодичностью или регулярно но в определённое время, то лучше воспользоваться тем же кроном, например. Благо сейчас многие хостинги дают возможность его использования клиентам, даже если у них виртуальный или выделенный сервер не покупаешь.
Именно необходимо дождаться. Пока в табличке не появится запись. Таймауты настраиваемые - по умолчанию например это запросы по 20 секунд в течении 3 минут)
Слип у меня в цикле по секунде
неужели лучше слать каждую секунду новый запрос?
это то что называется long и short polling...
А что за ресурсы жрет?

Цитата: iaroslav от 20 декабря 2017, 15:13:42Функция die("текст сообщения.");
Именно она используется в этом движке для аналогичных случаев. Мгновенно прекращает выполнение скрипта и выводит какое-то заданное сообщение. Если написать просто die(); то на выходе получите прекращение выполнения скрипта без ответа.
Я так и делаю) Думал может есть возможность сказать апачу разорвать связь без ответа

iaroslav

Цитата: alex_qrlogin от 21 декабря 2017, 14:37:38Именно необходимо дождаться. Пока в табличке не появится запись. Таймауты настраиваемые - по умолчанию например это запросы по 20 секунд в течении 3 минут)
Слип у меня в цикле по секунде
неужели лучше слать каждую секунду новый запрос?
Если именно новой записи в таблице надо дождаться, то крон действительно лучше не мучить (тем более что у него один фиг интервал минута).
А к самому скрипту, осуществляемому запись, ничего не прикрутить? Скажем, вот так вот сделав: http://klisl.com/events_php.html
Цитата: alex_qrlogin от 21 декабря 2017, 14:37:38А что за ресурсы жрет?
В основном память.
Цитата: alex_qrlogin от 21 декабря 2017, 14:37:38Я так и делаю) Думал может есть возможность сказать апачу разорвать связь без ответа
Если именно через апач то пишут что возможность есть с помощью header("Connection: close"); . Но, так как оно через отправку заголовка делается, то получается, что уже обязательно буферизация должна быть.
Вот, если интересно, тут можно глянуть пример кода: https://stackoverflow.com/questions/138374/close-a-connection-early

alex_qrlogin

Цитата: iaroslav от 22 декабря 2017, 09:51:53А к самому скрипту, осуществляемому запись, ничего не прикрутить?
скрипт выполняющий запись из другого коннекта)) если бы можно было что то, то я бы и не писал в бд)) и все равно в скрипте вызываемом из ajax нужно дождаться... вопрос просто выходит где ждать - на сервере или клиенте... в голове не укладывается, что рекомендуют каждую секунду слать запрос, вместо крутить цикл на сервере))

Цитата: iaroslav от 22 декабря 2017, 09:51:53В основном память.
а как знать сколько памяти? сам по себе мой скрипт мизерный совсем и можно перед циклом поосвобождать было бы
мне на другом форуме написали что главная проблема - это просто ограниченное к-во одновременных коннектов у пхп - я все никак в такое поверить не могу)))
мол что даже может быть сконфигурировано на всего ОДИН коннект))

Цитата: iaroslav от 22 декабря 2017, 09:51:53header("Connection: close");
спасибо)

iaroslav

Цитата: alex_qrlogin от 22 декабря 2017, 13:14:43в голове не укладывается, что рекомендуют каждую секунду слать запрос, вместо крутить цикл на сервере))
Не рекомендуют ни того, ни этого.
Крон рекомендуется как замена sleep именно в случаях, когда требуется что-то запускать по расписанию или с достаточно большой периодичностью.
Это я просто вас исходно несколько неверно понял.

Кстати, а вы WebSocket использовать не пробовали? Он, вроде как, для чего-то подобного и предназначен, при этом и выжираемость ресурсов у него минимальная. Вот тут про него почитать можно: https://habrahabr.ru/post/209864/
Цитата: alex_qrlogin от 22 декабря 2017, 13:14:43а как знать сколько памяти? сам по себе мой скрипт мизерный совсем и можно перед циклом поосвобождать было бы
Увы, в случае со слипом никак нормально не узнать. Разве что глянув выжирание памяти непосредственно процессом на сервере. Все имеющиеся методы диагностики потребления памяти на самом php ориинтированы именно на быстро выполняющиеся скрипты, а не висящие подолгу.
Цитата: alex_qrlogin от 22 декабря 2017, 13:14:43мне на другом форуме написали что главная проблема - это просто ограниченное к-во одновременных коннектов у пхп - я все никак в такое поверить не могу)))
мол что даже может быть сконфигурировано на всего ОДИН коннект))
Количество коннектов чего к чему? Если клиентов то к апачу (или нгиксу стоящему перед ним) то действительно есть такая фича. При желании можно ограничение отключить (или просто влепить туда какое-то большое число), но это приведёт к повышенной уязвимости вашего сервера для ддоса. К тому же если речь идёт о плагине для форума, то из самого скрипта количество подключений не поменять.
Если же клиентов к базе... то такая штука тоже есть, но на практике с ней редко сталкиваются. Всё-таки mysql сервер может выстраивать запросы в очередь. Хотя, если скрипт будет с постоянно слать запросы в базу и запущен несколькими людьми одновременно, то очереди может и не хватить...

alex_qrlogin

Цитата: iaroslav от 22 декабря 2017, 15:54:20WebSocket
они тут не при чем)
я же не хочу втыкать какой то дополнительный сервер)

в общем я пока кое что подправил и выложил новую версию - там можно настроить и лонг и шорт поллинг как из аякса так и из телефона...
подожду отзывы))