connection_aborted — Возвращает TRUE, если клиент отсоединён


connection_aborted

(PHP 4, PHP 5, PHP 7)

connection_aborted — Проверить, отключен ли клиент

Описание

Проверяет, отключен ли клиент.

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

Возвращает 1, если клиент отключен, 0 в противном случае.

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

  • connection_status() — Возвращает статус соединения в битах
  • ignore_user_abort() — Установить, должно ли отключение клиента прерывать выполнение скрипта
  • См. Управление подключениями для получения полного описания управления подключениями в PHP.

Работа с соединениями

Замечание: Вся последующая информация применима к версиям 3.0.7 и выше.

Статус соединения сохраняется внутренними механизмами PHP. Ниже перечислены три возможные состояния:


Во время штатного выполнения PHP-скрипта установлен статус NORMAL. В случае, если удаленный клиент разорвал соединение, статус изменяется на ABORTED. Чаще всего отсоединение удаленного клиента происходит при нажатии кнопки «Stop» в браузере. В случае, если достигается установленный временной лимит (ознакомьтесь с функцией set_time_limit()), будет установлен статус TIMEOUT.

Вы можете решать, приводит ли отключение клиента к завершению вашего скрипта. Иногда бывает необходимо, чтобы скрипт выполнился до конца, даже если отсутствует удаленный браузер, которому адресован весь вывод. По умолчанию скрипт завершает свою работу при отключении клиента. Это поведение может быть изменено при помощи опции ignore_user_abort в конфигурационном файле php.ini . Такого же результата можно добиться, указав «php_value ignore_user_abort» в конфигурационном файле Apache или воспользовавшись функцией ignore_user_abort(). Если вы явно не указали на необходимость игнорировать разрыв соединения с клиентом, выполнение скрипта будет прервано. Исключением является тот случай, если используя register_shutdown_function(), вы указали специальную функцию, вызываемую при завершении скрипта. В таком случае после того, как пользователь нажал кнопку «Stop» в своем браузере, при первой же попытке что-либо вывести PHP обнаруживает, что соединение с клиентом было утеряно, и вызывает завершающую функцию. Эта функция также вызывается при нормальном завершении работы вашего скрипта, поэтому для того, чтобы выполнить некоторые специфические действия при отсоединении клиента, вам понадобится функция connection_aborted(), которая возвращает TRUE, если соединение было разорвано.

Выполнение вашего скрипта также может быть прервано встроенным таймером. Стандартное ограничение по времени составляет 30 секунд, изменить его можно при помощи директивы max_execution_time в конфигурационном файле php.ini . Такого же результата можно достичь, добавив php_value max_execution_time в конфигурационный файл Apache или воспользовавщись функцией set_time_limit(). При достижении скриптом временного лимита выполнение скрипта прерывается и вызывается завершающая функция, если она была указана. Уточнить причину завершения скрипта вы можете при помощи функции connection_timeout(), которая возвращает TRUE, если скрипт был прерван по достижению временного ограничения.

Единственное, что следует заметить — что оба статуса: ABORTED и TIMEOUT,- могут быть установлены одновременно. Это может произойти в том случае, если вы явно указали необходимость игнорировать отсоединение удаленного клиента. В таком случае после разрыва соединения, отметив этот факт, PHP продолжит выполнение скрипта, и при достижении временного лимита будет вызвана завершающая функция, если таковая была указана. В этой точке вы можете обнаружить, что и connection_timeout(), и connection_aborted() возвращают TRUE. Вы также можете проверить оба статуса одновременно, вызвав функцию connection_status(), которая возвращает битовые значения для активных статусов. В случае, если оба статуса активны, она, к примеру, вернет значение 3.

FPublisher

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

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

Работа с соединениями

Замечание: Вся последующая информация применима к версиям 3.0.7 и выше.

Статус соединения сохраняется внутренними механизмами PHP. Ниже перечислены три возможные состояния:

  • 0 — NORMAL
  • 1 — ABORTED
  • 2 — TIMEOUT

Во время штатного выполнения PHP-скрипта установлен статус NORMAL. В случае, если удаленный клиент разорвал соединение, статус изменяется на ABORTED. Чаще всего отсоединение удаленного клиента происходит при нажатии кнопки «Stop» в браузере. В случае, если достигается установленный временной лимит (ознакомьтесь с функцией set_time_limit()), будет установлен статус TIMEOUT.

Вы можете решать, приводит ли отключение клиента к завершению вашего скрипта. Иногда бывает необходимо, чтобы скрипт выполнился до конца, даже если отсутствует удаленный браузер, которому адресован весь вывод. По умолчанию скрипт завершает свою работу при отключении клиента. Это поведение может быть изменено при помощи опции ignore_user_abort в конфигурационном файле php.ini . Такого же результата можно добиться, указав «php_value ignore_user_abort» в конфигурационном файле Apache или воспользовавшись функцией ignore_user_abort(). Если вы явно не указали на необходимость игнорировать разрыв соединения с клиентом, выполнение скрипта будет прервано. Исключением является тот случай, если используя register_shutdown_function(), вы указали специальную функцию, вызываемую при завершении скрипта. В таком случае после того, как пользователь нажал кнопку «Stop» в своем браузере, при первой же попытке что-либо вывести PHP обнаруживает, что соединение с клиентом было утеряно, и вызывает завершающую функцию. Эта функция также вызывается при нормальном завершении работы вашего скрипта, поэтому для того, чтобы выполнить некоторые специфические действия при отсоединении клиента, вам понадобится функция connection_aborted(), которая возвращает TRUE, если соединение было разорвано.


Выполнение вашего скрипта также может быть прервано встроенным таймером. Стандартное ограничение по времени составляет 30 секунд, изменить его можно при помощи директивы max_execution_time в конфигурационном файле php.ini . Такого же результата можно достичь, добавив php_value max_execution_time в конфигурационный файл Apache или воспользовавщись функцией set_time_limit(). При достижении скриптом временного лимита выполнение скрипта прерывается и вызывается завершающая функция, если она была указана. Уточнить причину завершения скрипта вы можете при помощи функции connection_timeout(), которая возвращает TRUE, если скрипт был прерван по достижению временного ограничения.

Илон Маск рекомендует:  Моделирование при сжатии текстовых данных моделирование и энтропия

Единственное, что следует заметить — что оба статуса: ABORTED и TIMEOUT,- могут быть установлены одновременно. Это может произойти в том случае, если вы явно указали необходимость игнорировать отсоединение удаленного клиента. В таком случае после разрыва соединения, отметив этот факт, PHP продолжит выполнение скрипта, и при достижении временного лимита будет вызвана завершающая функция, если таковая была указана. В этой точке вы можете обнаружить, что и connection_timeout(), и connection_aborted() возвращают TRUE. Вы также можете проверить оба статуса одновременно, вызвав функцию connection_status(), которая возвращает битовые значения для активных статусов. В случае, если оба статуса активны, она, к примеру, вернет значение 3.

TcpClient.Connected возвращает true, но клиент не подключен, что я могу использовать вместо этого? — c#

В VB.net я использую TcpClient для извлечения строки данных. Я постоянно проверяю свойство .Connected, чтобы проверить, подключен ли клиент, но даже если клиент отключается, он все равно возвращает true. Что я могу использовать в качестве обходного пути для этого?

Это урезанная версия моего текущего кода:

Я бы предположил, что хотя бы вызов GetStream() вызовет исключение, если клиент был отключен, но я закрыл другое приложение, и оно все еще не.

ИЗМЕНИТЬ Опрос клиента. Предположительно, но это не решило проблему. Если клиент не имеет доступ к «acutally», он просто возвращает 0.

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

    1 4
  • 2 ноя 2020 2020-11-02 09:42:13
  • Dilbert789

4 ответа

Вместо опроса client.connected возможно использование свойств NetworkStream, чтобы увидеть, нет ли доступных данных?

Во всяком случае, есть ONDotnet.com статья с TONS информации о слушателях и еще много чего. Если вы поможете вам преодолеть проблему.

  • 2 ноя 2020 2020-11-02 09:42:15
  • Kevin Fairchild

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

Dim TC As New TimerCallback (AddressOf Ping)

connection_aborted () не работает на Ajax звонки

РЕДАКТИРОВАНИЕ

У меня есть вызов AJAX ( с помощью $.ajax() ) , который вызывает следующий скрипт.


Это идет в течение 40 секунд.

Если закрыть окно браузера , который инициировал вызов, connection_aborted() все еще возвращает ложь, даже если я послал явно строку и продувают буфер!

Кто-нибудь есть ответ здесь, пожалуйста?

Вам нужно будет добавить «ignore_user_abort (истинный);» на вершине PHP скрипт, и называть «ob_flush ()» после того, как эхо — то из сценария (для почему см PHP флеш) человек страницы ( ). Работа примера (доказательство концепции):

PS connection_status () возвращает 0, если соединение по-прежнему активен, а в случае замкнутого одного возвращает 1.

РЕДАКТИРОВАТЬ:

Виноват. Вызов и флеш () и ob_flush () (пожалуйста , прочитайте Flush () человека страницу, указанную выше ссылку, и ответы от этой темы ), или в противном случае не может работать, в зависимости от конфигурации сервера / PHP. Следующий код был протестирован на WAMP с PHP 5.3.8 (работает без вызова на одном уровне ()), а теперь на Ubuntu с PHP 5.3.10. где вровень () вызов , прежде чем ob_flush () необходимо.

The script encountered an error and will be aborted. Не пойму что тут случилось.

Цитата
Владислав Боев написал:
Подождите, каким образом работа БД из консоли касается битрикса?

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

Блин да что такое то! Запустили новую вирт.машину, восттановили из последнего бекапа (потеряли 2х недельную работу из за сбоя с базой). В общем поработал портал 2 дня. теперь в админку не могу попасть! При нажатии кнопки Администрирование из самого сайта который норм работает, открывается страница с верхними кнопками (Сайт, администрирование. ) и все остальное серое (фон). Я не пойму 1С за что такие деньги просит? если нифига не работает.

Может кто помочь разобраться с этим приколом?

Василий, можно несколько глупых вопросов?
0. Пробовали не в корень админки попадать, а куда нить на страницу настроек модулей или в статистику?
1. Какой браузер?
2. Опишите виртуальную машину, это образ виртуалки от битрикса или сами на xen или virtualbox и аналогах создаете с нуля?
3. Из бекапа вы что восстановили? Просто через скрипт сайт подняли?
4. У вас есть данные в бд? Я имею виду наполнение сайта?
5. Смотрели консоль браузера? Лог ошибок php, сервера, mysql?
6. И совсем глупый вопрос-вариант — проверяли на вирусы?

Я понимаю, мы тут не глупые люди, но вдруг не мне так вам или еще кому то что то покажется странным в ваших ответах и найдется ответ.


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

Цитата
Владислав Боев написал:
Василий, можно несколько глупых вопросов?
0. Пробовали не в корень админки попадать, а куда нить на страницу настроек модулей или в статистику?
1. Какой браузер?
2. Опишите виртуальную машину, это образ виртуалки от битрикса или сами на xen или virtualbox и аналогах создаете с нуля?
3. Из бекапа вы что восстановили? Просто через скрипт сайт подняли?
4. У вас есть данные в бд? Я имею виду наполнение сайта?
5. Смотрели консоль браузера? Лог ошибок php, сервера, mysql?
6. И совсем глупый вопрос-вариант — проверяли на вирусы?

Я понимаю, мы тут не глупые люди, но вдруг не мне так вам или еще кому то что то покажется странным в ваших ответах и найдется ответ.

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

0. пробовал, реакция такая я же
1. пробовал хром, нема, чистил кэш, нема, фаерфокс, тоже самое.
2. штатный образ от 1с, на virtualbox
3. на новой машине запустили штатный образ, только вместо установки указали на восстановление и ткнули на бэкап, восстановился и работал
4. сайт работает, задачи, сообщения, вроде весь функционал. (при еще работающей админки, делала проверку сайта, показал на ошибки в базе что нет полей, нет таблиц, все по нулям. не обратил на это особого внимания т.к. как так то если сайт робит.)
5. в консоли все гуд, ошибок нет, пробовали ребутнуть, все стартует без ошибок.
6. кого? серв? или сам сайт? сайт уже нет возможности, а серв в норме он в инет не смотрит.

