Что такое код ignore_user_abort


FPublisher

Web-технологии: База знаний

Документация PHP

ignore_user_abort

ignore_user_abort — Set whether a client disconnect should abort script execution

Описание

int ignore_user_abort ([ bool $setting ] )

Sets whether a client disconnect should cause a script to be aborted.

Список параметров

If not set, the function will only return the current setting.

Возвращаемые значения

Returns the previous setting, as a boolean.

Примечания

PHP will not detect that the user has aborted the connection until an attempt is made to send information to the client. Simply using an echo statement does not guarantee that information is sent, see flush().

Смотрите также

Последние поступления:

ТехЗадание на Землю

Размещена 14 марта 2020 года

Пpоект Genesis (из коpпоpативной пеpеписки)

Шпаргалка по работе с Vim


Размещена 05 декабря 2020 года

Vim довольно мощный редактор, но работа с ним не всегда наглядна.
Например если нужно отредактировать какой-то файл например при помощи crontab, без знания специфики работы с viv никак.

Ошибка: Error: Cannot find a val >Размещена 13 сентабря 2020 года

Если возникает ошибка на centos 5 вида
YumRepo Error: All mirror URLs are not using ftp, http[s] or file.
Eg. Invalid release/

Linux Optimization

Размещена 30 июля 2012 года

Есть ли аналог ignore_user_abort[php] в C++?

Подскажите пожалуйста по сабжу, как в С++ сделать, чтобы скрипт продолжал работу при закрытии окошка?

в пхп это реализуемо с помощью

2 ответа

[QUOTE=AlexNew]Подскажите пожалуйста по сабжу, как в С++ сделать, чтобы скрипт продолжал работу при закрытии окошка?

в пхп это реализуемо с помощью

Вопрос такой расплывчатый что в голову приходят сразу несколько вариантов.
Если это программа с графическим интерфейсом то закрытие окошка (Qt), если это главное окошко, приводит к завершениию функции .exec() класса QApplication в теле функции main. Ну обрамляем тогда тело main каким нить while или for или на крайний случай goto.
Если программа имееет терминальный интерфейс. Здесь вообщем-то то же никаких сложностей. Так пишуться «демоны» — фоновые процессы работающие без вмешательства пользователя. (Тот же апач)
Общий алгоритм такой

* Отделение от родительского процесса; // fork();
* Изменение файловой маски (umask) // umask(0);
* Создание уникального ID сессии (SID) // setsid();
* Изменение текущего рабочего каталога на безопасное место // chdir(«/»);
* Закрытие стандартных файловых дескрипторов // close(STDIN_FILENO); и т.д.

Это общий шаблон. По каждому пункту приведены функции. Информацию по ним лучше смотреть в man. Описывать более подробно не стану. Если это то что нужно, то в google набирите слово демоны, с++, linux и я уверен что нибудь да найдете.

ignore_user_abort

(PHP 4, PHP 5, PHP 7)

ignore_user_abort — Установить, должно ли отключение клиента прерывать выполнение скрипта

Описание


Устанавливает, необходимо ли прерывать работу скрипта при отключении клиента.

При работе с PHP-скриптом в командной строке, когда терминал скрипта отключается без прерывания работы скрипта, скрипт будет остановлен, если параметр value не равен TRUE

Список параметров

Если параметр задан, то эта функция устанавливает ini-настройку ignore_user_abort заданным значением параметра value . Если же параметр не задан, функция вернет предыдущее значение опции без его изменения.

Возвращаемые значения

Возвращает предыдущее значение в виде целого числа.

Примеры

Пример #1 Пример использования ignore_user_abort()

// Игнорирует отключение пользователя и позволяет скрипту
// быть запущенным постоянно
ignore_user_abort ( true );
set_time_limit ( 0 );

echo ‘Тестирование обработки соединения в PHP’ ;

// Запуск бесконечного цикла,
// который будет завершен при выходе со страницы
// либо при нажатии кнопки «Stop».
while( 1 )
<
// Завершено ли соединение?
if( connection_status () != CONNECTION_NORMAL )
<
break;
>

