Вы подсчитываете весь контент, начиная с двух разрывов строки, которые разделяют заголовок:
$contentlength_bytes = strlen(strstr($http, "\r\n\r\n")) - 4;
Если вы делаете это таким образом, я думаю, у вас могут возникнуть проблемы с кодировкой..
Когда ваш контент содержит многобайтовые символы, использование strlen()
для возврата длины его байта может работать некорректно, так как многобайтовые символы могут интерпретироваться как один байт при определенных конфигурациях системы (см. Правку ниже - и комментарии к этой части).
Это даст вам правильную длину байта любой строки содержимого, которую вы подаете в любой конфигурации системы:
$contentlength_bytes = mb_strlen(strstr($http, "\r\n\r\n"), 'latin1') - 4;
Редактировать:
Как указал Джонв комментариях это не всегда необходимо, так как strlen()
в большинстве случаев будет возвращать правильный счетчик строки.
Я только что добавил этот метод измерения, как в многобайтовых системах, и при определенных обстоятельствах (например, mbstring.func_overload
установлен на 2) strlen()
небезопасно использовать против двоичных строк.
Вышеуказанный метод является единственным известным (для меня) способом полностью бинарного безопасного вычисления длины в байтах данной строки.И я уже несколько раз спотыкался об этом ...