За последние 24 часа нас посетили 22258 программистов и 990 роботов. Сейчас ищут 647 программистов ...

Можно ли выполнить условие $var===false, если переменная $var другого типа (не boolean)?

Тема в разделе "PHP для новичков", создана пользователем Макс1, 10 окт 2018.

  1. Макс1

    Макс1 Активный пользователь

    С нами с:
    11 сен 2015
    Сообщения:
    6
    Симпатии:
    0
    Сокет-сервер, использующий скрипт на PHP под Linux, разрывает соединение со стороны сервера, если для данных $input, полученных с клиента, выполняется условие $input===false Если соединение с клиента происходит через модем, при закрытии соединения на клиенте с помощью команды AT^SISC=0 сервер получает данные, равные значению false в PHP, и закрывает соединение со стороны сервера. Если соединение происходит с помощью клиента на C#, при закрытии соединения клиентом сервер не получает значения false, не закрывает соединение, если оно закрывается по условию $input===false, и пытается читать пустые строки с клиента. Для пустой строки $input это условие не выполняется. Соединение можно закрывать по другому условию, например, при получении другой определенной строки.
    Вопрос не о сетях, а о том, можно ли, чтобы не менять условие закрытия соединения на сервере, отправив определенные байты с клиента, получить на сервере значение, соответствующее условию $input===false? В чем отличие значения false на PHP от пустой строки, и можно ли получить true, сравнивая false с данными другого типа, например, строкой или байтом, с помощью оператора === Он проверяет тождество типов, но каким-то образом при получении данных с клиента, который использует модем, условие сравнения выполняется. Клиент на C# отправляет данные в виде массива байт.
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    будет всегда false, если только в $input не записано именно false, поскольку тройное равенство проверяет ещё совпадение типов. А вот с двойным и false в php весело
    PHP:
    1. 0 == false
    2. "" == fa;se
    3. "0" == false
    4. null == false
    5. [] == false
    Может ещё чего забыл
     
  3. Макс1

    Макс1 Активный пользователь

    С нами с:
    11 сен 2015
    Сообщения:
    6
    Симпатии:
    0
    Выяснил, что значение false на сервере возвращает функция socket_read, когда модем на клиенте закрывает соединение. По этому условию закрывается соединение на сервере. Сначала неправильно понял, что отправляются данные с клиента, которые сервер воспринимает как значение false типа boolean. При закрытии соединения через сетевую карту клиентом на C# функция socket_read не возвращает значение false и продолжает пытаться читать пустые строки с клиента, так как не возвращается значение false, и сервер не закрывает соединение по этому условию. С функцией socket_recv такая же ситуация.
    Вопрос в том, как корректно отслеживать закрытие соединения с клиента на C#.
     
  4. Макс1

    Макс1 Активный пользователь

    С нами с:
    11 сен 2015
    Сообщения:
    6
    Симпатии:
    0
    Нашел информацию, что вместо:
    if($input === false) socket_shutdown($client);
    рекомендуют выполнять проверку:
    if(($input === false) || ($input === '')) socket_shutdown($client);
    Сообщается, что вызов функции $input = socket_read($client, $length); при закрытии соединения на клиенте может возвращать как false, так и пустую строку. У меня это зависит от клиента. Пока соединение на клиенте открыто, в логах сервера не нашел пустых строк, полученных с клиента. Поэтому соединение чаще, чем надо, закрываться на сервере не должно. Сделаю проверку на false и пустую строку и протестирую.