Php sleep грузит процессор
Но, похоже, это останавливает весь мой сайт в течение 45 секунд, потому что это находится в файле index.php, как и в случае с другим кодом на моем сайте.
В любом случае я могу изолировать этот бит кода, поэтому он только делает функцию
подождите 45 секунд?
Solutions Collecting From Web of "Как я могу остановить PHP sleep (), влияющий на весь мой PHP-код?"
В PHP нет (в основном) многопоточности. Вы можете сделать это с помощью процессов forking в Unix-системах, но это не имеет значения, потому что многопоточность – это не то, что вам нужно. Вам просто нужна простая логика:
В основном только давать точки, если приращение между последним, когда вы давали очки, больше 45 секунд.
Это сеанс блокирует ваш скрипт. а не «Нет многопоточности в PHP». session_write_close () до того, как sleep () решит блокировать весь ваш скрипт. но может не соответствовать вашей проблеме.
поэтому вам нужно было сохранить бонус, используя настройку js и AJAX.
Обратите внимание, что sleep () задерживает выполнение для текущего сеанса, а не только скрипта. Рассмотрим следующий пример, когда два компьютера вызывают один и тот же сценарий из браузера, который не делает ничего, кроме сна.
Нет, не напрямую. Вам нужно использовать другой подход, например, вспомнить временную метку последнего посещения и добавлять только точки, если с этого времени прошло достаточное количество времени.
В PHP нет многопоточности, поэтому sleep() всегда будет блокировать весь ваш скрипт.
Способ, которым вы должны решить это, – записать время последней игры и только награждать очки, если это больше, чем на 45 секунд позже.
Имейте в виду, что пользователи могут по-прежнему злоупотреблять этим, если отключить файлы cookie (таким образом, у них не будет данных сеанса). Поэтому, если это вас действительно беспокоит, убедитесь, что у них есть файлы cookie, прежде чем разрешить им использовать эту функцию (возможно, есть несколько вопросов, которые охватывают это).
Вместо того, чтобы блокировать скрипт, сохраните текущее время в сеансе, не добавляйте баллы и не отпустите страницу. Затем на более поздних просмотрах страниц, если вы видите, что время сохранения в сеансе старше 45 секунд, добавьте точки, сохраните их там, где вам нужно, и очистите время.
Вы не можете, но вы можете сделать этот код javascript одним и сохранить бонус с помощью AJAX.
У меня есть команда" создать веб-сайт", которая анализирует все таблицы, чтобы переиздать весь веб-сайт на фиксированные html-страницы. Это тяжелый процесс, по крайней мере, на моей локальной машине (процессор поднимается). На рабочем сервере это не представляется проблемой, но я хотел бы сохранить его на будущее. Поэтому я рассматриваю возможность использования функции php sleep () между каждым шагом тяжелого скрипта, чтобы у сервера было время "отдышаться" между тяжелым лестница.
Это хорошая идея или это будет бесполезно?
Если вы используете php5, и он используется в режиме CGI (а не mod_php), то вы можете рассмотреть возможность использования .
это может позволить команде "создать веб-сайт" использовать столько CPU, сколько она хочет, пока никто другой не пытается использовать сайт.
Я бы просто не сделал этого на производственном сервере, шаги, которые я следовал раньше:
арендуйте недорогой сервер PHP - или получите правильную настройку сервера Dev, которая реплицирует производство
все динамические файлы копируются в DEV - они даже не должны быть на производстве
запустите скрипт HTMLizer - нет сна, просто сожгите его
Проверьте вывод, а затем RSYNC это живой сервер-резервное копирование живой каталог, как вы это делаете, так что вы можете безопасно отступить
в любом случае, так как кэширование / Memcaching пришло к скорости, я не должен был делать это вообще - используйте Zend Framework и Zend Cache, и у вас в основном есть динамический эквивалент того, что вам нужно сделать автоматически.
Я думаю, что это хорошая идея. Сон означает repititive сравнение клещей пока не произойдет период. Накладные расходы на CPU при спящей операции должны быть ниже.
Это зависит от того, сколько раз вы будете называть его и как долго. Вам нужно будет сбалансировать вашу потребность в быстром выходе против низкого использования процессора.
короче: да, это поможет.
исходя из задачи, я не думаю, что это поможет вам.
Sleep будет действительно полезен, только если вы постоянно зацикливаетесь и ждете пользовательского ввода или триггерного сигнала.
в этом случае, чтобы выполнить работу как можно скорее, вы можете также опустить команду сна, тем самым уменьшая время выполнения задачи и освобождая время процессора быстрее для других процессов.
некоторые из плакатов выше, могут быть в состоянии, чтобы лучше помочь вам с оптимизацией кода.
У меня есть команда «создать веб-сайт», которая анализирует все таблицы, чтобы переиздать весь веб-сайт в фиксированные HTML-страницы. Это тяжелый процесс, по крайней мере, на моем локальном компьютере (поднимается процессор). На рабочем сервере это пока не кажется проблемой, но я хотел бы сохранить ее в будущем. Поэтому я рассматриваю возможность использования функции php sleep () между каждым шагом тяжелого скрипта, чтобы у сервера было время «отдышаться» между тяжелыми шагами.
Это хорошая идея или будет бесполезно?
задан 18 марта '09, 15:03
5 ответы
Если вы используете php5 и он используется в режиме CGI (а не mod_php), вы можете рассмотреть возможность использования proc_nice .
Это может позволить команде «создать веб-сайт» использовать столько ЦП, сколько она хочет, в то время как никто другой не пытается использовать сайт.
ответ дан 18 мар '09, в 17:03
Я бы просто не делал этого на производственном сервере, шаги, которые я выполнил ранее:
Арендуйте недорогой PHP-сервер - или получите правильную настройку Dev-сервера, которая воспроизводит производственную
Все динамические файлы копируются в DEV - они даже не должны быть в продакшене.
Запустите сценарий HTMLizer - не спите, просто сожгите его
Подтвердите вывод, а затем RSYNC это к живому серверу - резервное копирование живого каталога по мере того, как вы это делаете, чтобы вы могли безопасно вернуться
В любом случае, с тех пор, как кэширование / кэширование памяти стало быстрым, мне вообще не приходилось этого делать - используйте Zend Framework и Zend Cache, и у вас в основном есть динамический эквивалент того, что вам нужно делать автоматически.
ответ дан 18 мар '09, в 18:03
Предлагаемый вами метод звучит хорошо. хотите подробнее рассказать о RSYNC? насчет дзен: я могу ошибаться (я не знаю дзен), но я не могу использовать кеш zend, потому что я загружаю эти сгенерированные фрагменты html через ajax через фиксированное имя файла html. Поэтому мне нужно контролировать точное положение и имя файла HTML-файлов. - пикселина
RSYNC samba.anu.edu.au/rsync rsync - это утилита с открытым исходным кодом, которая обеспечивает быструю инкрементную передачу файлов. Zend - это PHP Framework, но существует множество классов кэширования, то есть в PEAR. - Ян Уорнер
Думаю, это хорошая идея. Сон означает повторяющееся сравнение тиков до наступления менструации. Накладные расходы на ЦП в спящем режиме должны быть ниже.
Будет ли данный код грузить сервер?
Может таких конструкций вообще избегать?
Суть вот в чем.
Есть страница, на этой странице производится большое количество расчетов и запросов. Пользователь будет обращаться к этой странице пару раз за сеанс.
Необходимо сделать так, чтоб пользователь ждал 5 секунд перед тем, как начнутся все эти расчеты.(так сказать защита от досса)
_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.
Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.
Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.
А подробнее? Почему не будет, если все пользователи запустят одновременно ожидание, как оно работает?
Цитата (Razzwan @ 15.09.2015 - 21:54) |
Почему не будет, если все пользователи запустят одновременно ожидание, как оно работает? |
пхп скажет с++ что надо ждать 100 секунд, с++ отправит процессору гонять холостой цикл 100 секунд, вот и вся нагрузка.
Хотя я противник всяческих слипов.
На мой взгляд правильнее было бы из яваскрипта SetInterval - ом отправлять запрос на сервер. Если готово, то выводить результат. Сервер же проверяет время последнего запроса, чтобы не ддосили почем не зря
От ДДОСа таким способом не защититься. Если это настоящий ДДОС. Если нужно увеличить время исполнения - вполне годится. Эта функция даже циклов никаких не запускает, просто приостонавливает процесс на определенное количество тактов. Которые кстати даже не учитываются таймлимитом.
Однако AllesKlar прав, делать задержку предпочтительнее на клиенте.
_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.
Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.
Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.
Цитата (123456 @ 15.09.2015 - 19:12) |
Будет ли данный код грузить сервер? |
Ну на самом деле немного будет. Потому что под каждый такой процесс будет отведена память. На всё время, пока ждёт. И если запросов будет слишком много, то они забьют всю память и новые запросы не будут проходить. Так что не стОит так делать.
* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.
* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)
хе хе еще как будет)))
еще не забываем про друга сессию и раз это некая система то они там будут))
вот попробуй
создай 2 файла в обоих session_start() в одном sleep(1000) в другом echo 1;
запускаешь первый со sleep в браузере, во втором окне второй и радуешься тому что пока первый не закончит, второй не начнет)))
а как решать сам подумай)) подсказка атомарные операции с файлами
сервер грузить не будет. а вот веб-сервер, у которого кол-во одновременных коннектов может равняться 10. сделает не доступным ваш сайт тем людям, которые не вошли в первую десятку.
Удивили ответы профессионалов. Такие разные.
Цитата (depp @ 16.09.2015 - 12:02) |
сервер грузить не будет. а вот веб-сервер |
А чем, позвольте спросить, первый сервер отличается от второго?
Цитата (Razzwan @ 16.09.2015 - 10:22) |
А чем, позвольте спросить, первый сервер отличается от второго |
Сервером обычно называют железо и ПО, обеспечивающее работу сайта. Включая базы данных, серверные языки и так далее. Сюда же кстати относятся программы антиддоса. Веб-сервер, это программа, обеспечивающая связь сервера с "внешним миром". В частности Apache, Nginx и им подобные.
sleep() сервер не грузит, ибо замораживает процесс. Соответственно использование CPU (ресурс) не слишком то и вырастет. Может подожрать память, как Сергей говорит, но это от реализации зависит.
DDOS направлен на превышение возможностей именно веб-вервера. Если он справляется - на базу данных. И тут совершенно никакой разницы, есть sleep() или нет. Тут все зависит от трафика. Если трафик большой (много запросов секунду), то до PHP дело может и вовсе не дойти. Скурвится тот же аппач. Так что бороться с DDOS програмными методами - что мертвому припарка. Это решается на уровне железа.
_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.
Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.
Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.
Razzwan
тут важно понимать, что на самом деле делает sleep(). Многозадачный процессор должен выполнять множество программ одновременно, поскольку CPU (одно ядро) может выполнять в один момент времени только какую то одну, многозадачность реализуется распределнием рабочего времени между процессами, разбивая его на тайм слоты. В зависимости от приоритета длительость и количесво таймслотов у каждого процесса может быть различно. Всем этим хозяйством управляет ядро операционной системы. Кодга ты вызываешь sleep, интерпретатор сообщает ОС в течении n-го времни его не беспокоить, соответсвенно ОС в это время не выделяеет данному процессу ни одного таймслота. Ресурсы процессора при этом не расходуются, но процесс продолжает сидеть в ОЗУ, соотвенно на загруку памяти оно ни как ни влияет, ни в плюс, ни в минус, она загружен так же, как и без спячки. Если это консольный скрипт, то он работает каждый в своем процессе, и он особо ни на что ни влияет (хоть и пользы от этого то же нет), если скрипт работает в контексте модуля апача, то если используется mpm_prefork для обработки каждого tcp запроса запущен отдельный форк процесса, их число ограничено, вызывая в них sleep ты подвешиваешь подпроцесс на длительное время, в течении которого он мог бы обслуживать другие запросы. Выводы как бы очевидны
Про DDOS я образно написал, упоминая про SetInterval, дабы особо нетерпеливые юзеры не долбили 10 раз в секунду сервер, пока тот вычисляет, а если и долбят, то чтобы сервер посмотрел, прошло ли положенных 100 секунд, прежде чем дальше шевелиться.
Цитата (bestxp @ 16.09.2015 - 07:10) |
создай 2 файла в обоих session_start() в одном sleep(1000) в другом echo 1; запускаешь первый со sleep в браузере, во втором окне второй и радуешься тому что пока первый не закончит, второй не начнет))) |
А причем тут сервер? Сделай тоже самое не в разных окнах, а в разных браузерах.
_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.
Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.
Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.
Всем привет.
Создаю приложение по отправки email рассылки для сайта подписчикам.
Загружаю, к примеру 100 адресов, и после каждой отправки письма делаю sleep(1). Сам скрипт запускается через ajax. Я в него передаю id рассылки и там уже идет рассылка.
И на эти 100 секунд тормозится работа приложения. То есть остальные вкладки подвисают на время рассылки, как это избежать?
Вангую, что у вас блокировка сессии висит. В этом случае поможет session_write_close перед циклом с отправкой.
Но выше правильно заметили, что такую фигню лучше вешать на cron.
Кирилл Горелов: Если вам дальше не нужно изменять данные сессии, то не вредно. Читать можно будет и после вызова.
тормозит только у вас в браузере т.к. висит "процесс загрузки" вашего сайта, другие табы не открываются в это время.
С чем это связано не гуглил и почему, но так работает хром по крайней мере.
зайдите с другого браузера там все откроется.
Александр Аксентьев, а как можно сделать, что бы письма рассылались с определенной скоростью. Я ничего кроме как sleep не знаю даже?
И как сделать, что бы сайт не зависал?
ОТправляю письма через цикл while.
Кирилл Горелов: просто по крону пачками без слипов. Т.е. раз в 5 минут отправлять 100 писем или типо того.
Александр Аксентьев: мне подсказали использовать session_write_close(). Помогло)
Это не "вредно", использовать так?
Кирилл Горелов: из браузера такое не надо запускать вообще.
не вредно, если с сессией потом в коде работы нет.
Александр Аксентьев: у меня сама рассылка запускается на другом файле, в который передаю через ajax один параметр. И все. туда никто не попадает на эту страницу. Если я вас правильно понял!
Кирилл Горелов: вопрос не в этом. А в том чтоб запустить рассылку и расслабиться, а не сидеть с открытой вкладкой.
А еще например можно рассылать при помощи postfix с ограниченной очередью или использовать спец.сервисы рассылок
Читайте также: