Почему бесконечная* while ложит сервер

 
Посетитель
small user social cms
МедальАвторитет форумаКубок зрительских симпатий
Сообщений: 1827
Имеется такой фрагмент кода, который ложит сервер:
Код PHP:
  1. while ($data[1] <= $id) {
  2. sleep(1);
  3. $data = unpack('I', shmop_read($memory, 0, 4));
  4. }
Функция ждет когда $data[1] станет больше чем $id чтобы выйти из цикла.

Без icms при чистом выполнении кода сервер спокойно ждет своего момента. В рамках icms сервер виснет.
Редактировалось: 1 раз (Последний: 18 ноября 2015 в 14:40)
Мой блог с плюшками
Посетитель
small user social cms
МедальАвторитет форумаКубок зрительских симпатий
Сообщений: 1827
Даже в гугляндексе не найти.
В других местах (не в icms) этот цикл работает нормально.

Php-гуру, подскажите плиз.
Мой блог с плюшками
Реклама
cms
Модератор
small user social cms
МедальПочетный донор проектаКубок зрительских симпатийАвторитет форума
Сообщений: 1422
Подождать 20 итераций, сделать вар_дамп $data, выйти
Нормальный хостинг, сервера быстрые - пользуюсь сам.
InstantCMS Team
small user social cms
МедальАвторитет форумаКубок зрительских симпатий
Сообщений: 4338
kreator, я конечно не считаю себя гуру, но в таких случаях делают отладку, выводя промежуточные значения в браузер или смотря их в консоли браузера, а если спрашивают, то рассказывают подробно что и где вы делаете. А гадать ни у кого нет желания.
Редактировалось: 1 раз (Последний: 18 ноября 2015 в 17:55)
Видео каталог для InstantCMS | Аудио каталог для InstantCMS | Мы Вконтакте | Предложение для спонсоров
Посетитель
small user social cms
МедальАвторитет форумаКубок зрительских симпатий
Сообщений: 1827
Немного начал вникать. Дело видимо не в цикле.

через js отправляю post запрос к экшену. И пока ответ не получен, другие функции не выполняются, страницы не перезагружаются, и т.д. в итоге получаем 500 т.к. не дождались.

вне icms происходит несколько по-другому. через js отправляю post, чтобы получить ответ. Далее либо получаю ответ, либо так и дождавшись ответа через 40 сек снова отправляю через этот же js новый запрос чтобы не получить ответ что превышено ожидание ответа сервера. Причем в ожидании ответа можно снова и снова делать новые запросы.

в случае с icms то после запроса либо получаю ответ, либо 500, но не могу делать новые запросы.

Пробовал использовать js и php обработчик который внешне работает норм, использовать в системе. Т.е. php ложу в корень сайта, js в компоненте - результат тот же.

Сложно конечно может объяснил.
Мой блог с плюшками
Посетитель
small user social cms
МедальКубок зрительских симпатийАвторитет форума
Сообщений: 1035
kreator:
через js отправляю post запрос к экшену. И пока ответ не получен, другие функции не выполняются, страницы не перезагружаются, и т.д. в итоге получаем 500 т.к. не дождались.
Видимо запрос выполняется не асинхронный. Попробуйте в $.post параметром указать async:true. Или я просто не понял чего вы хотите и что не получается)
Редактировалось: 1 раз (Последний: 18 ноября 2015 в 19:23)
Посетитель
small user social cms
МедальАвторитет форумаКубок зрительских симпатий
Сообщений: 1827
Вот реальный пример:

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

Открываем файл: /system/controllers/comments/action/refresh.php после строки 7 вставляем:
Код PHP:
  1. while (1 <= 2) {
  2. $n++;
  3. sleep(1);
  4. if($n==20) break;
  5. }
Теперь когда нажать на кнопку обновления комментариев пойдет запрос к refresh.php комментариев, а он даст задержку в 20 сек. А в это время попробуйте перейти на другую страницу. Пока время не пройдет не получится.

Наверное это точное воспроизведение моей задачи на примере.
Редактировалось: 1 раз (Последний: 18 ноября 2015 в 19:50)
Мой блог с плюшками
InstantCMS Team
small user social cms
МедальАвторитет форумаКубок зрительских симпатий
Сообщений: 4338
kreator:
Пока время не пройдет не получится.
так и должно быть. в рамках сессии именно так и будет.
kreator:
А в это время попробуйте перейти на другую страницу.
если нажмете стоп в браузере то перейдете.
На эту тему есть директива php - ignore_user_abort

kreator:
Далее либо получаю ответ, либо так и дождавшись ответа через 40 сек снова отправляю через этот же js новый запрос чтобы не получить ответ что превышено ожидание ответа сервера. Причем в ожидании ответа можно снова и снова делать новые запросы.
Значит запросы происходят в разных сессиях.

И вообще, в чем главный смысл сего действия?
kreator:
$data = unpack('I', shmop_read($memory, 0, 4));
не в смысле что это за конструкция, а в смысле зачем так делаете?

kreator:
Без icms при чистом выполнении кода сервер спокойно ждет своего момента. В рамках icms сервер виснет.
соединение так отвалится по таймауту в любом случае - не php, так apache. Хотите реалтайм, используйте сокеты или классический периодический опрос сервера. Или вовсе node.js
Видео каталог для InstantCMS | Аудио каталог для InstantCMS | Мы Вконтакте | Предложение для спонсоров
Посетитель
small user social cms
МедальАвторитет форумаКубок зрительских симпатий
Сообщений: 1827
Fuze:
так и должно быть. в рамках сессии именно так и будет.
вот и вопрос, ведь без icms если чистый скрипт запустить, то ничего не виснет и никто никого не ждет. это обусловлено icms?
Fuze:
если нажмете стоп в браузере то перейдете.
На эту тему есть директива php - ignore_user_abort
нет, так сразу и не перейдет. висит.
Fuze:
а в смысле зачем так делаете?
пытаюсь сократить количество запросов к БД заменив на long polling
Fuze:
соединение так отвалится по таймауту в любом случае - не php, так apache
поэтому не дожидаясь таймаута, скрипт перезапускается. (что невозможно в описанном случае) и снова ждет.
Fuze:
классический периодический опрос сервера
так что же все так производительнее на ваш взгляд? запросы каждые 3 секунды от каждого пользователя? или long polling?
Редактировалось: 1 раз (Последний: 18 ноября 2015 в 20:50)
Мой блог с плюшками
InstantCMS Team
small user social cms
МедальАвторитет форумаКубок зрительских симпатий
Сообщений: 4338
kreator:
вот и вопрос, ведь без icms если чистый скрипт запустить, то ничего не виснет и никто никого не ждет. это обусловлено icms?
а вы в своем скрипте сессию стартуете? значит работает прерывание запроса.
kreator:
нет, так сразу и не перейдет. висит.
обновите зависшую страницу, нажмите стоп и все "отвиснет". После этого перейдете по ссылкам спокойно.
kreator:
поэтому не дожидаясь таймаута, скрипт перезапускается. (что невозможно в описанном случае) и снова ждет.
выполняется новый запрос из js, а тот продолжает висеть. И, вероятно, тот предыдущий так и остается висеть, дожидаясь таймаута. Т.е.
kreator:
запросы каждые 3 секунды от каждого пользователя?
В вашем случае разницы нет имхо. Только у вас не каждые 3, а каждые 40 секунд обращения.
kreator:
так что же все так производительнее на ваш взгляд?
node.js smile

Вы не написали цель вашего действия. Реалтайм комментарии? Так нужно ставить опцию ignore_user_abort(0); и/или отслеживать клики по ссылкам и вешать обработчик (перед переходом по ссылке) типа этого:
Код JAVASCRIPT:
  1. if (window.stop !== undefined) {
  2. window.stop();
  3. } else if (document.execCommand !== undefined) {
  4. document.execCommand("Stop", false);
  5. }
Мои ответы актуальны, если я вас правильно понял joke
Редактировалось: 1 раз (Последний: 18 ноября 2015 в 21:09)
Видео каталог для InstantCMS | Аудио каталог для InstantCMS | Мы Вконтакте | Предложение для спонсоров
Посетитель
small user social cms
Медаль
Сообщений: 366
Принудительно держать открытым соединение....
Во-первых, это говорит о не верной архитектуре вашего скрипта, во-вторых - создает дополнительную и не нужную нагрузку на сервер.
В начало страницы
Предыдущая темаСледующая тема Перейти на форум:
Быстрый ответ
Чтобы писать на форуме, зарегистрируйтесь или авторизуйтесь.