// Пауза на 10 секунд
sleep ( 10 );
>

// Если скрипт достиг этой строки, то была
// выполнена функция ‘break’ из цикла while

// Здесь можно производить журналирование, либо
// выполнять другие необходимые операции независимо
// от браузера.
?>

Примечания

PHP не обнаружит, что пользователь прервал соединение до тех пор, пока не будет произведена попытка отправки информации клиенту. Простое использование выражения echo не гарантирует отправку информации, см. функцию flush() .

Смотрите также

  • connection_aborted() — Проверить, отключен ли клиент
  • connection_status() — Возвращает статус соединения в битах
  • См. Управление Соединением для получения более детальной информации по управлению соединениями в PHP.


Developer notes

PHP. Время работы «тяжелых» скриптов

Как долго продолжают работать «тяжелые» скрипты, если не дожидаясь окончания их работы закрыть браузер? И продолжат ли они свою работу? Как показали наблюдения, они продолжают жить пытаясь выполнить поставленную перед ними работу. Многие для управления вот такого рода временем «темной» жизни скриптов прибегают к инструкции вида

Илон Маск рекомендует:  Контейнеры html документа

Если эта инструкция вызывается с false параметром, то она равнозначна ее отсутствию. Обычно она указывается с параметром trueignore_user_abort (true). Это необходимо в случаях, когда нужно продолжить работу скрипта, даже если браузер сбросил соединение. Вообще в php имеются возможности для отслеживания состояния подключения. Меня заинтересовала ситуация с продолжением выполнения скрипта даже после закрытия окна браузера. Проверить это очень просто: напишите скриптик, который выполняется некоторое время, запустите его и недожидаясь окончания работы скрипта закройте окно браузера, не забудьте в скрипте добавить маркер завершения работы, например создать файлик. Так вы сможете отслеживать за выполняемостью вашего скриптика. Вообще после закрытия сеанса агента (браузера) скрипт должен умереть, но как вы можете убедиться, это не совсем так: он все же пытается прожить подольше. В этом случае есть смысл перенести его в фоновое выполнение (cron). Но все же интересно было проанализировать данную особенность. Для отслеживания состояния подключения используется инструкция connection_status(). Для дальнейших манипуляций были написаны свои обертки:

// return code of connect status
function getConnectStatus() <
return connection_status();
>

// return type of connect status by code
function getConnectStatusByCode($connectionStatus) <
switch ($connectionStatus) <
case CONNECTION_NORMAL:
$status = ‘Normal’;
break;
case CONNECTION_ABORTED:
$status = ‘User Abort’;
break;
case CONNECTION_TIMEOUT:

$status = ‘Max Execution Time exceeded’;
break;
case (CONNECTION_ABORTED & CONNECTION_TIMEOUT):
$status = ‘Aborted and Timed Out’;
break;
default:
$status = ‘Unknown’;
break;
>
return $status;
>

// check the connect status (true — normal, false — abnormal)
function checkConnectionStatus() <
return connection_status() === 0;
>

Теперь можно написать функцию, которая будет имитировать какую-либо долгую работу

// imitation long script
function scriptImitation() <

$limitIteration = 1000000;
for ($i = 0; checkConnectionStatus() && ($i

Собственно дальше периодически запускаем с остановами работу нашего скрипта. Как бы быстро не пытался закрыть окно агента, скрипт все также успешно отрабатывал и на выходе создавался лог. Не стоит забывать про max_execution_time, дольше этого времени скрипт точно не будет жить. В нашем случае он был увеличин. Давайте заглянем в лог:

Connect status: Normal; Iteration: 1000000; Run time: 5 second

Как видно, подключение в норме, цикл отработал до конца. Так в чем же дело? В этой статье на stackoverflow нашел вот такое решение — http://stackoverflow.com/questions/2389035/php-connection-status. И связано оно было с буфером вывода: периодически в буфер вывода скрипта дописывается небольшая порция данных (например, пустой символ) с последующим сбросом (обычно для php подразумевается принудительная отправка всего содержимого с последующей очисткой). Для этого предлагается использовать совместное использование функций ob_flush и flush. И так как для сброса подразумевается наличие подключения (ведь буфер формируется для отправки в направлении браузера — инициатора), то при очередном сбросе при отсутствии нормального подключения его статус переводится в иное состояние (User aborted). Причем если в скрипте отсутствует инструкция или приведена в виде

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

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

// check the connect status (true — normal, false — abnormal)
function checkConnectionStatus() <
print » «;
ob_flush();
flush();
return connection_status() === 0;
>

Теперь все находится под контролем, и в случаях, когда мы закроем наш браузер, работа скрипта будет приостановлена или можно будет организовать иное поведение.
На последок приведу результаты еще одного наблюдения. Если сравнить время выполнения скрипта по логам до внесения изменений и после в обертку — checkConnectionStatus,
можно сделать вывод, что сброс буфера вывода занимает продолжительное время. Так время на одну итерацию в тестовом скрипте без сброса буфера в среднем заняло — 0,005 ms, со сбросом — 0,028 ms, то есть сброс буфера в среднем заняло 0,023 ms, что в 4,6 раза больше времени одной итерации. Отсюда видно, что приведенный метод отслеживания за жизнью работы «тяжелых» скриптов может увеличивать основное время работы. Данный тест проводился на Firefox version 29.0.1. Всем успехов.

последствия для безопасности ignore_user_abort функции()


Имеет РНР ignore_user_abort() функционируют какие-либо последствия безопасности?

Я думаю, в осн. Например, при наличии функции подвергаются анонимного трафика в какой-то код, который является ресурсом дорого.

2 ответа

Возможно, для Вашего проекта будут необходимы бесплатные векторные карты. На нашем сайте представлены карты для всех стран.

Я не вижу никаких прямых последствий безопасности с ignore_user_abort() функция.

С точки зрения DoS атака, учитывая, содержащий сценарий

  • ресурс дорогой
  • подвергается воздействию анонимного трафика

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

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

  • Если содержащий сценарий используется для моделирования задачи хрон, было бы разумно использовать кронтаб вместо этого.
  • Если возможно, было бы целесообразно поставить программное ограничение на месте, чтобы запустить только один экземпляр таких ресурсов дорогого кода независимо от того, сколько страницы хитов, содержащий сценарий будет получить.
Илон Маск рекомендует:  Функции icap

Надеюсь, это какой-то помощи.

Как дополнение к предыдущему ответу я хотел бы добавить, что риск не больше, но быть немного сдвинут.

Если цель состоит в том, чтобы перегрузить сервер, вызвав дорогостоящий сценарий много раз, то ясно, что вызов ignore_user_abort(true); избавляет злоумышленника от необходимости держать соединение открытым. Сценарий будет продолжать выполнять все же в состоянии подключения и потребления ресурсов.
В отличие от без ignore_user_abort(true); скрипт закончит свое выполнение на первом выходе (если не происходит никакого вывода сценария будет как потребляя в качестве первого варианта [1]).

В случае DoS-атаке (и особенно атаки DDoS) злоумышленник скорее всего имеет абсолютно никаких проблем в открытии (и проведении открытых) много соединений. Поэтому с этой точки зрения ignore_user_abort нет никакой разницы.

Я не могу думать о каких-либо дальнейших последствиях использования этой функции, связанные с безопасностью.

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

Почему php-fpm не останавливается при отмене соединения?

Проверяю следующим скриптом


Всегда скрипт отрабатывается полностью и connection_aborted() === 0.

Пробовал в nginx играться с опцией fastcgi_ignore_client_abort.
При значении off в лог nginx попадает 499 ошибка, но скрипт все равно выполняется до конца и connection_aborted() === 0.

Как сделать, чтобы php знал отвалился клиент или нет?

Версия nginx 1.6.2
Версия php PHP/5.4.45

UPD: Проблема не в запросе, он быстрый.
Проблема в медленных клиентах с плохим интернет соединением.
Мне нужно знать, что они отказались ожидать ответа.

  • Вопрос задан более трёх лет назад
  • 649 просмотров

Заработало только при socket соединении.
Так же PHP узнает об обрыве соединения, только после отправки данных клиенту (через echo, header) и сбрасывании буфера.
Код будет следующим

Перевод агентов на крон, окончательная попытка

Перевод агентов на крон, окончательная попытка

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

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

Итак, порядок действий:

1. Из /bitrix/php_interface/dbconn.php убрать любые упоминания:

  • BX_CRONTAB
  • BX_CRONTAB_SUPPORT
  • NO_AGENT_CHECK
  • DisableEventsCheck

2. В командной PHP-строке в админке выполнить:

3. Создать файл cron_events.php, и положить его в /bitrix/php_interface/, такого содержания:

CAgent::CheckAgents() вызывается два раза специально, чтобы выполнить как периодические агенты, так и не периодические.
Если вам требуется, чтобы данный файл отвечал еще и за бекап, откомментируйте последнюю строчку.

В следующих статьях мы рассмотрим как добавлять задачу крон на исполнение данного файла в различных панелях управления.


PS: Если вам нужно перевести на крон только НЕпериодические агенты, следует воспользоваться данным курсом . Отличия в подходах довольно специфичные и в 90% случаев можно не обращать на них внимания.

Abortconnections

Вобщем так.. ситуация в кратце такова.

Скрипт должен завершеться только в обычном режиме. При завершении должен выполнять некие действия по обнавлению файла. Для этого использую set_time_limit(0) и ignore_user_abort(0) и потом в скрипте проверяю connection_aborted(). Все работает нормально, за исключение одного НО!! Если пользователь отсылает информацию, что он оборвал соединение все проходит нормально, если нет, скрипт долго весит в памяти. и потом непонятно как завершается. При этом не выполняя тей действий что должен при завершении.

Подскажите решение.. и есть люди которые столкнулись с этой проблемой?

admin

А что тебе код даст??

Ну вот например
.
set_time_limit(0);
ignore_user_abort(0);

.
while(connection_aborted()) <
echo $var;
flush();
>

.
код работающий после обрыва
.

Что-то вроде этого. Весь код нимогу показать.. ком тайна.. но по этому уже надеюсь станет понятно что к чему..

Ну так вот из-за той проблемы что я написал
«Код после обрыва» не выполняется.

Ах да.. чуть не забыл. Видно недоразвитые модеры могут написать в графе «обоснование предупреждений» «Олень». Без обид.. но вижу что форум у вас явно не для спецов.

Пока не проконстатировал что вы тут сопли жуете. ответа не дождался.. или правда глаза колит. на что интересно обида да такая? за правду?? или?? (Ваше обьяснение)

Gisma

Сам точно не описал проблему и требуешь от нас результатов? Мы не майндфакеры определять что у тебя там за месячные проблемы. + Если ты не хочешь показывать код (коммерческая тайна. ))) то не удивляйся что помочь тебе просто не смогут.
Так что дурак — ты.
Теперь по твоему коду как у тебя пользователю вообще выводится хоть что-то если у тебя этот код выполняется до аборта

.
while(connection_aborted()) <
echo $var;
flush();
>

Илон Маск рекомендует:  Что такое код getcwd

Я думаю проблема была не в дураках. А в соединениях. Но если ктото понял что тема была о дураках, то я думаю это проблема того человека.
Это рас..

Во вторых, я прошу обьяснить мое предупреждение.


В третьих..
Чтоб понять почему не заводится машина я думаю что сиденья показывать не надо.. хватит только двигателя. Или вы другого мнения.. ?? Я двигатель предоставил!! Или вам интересны сидения??

Самую проблему я предоставил.. описал в чем проблема. Привел пример проблемного участка кода.. что еще нужно??

Рад что ты удилил внимание моей проблеме. Но так и не понял ссылку.. Зачем мне документация по функциям работающими с функциями.. у меня проблема менеджмента соединений.. Документацию по ней я всю прочитал. По каждой используемой функции и их аналогов. Но там этот глюк не описан. Поэтому и обратился сюда. а здесь все свели к «дуракам» да к предупреждениям..

Может в проблеме разберемся.. или Вам нравится флуд типа «какой движек для сайта лучше» или «как организовать закачку файлов».

Жду вразумительного ответа.

зы. Требую снять предупреждение или его обосновать. «ОЛЕНЬ» и всякие другие подписи прошу не постить в мой список предупреждений. И групку прошу изменить.

Последствия использования функции ignore_user_abort() — security

Имеет ли функция ignore_user_abort() PHP какие- либо последствия для безопасности?

Я думаю в DoS. Например, при наличии функции, подверженной анонимному трафику в некотором коде, ресурсе дорогостоящем.

    2 2
  • 25 июл 2020 2020-07-25 08:13:19
  • Pere

2 ответа

Я не вижу никаких прямых последствий для безопасности с помощью функции ignore_user_abort().

Что касается DoS- атаки, считая, что содержащий скрипт

  • ресурс дорогой
  • подвергается анонимному трафику


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

Если возможно, было бы разумно найти альтернативы для такого дорогостоящего кода ресурса:

  • Если содержащийся сценарий используется для имитации задачи cron, было бы разумно использовать crontab.
  • Если возможно, было бы разумно использовать программные ограничения для запуска только одного экземпляра такого ресурса дорогостоящего кода, независимо от того, сколько страниц пострадает от содержащего скрипта.

Надеюсь, это поможет.

  • 25 июл 2020 2020-07-25 08:13:20
  • Uours

В дополнение к предыдущему ответу я хотел бы добавить, что риск не больше, но немного смещается.

Если целью является перегрузка сервера, вызывая дорогостоящий скрипт много раз, ясно, что вызов ignore_user_abort(true); освобождает злоумышленника от необходимости держать соединение открытым. Скрипт будет продолжать выполнять, тем не менее, статус соединения и потреблять ресурсы.
Напротив, без ignore_user_abort(true); сценарий завершит выполнение на первом выходе (если не будет выхода, сценарий будет таким же потребляющим, как и первый вариант [ 1 ]).

В случае атаки DoS (и особенно атаки DDoS) у атакующего, вероятно, нет абсолютно никакой проблемы при открытии (и открытом) многих подключений. Поэтому с этой точки зрения ignore_user_abort не имеет значения.

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

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

Последствия использования функции ignore_user_abort()

Имеет ли функция ignore_user_abort() PHP какие- либо последствия для безопасности?

Я думаю в DoS. Например, при наличии функции, подверженной анонимному трафику в некотором коде, ресурсе дорогостоящем.

В дополнение к предыдущему ответу я хотел бы добавить, что риск не больше, но немного смещается.

Если целью является перегрузка сервера, вызывая дорогостоящий скрипт много раз, ясно, что вызов ignore_user_abort(true); освобождает злоумышленника от необходимости держать соединение открытым. Скрипт будет продолжать выполнять, тем не менее, статус соединения и потреблять ресурсы. Напротив, без ignore_user_abort(true); сценарий завершит выполнение на первом выходе (если не будет выхода, сценарий будет таким же потребляющим, как и первый вариант [ 1 ]).

В случае атаки DoS (и особенно атаки DDoS) у атакующего, вероятно, нет абсолютно никакой проблемы при открытии (и открытом) многих подключений. Поэтому с этой точки зрения ignore_user_abort не имеет значения.

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

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

Я не вижу никаких прямых последствий для безопасности с помощью функции ignore_user_abort().

Что касается DoS- атаки, считая, что содержащий скрипт

  • ресурс дорогой
  • подвергается анонимному трафику

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

Если возможно, было бы разумно найти альтернативы для такого дорогостоящего кода ресурса:

  • Если содержащийся сценарий используется для имитации задачи cron, было бы разумно использовать crontab.
  • Если возможно, было бы разумно использовать программные ограничения для запуска только одного экземпляра такого ресурса дорогостоящего кода, независимо от того, сколько страниц пострадает от содержащего скрипта.
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL