PHP-функция strlen ведет себя странно

Пожалуйста, рассмотрите следующий код:

$imagePath = "https://s22.postimg.org/3k3o9ly8t/testigo.jpg";
$imagedata = get that image data through curl and store in this variable;
echo strlen($imagedata); // outputs 4699

if(strlen($imagedata) == 4699 ) {
    echo "length is 4699";
}

Приведенное выше условие if никогда не становится истинным, хотя значение strlen равно 4600. Это кажется очень странным; я что-то пропустил? Я уже пробовал mb_strlen, но безрезультатно.

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


Код:

$strImageURL = "https://s22.postimg.org/3k3o9ly8t/testigo.jpg";

$strImageData = getData($strImageURL);

echo "<br />" . strlen($strImageData);

if(strlen($strImageData) === 4699) {
    echo "true";
}

function getData($strSubmitURL)
{

    $strData = null;

    $ch = curl_init();

    //return parameter
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 120);
    curl_setopt($ch, CURLOPT_TIMEOUT, 140);

    //site name
    curl_setopt($ch, CURLOPT_URL,$strSubmitURL);


    // don' verify ssl host
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);
    $strData = curl_exec ($ch);

    if (!$strData) {
        //die ("cURL error: " . curl_error ($ch) . "\n");
        return '';
    }
    curl_close ($ch);

    unset($ch);

    return $strData;
}

person user2001842    schedule 10.09.2013    source источник
comment
Учитывая ситуацию, которую вы описали, это в принципе не может быть неправильным... и, вероятно, где-то еще в вашем коде произошел сбой...   -  person Evert    schedule 10.09.2013
comment
Если вы пытаетесь определить размер файла, это будет неправильный путь. В целях безопасности используйте if(strlen($imagedata) === 4) (обратите внимание на тройку =)   -  person Rottingham    schedule 10.09.2013
comment
Это на самом деле интереснее...   -  person HamZa    schedule 10.09.2013
comment
@Rottingham, я уже пробовал это. Но все так же.   -  person user2001842    schedule 10.09.2013
comment
@Evert Правильно, но это действительно не работает. Даже я упростил ситуацию, создав отдельный тестовый файл. Я знаю, что это сработало для меня ... использовалось бесчисленное количество раз. Не уверен что происходит. Может быть, это связано с тем, как хост настроил какой-либо аспект php? Я опубликую точный код через минуту.   -  person user2001842    schedule 10.09.2013
comment
@user2001842 user2001842 Если вы проверяете внешний файл, над которым у вас, вероятно, нет контроля, задумывались ли вы о том, что с тех пор размер изображения мог измениться? Это возможный сценарий, если это так.   -  person Funk Forty Niner    schedule 10.09.2013
comment
Я бы поместил дамп var в каждую точку, чтобы увидеть, что происходит на самом деле, а не спекулировать. Пожалуйста, посмотрите мой ответ с некоторым рабочим кодом (хотя и без использования завитка).   -  person Joeme    schedule 10.09.2013
comment
@Joeme Размер изображения не изменился .. потому что предыдущая строка по-прежнему показывает ту же длину. Кроме того, кажется, что это работает для определенных изображений. Пожалуйста, попробуйте с изображением ниже. i44.tinypic.com/65mmc7.jpg   -  person user2001842    schedule 10.09.2013
comment
Этот URL-адрес изображения дает мне веб-страницу с сообщением о недоступности фотографии, а не с изображением. Можете ли вы опубликовать больше своего кода, чтобы я мог протестировать его с помощью curl? Есть ли причина использовать curl, а не file_get_contents? Вы пробовали мой код ниже?   -  person Joeme    schedule 10.09.2013
comment
Просто отметим, что если вы попытаетесь получить это изображение (которого не существует), оно на самом деле читает 4669 bytes (из html-кода)   -  person Ivan Hušnjak    schedule 10.09.2013
comment
@Joeme Возможно, потому что вам нужно войти в систему tinypic.com и/или иметь зачисленный API для загрузки.   -  person Funk Forty Niner    schedule 10.09.2013
comment
Возможно, вы пытаетесь выяснить, существует ли / доступно ли изображение? Потому что проверка длины тела ответа сервера может быть не лучшим способом сделать это, лучше проверить заголовки HTTP   -  person Ivan Hušnjak    schedule 10.09.2013
comment
@Joeme извини. Пожалуйста, попробуйте этот URL: s22.postimg.org/3k3o9ly8t/testigo.jpg Я не не пробовал ваш код, но использовал другое изображение и работал хорошо. Пожалуйста, попробуйте этот образ. Выкладываю код сейчас.   -  person user2001842    schedule 10.09.2013
comment
Я все еще хотел бы знать, почему это не сработало, сравнение должно подойти. Я вставил дамп var на свой, и он отлично работает: $strlen = strlen($imagedata); // outputs 1020 var_dump($strlen); if($strlen == 1020 ) { ...   -  person Joeme    schedule 10.09.2013
comment
Это работает и для меня, 4669 (изображение - это недоступное изображение, но тем не менее это и изображение). Я добавил код в свой ответ, чтобы показать вам.   -  person Joeme    schedule 10.09.2013
comment
@joeme Я только что добавил код. Пожалуйста, попробуйте. Я пробовал file_get_contents.. тоже не работает. Очень странный. Все остальные образы работают. только это доставляет хлопоты. Если у вас возникли проблемы с этой ссылкой на изображение, скопируйте изображение на свой компьютер, а затем попробуйте этот php-код. Я провожу 2 часа с этим, не знаю, что происходит.   -  person user2001842    schedule 10.09.2013
comment
хорошо, если это то :-| когда я помещаю дамп var, он дает ["strImageData"]=> string(4669) Кроме того, ваша 5-я строка ниже эха <br />4669 Однако.... ваш код имеет: if(strlen($strImageData) == 4699) { Четыре Шесть ДЕВЯТЬ Девять... возможно, измените ДЕВЯТЬ до Шести !!   -  person Joeme    schedule 10.09.2013
comment
И теперь он возвращает true для меня, поменяй девятку на шестерку, чувак.   -  person Joeme    schedule 10.09.2013
comment
@joeme Спасибо! какую глупую ошибку я сделал :(   -  person user2001842    schedule 11.09.2013
comment
Без проблем!! Вот почему я всегда нахожу var_dump полезным. Пожалуйста, примите мой ответ ниже, если вы обнаружили, что он работает сейчас.   -  person Joeme    schedule 11.09.2013


Ответы (2)


Это работает для меня:

$url = "http://static.bbci.co.uk/frameworks/barlesque/2.51.4/orb/4/img/bbc-blocks-dark.png";
$imagedata = file_get_contents($url);
//echo strlen($imagedata); // outputs 1020

if(strlen($imagedata) == 1020 ) {

    echo "length is 1020";

}

И в качестве дальнейшего устранения неполадок я бы попробовал var_dump(get_defined_vars()); в конце вашего кода и внутри оператора if, чтобы увидеть, что происходит.

//Редактировать/обновить: используя ваш URL, а также дважды помещая дамп var:

$url = "http://s22.postimg.org/3k3o9ly8t/testigo.jpg";
$imagedata = file_get_contents($url);
$strlen =  strlen($imagedata); // outputs 4669
var_dump($strlen);

if($strlen == 4669 ) {

    echo "length is 4669 \n";
    var_dump($strlen);
}

возвращает:

PhpMate running PHP 5.3.15 with (/usr/bin/php)
 >>> untitled

int(4669)
length is 4669 
int(4669)
person Joeme    schedule 10.09.2013

strlen() используется для подсчета байтов, которые строка соответствует одному символу, не обязательно равна 1 байту в UTF-8.

Другая проблема может заключаться в приведении типов, поскольку в PHP есть такие нечеткие правила по этому поводу. Будет ли это работать для вас?

if((int)strlen($imagedata) == 4600 ) {

    echo "length is 4600";

}

or

if(strlen($imagedata) == '4600' ) {

    echo "length is 4600";

}
person MonkeyZeus    schedule 10.09.2013
comment
приведение к (int) или использование строковой нотации не имеет значения для php, поскольку strlen() может возвращать только целочисленные значения - person Ivan Hušnjak; 10.09.2013