Цитата
Владислав Боев написал:
Тогда еще один глупый вариант, пробовали вместо virtualbox wmware использовать? Я понимаю что они не должны отличаться, но тем не менее.
В принципе любые ошибки могут быть причиной. Попробуйте сравнить кодировки БД кодировки таблиц и настройки самого битрикса. Может попробовать исправить таблицы в которых есть проблемы?

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

Добрый день!
Столкнулся с такой же проблемой при разворачивании резервной копии на новом сервере.
Предыдущая ВМ 4.3, новая — 7.0
Пароли совпадают, вернее отсутствуют, лог выдает вот такие ошибки:

[Error] Call to undefined function Bitrix\Main\DB\mysql_connect() (0)
/home/bitrix/www/bitrix/modules/main/lib/db/mysqlconnection.php:45
#0: Bitrix\Main\DB\MysqlConnection->connectInternal()
/home/bitrix/www/bitrix/modules/main/lib/db/mysqlconnection.php:103
#1: Bitrix\Main\DB\MysqlConnection->queryInternal(string, array, NULL)
/home/bitrix/www/bitrix/modules/main/lib/db/connection.php:329
#2: Bitrix\Main\DB\Connection->query(string)
/home/bitrix/www/bitrix/modules/main/lib/config/option.php:182
#3: Bitrix\Main\Config\Option::load(string, NULL)
/home/bitrix/www/bitrix/modules/main/lib/config/option.php:53
#4: Bitrix\Main\Config\Option::get(string, string, string)
/home/bitrix/www/bitrix/modules/main/lib/httprequest.php:337
#5: Bitrix\Main\HttpRequest->prepareCookie(array)
/home/bitrix/www/bitrix/modules/main/lib/httprequest.php:63
#6: Bitrix\Main\HttpRequest->__construct(object, array, array, array, array)
/home/bitrix/www/bitrix/modules/main/lib/httpapplication.php:42
#7: Bitrix\Main\HttpApplication->initializeContext(array)
/home/bitrix/www/bitrix/modules/main/lib/application.php:122
#8: Bitrix\Main\Application->initializeExtendedKernel(array)
/home/bitrix/www/bitrix/modules/main/include.php:23
#9: require_once(string)
/home/bitrix/www/bitrix/modules/main/include/prolog_before.php:14
#10: require_once(string)
/home/bitrix/www/bitrix/modules/main/include/prolog.php:10
#11: require_once(string)
/home/bitrix/www/bitrix/header.php:1
#12: require(string)
/home/bitrix/www/index.php:2

Подскажите куда копать?

Олег Симуков, та же проблема поставил на 7.0 и все. Белый екран и надпись. The script encountered an error and will be aborted. To view extended error messages, enable this feature in .settings.php . Прочитал все коментарии по теме, решения не нашел. Файлы .settings.php и dbconn.php по данным совпадают. Что делать ума не приложу Может кто то решил проблему, подскажите актуально по сей день.

[Error] Call to undefined function Bitrix\Main\DB\mysql_connect() (0)
/home/bitrix/www/bitrix/modules/main/lib/db/mysqlconnection.php:45
#0: Bitrix\Main\DB\MysqlConnection->connectInternal()
/home/bitrix/www/bitrix/modules/main/lib/db/mysqlconnection.php:103
#1: Bitrix\Main\DB\MysqlConnection->queryInternal(string, array, NULL)
/home/bitrix/www/bitrix/modules/main/lib/db/connection.php:329
#2: Bitrix\Main\DB\Connection->query(string)
/home/bitrix/www/bitrix/modules/main/lib/config/option.php:182
#3: Bitrix\Main\Config\Option::load(string, NULL)
/home/bitrix/www/bitrix/modules/main/lib/config/option.php:53
#4: Bitrix\Main\Config\Option::get(string, string, string)
/home/bitrix/www/bitrix/modules/main/lib/httprequest.php:337
#5: Bitrix\Main\HttpRequest->prepareCookie(array)
/home/bitrix/www/bitrix/modules/main/lib/httprequest.php:63
#6: Bitrix\Main\HttpRequest->__construct(object, array, array, array, array)
/home/bitrix/www/bitrix/modules/main/lib/httpapplication.php:42
#7: Bitrix\Main\HttpApplication->initializeContext(array)
/home/bitrix/www/bitrix/modules/main/lib/application.php:122
#8: Bitrix\Main\Application->initializeExtendedKernel(array)
/home/bitrix/www/bitrix/modules/main/include.php:23
#9: require_once(string)
/home/bitrix/www/bitrix/modules/main/include/prolog_before.php:14
#10: require_once(string)
/home/bitrix/www/bitrix/modules/main/include/prolog.php:10
#11: require_once(string)
/home/bitrix/www/bitrix/header.php:1
#12: require(string)
/home/bitrix/www/index.php:2

Цитата
Боря Селезньов написал:
Олег Симуков , та же проблема поставил на 7.0 и все. Белый екран и надпись. The script encountered an error and will be aborted. To view extended error messages, enable this feature in .settings.php . Прочитал все коментарии по теме, решения не нашел. Файлы .settings.php и dbconn.php по данным совпадают. Что делать ума не приложу Может кто то решил проблему, подскажите актуально по сей день.

[Error] Call to undefined function Bitrix\Main\DB\mysql_connect() (0)
/home/bitrix/www/bitrix/modules/main/lib/db/mysqlconnection.php:45
#0: Bitrix\Main\DB\MysqlConnection->connectInternal()
/home/bitrix/www/bitrix/modules/main/lib/db/mysqlconnection.php:103
#1: Bitrix\Main\DB\MysqlConnection->queryInternal(string, array, NULL)
/home/bitrix/www/bitrix/modules/main/lib/db/connection.php:329
#2: Bitrix\Main\DB\Connection->query(string)
/home/bitrix/www/bitrix/modules/main/lib/config/option.php:182
#3: Bitrix\Main\Config\Option::load(string, NULL)
/home/bitrix/www/bitrix/modules/main/lib/config/option.php:53
#4: Bitrix\Main\Config\Option::get(string, string, string)
/home/bitrix/www/bitrix/modules/main/lib/httprequest.php:337
#5: Bitrix\Main\HttpRequest->prepareCookie(array)
/home/bitrix/www/bitrix/modules/main/lib/httprequest.php:63
#6: Bitrix\Main\HttpRequest->__construct(object, array, array, array, array)
/home/bitrix/www/bitrix/modules/main/lib/httpapplication.php:42
#7: Bitrix\Main\HttpApplication->initializeContext(array)
/home/bitrix/www/bitrix/modules/main/lib/application.php:122
#8: Bitrix\Main\Application->initializeExtendedKernel(array)
/home/bitrix/www/bitrix/modules/main/include.php:23
#9: require_once(string)
/home/bitrix/www/bitrix/modules/main/include/prolog_before.php:14
#10: require_once(string)
/home/bitrix/www/bitrix/modules/main/include/prolog.php:10
#11: require_once(string)
/home/bitrix/www/bitrix/header.php:1
#12: require(string)
/home/bitrix/www/index.php:2

Мои хостеры помогли. Вот их ответ:


Поле пароля в файлах CMS Bitrix .settings и dbconn.php не может быть пустым.

Вы можете установить пароль пользователя базы данных root, выполнив последовательно команды:

upd ate user se t password=PASSWORD(‘новый_пароль_базы_данных’) where User=’root’;

service mysqld restart

Для уточнения данной информации обратитесь к официальной документации mysql.

Статус подключений

Внутренне PHP имеет три статуса подключения:

При нормальном выполнении сценария активно состояние NORMAL. Если во время загрузки страницы пользователь нажал кнопку STOP, активным становится состояние ABORTED. Если сценарий выполняется дольше отведенного ему времени, устанавливается флаг состояния TIMEOUT. Возможно определить, как должен вести себя сценарий в зависимости от этих условий.

Если требуется, чтобы сценарий продолжал свое выполнение при разрыве соединения пользователем, нужно установить в файле конфигурации значение параметра ignore_user_abort = 1 (это также можно сделать в файлах конфигурации Apache). Можно также воспользоваться функцией ignore_user_abort(). В противном случае, сценарий завершается.

Чтобы игнорировать завершение сценария таймером, необходимо использовать функцию set_time_limit().

Если функцией register_shutdown_function() была установлена функция «запускаемая при завершении сценария», то, вне зависимости от статуса подключения, она будет исполнена перед тем, как сценарий завершится. И в «завершающей» функции можно будет выяснить (с помощью функции: connection_aborted(), connection_timeout() и connection_status()), был ли сценарий завершен нормально или досрочно.

connection_aborted

Определения разрыва подключения пользователем.


Синтаксис:

Функция connection_aborted() возвращает true, если подключение было разорвано пользователем.

connection_status

Определения статуса подключения.

Синтаксис:

Возвращает значение битового поля, позволяющее выяснить в «завершающей» функции, был ли сценарий завершен досрочно и причину этого. Например, если возвращается 3 (ABORTED | TIMEOUT), то это означает, что время выполнения истекло, а также то, что пользователь отказался от загрузки страницы.

Если возвращается 0 (то есть значение NORMAL), то это означает, что выполнение сценария не было прервано.

connection_timeout

Определения наступления тайм-аута.

Синтаксис:

Возвращает true, если время выполнения сценария истекло.

ignore_user_abort


Прерывание сценария при разрыве подключения.

Синтаксис:

int ignore_user_abort([int setting]);

Аргументом setting можно указать, необходимо ли досрочно завершать выполнение сценария, если связь с клиентом потеряна. Если аргумент не указан, то возвращается текущая установка.

register_shutdown_function

Устанавливает функцию, которая будет выполнена при завершении.

Синтаксис:

int register_shutdown_function(string func);

Регистрирует функцию с именем func в качестве функции, запускаемой после завершения сценария.

Заметьте: так как после завершения функции никакие средства вывода недоступны, это делает для функции, зарегистрированной в качестве «завершающей», недоступными обычные средства отладки, такие команды как print или echo.

Connection_aborted — Возвращает TRUE, если клиент отсоединён

Замечание: Вся последующая информация применима к версиям 3.0.7 и ниже.

Статус соединения сохраняется внутренними механизмами PHP. Ниже перечислены три возможные состояния:


Во время штатного выполнения PHP-скрипта установлен статус NORMAL. В случае, если удаленный клиент разорвал соединение, статус изменяется на ABORTED. Чаще всего отсоединение удаленного клиента происходит при нажатии кнопки «Stop» в браузере. В случае, если достигается установленный временной лимит (ознакомьтесь с функцией set_time_limit() ), будет установлен статус TIMEOUT.

Выполнение вашего скрипта также может быть прервано встроенным таймером. Стандартное ограничение по времени составляет 30 секунд, изменить его можно при помощи директивы max_execution_time в конфигурационном файле php.ini . Такого же результата можно достичь, добавив php_value max_execution_time в конфигурационный файл Apache или воспользовавщись функцией set_time_limit() . При достижении скриптом временного лимита выполнение скрипта прерывается и вызывается завершающая функция, если она была указана. Уточнить причину завершения скрипта вы можете при помощи функции connection_timeout() , которая возвращает TRUE , если скрипт был прерван по достижению временного ограничения.

Единственное, что следует заметить — что оба статуса: ABORTED и TIMEOUT,- могут быть установлены одновременно. Это может произойти в том случае, если вы явно указали необходимость игнорировать отсоединение удаленного клиента. В таком случае после разрыва соединения, отметив этот факт, PHP продолжит выполнение скрипта, и при достижении временного лимита будет вызвана завершающая функция, если таковая была указана. В этой точке вы можете обнаружить, что и connection_timeout() , и connection_aborted() возвращают TRUE . Вы также можете проверить оба статуса одновременно, вызвав функцию connection_status() , которая возвращает битовые значения для активных статусов. В случае, если оба статуса активны, она, к примеру, вернет значение 3.

Connection_aborted — Возвращает TRUE, если клиент отсоединён

8623 просмотра

4 ответа

504 Репутация автора

В VB.net я использую TcpClient для получения строки данных. Я постоянно проверяю свойство .Connected, чтобы убедиться, что клиент подключен, но даже если клиент отключается, это все равно возвращает true. Что я могу использовать в качестве обходного пути для этого?

Это урезанная версия моего текущего кода:

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

РЕДАКТИРОВАТЬ Опрос клиента. Доступно было предложено, но это не решает проблему. Если клиент не «подключен», доступно только возвращает 0.

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

Работа с соединениями

Руководство по PHP
Пред. След.

Замечание: Вся последующая информация применима к версиям 3.0.7 и ниже.

Статус соединения сохраняется внутренними механизмами PHP. Ниже перечислены три возможные состояния:

Во время штатного выполнения PHP-скрипта установлен статус NORMAL. В случае, если удаленный клиент разорвал соединение, статус изменяется на ABORTED. Чаще всего отсоединение удаленного клиента происходит при нажатии кнопки «Stop» в браузере. В случае, если достигается установленный временной лимит (ознакомьтесь с функцией set_time_limit() ), будет установлен статус TIMEOUT.

Вы можете решать, приводит ли отключение клиента к завершению вашего скрипта. Иногда бывает необходимо, чтобы скрипт выполнился до конца, даже если отсутствует удаленный браузер, которому адресован весь вывод. По умолчанию скрипт завершает свою работу при отключении клиента. Это поведение может быть изменено при помощи опции ignore_user_abort в конфигурационном файле php.ini . Такого же результата можно добиться, указав «php_value ignore_user_abort» в конфигурационном файле Apache или воспользовавшись функцией ignore_user_abort() . Если вы явно не указали на необходимость игнорировать разрыв соединения с клиентом, выполнение скрипта будет прервано. Исключением является тот случай, если используя register_shutdown_function() , вы указали специальную функцию, вызываемую при завершении скрипта. В таком случае после того, как пользователь нажал кнопку «Stop» в своем браузере, при первой же попытке что-либо вывести PHP обнаруживает, что соединение с клиентом было утеряно, и вызывает завершающую функцию. Эта функция также вызывается при нормальном завершении работы вашего скрипта, поэтому для того, чтобы выполнить некоторые специфические действия при отсоединении клиента, вам понадобится функция connection_aborted() , которая возвращает TRUE , если соединение было разорвано.

Выполнение вашего скрипта также может быть прервано встроенным таймером. Стандартное ограничение по времени составляет 30 секунд, изменить его можно при помощи директивы max_execution_time в конфигурационном файле php.ini . Такого же результата можно достичь, добавив php_value max_execution_time в конфигурационный файл Apache или воспользовавщись функцией set_time_limit() . При достижении скриптом временного лимита выполнение скрипта прерывается и вызывается завершающая функция, если она была указана. Уточнить причину завершения скрипта вы можете при помощи функции connection_timeout() , которая возвращает TRUE , если скрипт был прерван по достижению временного ограничения.

Единственное, что следует заметить — что оба статуса: ABORTED и TIMEOUT,- могут быть установлены одновременно. Это может произойти в том случае, если вы явно указали необходимость игнорировать отсоединение удаленного клиента. В таком случае после разрыва соединения, отметив этот факт, PHP продолжит выполнение скрипта, и при достижении временного лимита будет вызвана завершающая функция, если таковая была указана. В этой точке вы можете обнаружить, что и connection_timeout() , и connection_aborted() возвращают TRUE . Вы также можете проверить оба статуса одновременно, вызвав функцию connection_status() , которая возвращает битовые значения для активных статусов. В случае, если оба статуса активны, она, к примеру, вернет значение 3.

Илон Маск рекомендует:  Соглашение об именах
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL