Ответы пользователя по тегу PHP
  • Подписан ли человек на такую группу и оставлял ли он там фотографии?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Метод users.getSubscriptions() возвращает подписки юзера. Если user_id не указывать, вернёт ваши подписки. Вот такой нехитрый код в процедуре execute() (прямо на той странице его вставьте и «Выполните») вернёт два массива: ваши и его id групп:
    var uid=12345; 
    return {
      "my": API.users.getSubscriptions().groups.items,
      "her": API.users.getSubscriptions({"user_id":uid}).groups.items
    };

    В первой строке задаётся id "того юзера", с кем сравнивать.

    Эти два массива остаётся сопоставить. Можно в скретч-паде браузера выполнить следующий код:
    var r = 
    {"response":.....} // тут целиком ответ из метода execute
    ;                  // и точка-с-запятой в конце.
    var common = [];   // сюда попадут id общих групп
    for(var i=0;i<r.response.my.length;i++){
      if( !!~r.response.her.indexOf( r.response.my[i])) 
        common.push(r.response.my[i]);
    }
    common;   // если в Scratchpad Firefox'а нажать Ctrl+L, 
              // код выполнится а в коммент вставится содержание этого массива


    Постил ли фотографии – надо просмотреть всю фото методом photos.getAll(). Параметр owner_id – по очереди, каждой из общих групп. У каждой фотографии смотреть значение поля user_id – нужны только те, где оно равно искомому юзеру.

    За один вызов метода можно получить до 200 фотографий, поэтому добавляем параметр count=200 и параметром offset листаем по 200 снимков вглубь истории. Можно опять методом execute зарядить сбор – так будет по 25*200 = 5000 фото за один вызов.
    Ответ написан
    Комментировать
  • Много ли ресурсов требуется echo?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Не сильно.

    «Цена» вывода данных через echo для сервера ничтожна, по сравнению с тяжестью передачи лишних данных по сети от сервера в браузер.

    Если хотите оптимизировать, передавайте с сервера только данные про товары в удобном для JS формате, напр. JSON. А JS в браузере уже пусть их форматирует и отрисовывает как там выберет клиент – таблицей или списком. Всё, что расчитывается в браузере – уже не вашего сервера работа, вы за неё «не платите».
    Ответ написан
    Комментировать
  • Как использовать значения объекта javascript в php?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Попробуйте так:
    $data = json_decode( $_POST['data']);
    $data->price; // 6230
    $data->name; // 1111
    Ответ написан
  • PHP как убрать последнее слово?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Из строки делаем массив слов, разбивая по плюсу. Выкидываем последнее слово из массива. Составляем ссылку, склеивая массив через плюсы и через пробелы:
    $str = 'prosto+tyt+slova+raznie'; 
    $words = explode('+', $str); //  массив слов
    if( count( $words) > 1) {
        array_pop($words); // выкидываем последнее слово, если их больше 1
        printf( '<a href="#%s">%s</a>', implode('+', $words), implode(' ', $words));
    }
    Ответ написан
    Комментировать
  • Как ограничить частоту запросов к бэкэнду?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Выдавать и проверять токен. При первой загрузке страницы выдаётся уникальный токен, с которым может быть выполнен первый запрос к апи. В ответ на первый запрос с токеном отдаются данные и токен для следующего запроса – только с ним, и не раньше X секунд можно получить данные. И так далее.

    Разумеется, хранить токены в in-memory хранилище (Redis, Memcached, APC). Продумать вариант с потерей связи и перезапросом со старым токеном (кэшировать данные на N секунд). Запрос со следующим токеном стирает из кэша предыдущий и его данные.
    Ответ написан
    Комментировать
  • Можно ли узнать информацию о добавляемом на сервер аудиофайле?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Если эта информация прописана в id3 теге mp3 файла, то можно. Например, ffmpeg или его утилита ffprobe умеют читать эти данные из mp3 файла:
    ffprobe -v quiet -print_format json  -show_format  music.mp3

    Результат:
    {
        "format": {
            "filename": "music.mp3",
            "nb_streams": 2,
            "nb_programs": 0,
            "format_name": "mp3",
            "format_long_name": "MP2/3 (MPEG audio layer 2/3)",
            "start_time": "0.025056",
            "duration": "219.350204",
            "size": "7072585",
            "bit_rate": "257946",
            "probe_score": 51,
            "tags": {
                "title": "Rihanna - Work (Feat. Drake)(VipMusic.In)",
                "artist": "VipMusic.In",
                "album": "Rihanna - ANTi (2016) - VipMusic.In",
                "composer": "VipMusic.In",
                "copyright": "VipMusic.In",
                "publisher": "VipMusic.In",
                "genre": "[VipMusic.In]"
            }
        }
    }

    Имейте в виду, что могут загрузить Metallica, прописав в тегах файла, будто это Лепс.

    Ещё вариант – подключаться к api какого-то музыкального сервиса опознавания записи по звуку – напр. EchoNest вроде бы может принимать upload'ы и идентифицировать треки.
    Ответ написан
    Комментировать
  • Php, как узнать дату начала при известных дате конца и сроке?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    $date = new DateTime(); // объект с текущей датой-временем
    $date->sub(new DateInterval('P46D')); // вычли интервал 46 дней
    echo $date->format('Y-m-d') . "\n";  // 2016-02-02

    Ideone
    Ответ написан
    Комментировать
  • Как сделать свой api для использования на стороннем сайте?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    У Битрикса, вроде бы, есть для этого целый раздел документации – Веб сервисы
    Ответ написан
    Комментировать
  • Как правильно создать sql запрос, php скрипт для подняния постов вверх по списку?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Держите в БД три поля: auto_up, created, effective – последние два при создании одинаковы – датавремя создания поста.

    Каждые 5 минут сравнивайте текущее время с effective у записей, где auto_up=1 – и если разница больше 4 часов, вычитайте 4 часа из effective.

    При показе объявлений сортируйте не по created, а по effective.
    Ответ написан
    Комментировать
  • Как создать программу сложения цифр n-значного числа?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Сделать из числа массив цифр: str_split(), сложить все элементы массива: array_sum()
    Итого:

    $num = 1679;
    $sum = array_sum( str_split( $num));
    Ответ написан
    1 комментарий
  • Цикл с таймаутом ровно в 1 секунду?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Redis имеет механизм уведомлений об операциях. См. notifications.

    Что касается таймера на php, можете определить себе допустимую ошибку, напр. в 20ms и спать не секунду, а микросекунды, используя ф-ю usleep(2E4), и проснувшись, проверять системное время с точностью до микросекунд, опять же – через microtime(TRUE). Если до очередной секунды осталось меньше погрешности – выполнить код. И снова спать, часто просыпаясь : )

    Disclaimer. Этот метод никак не гарантирует, что не проспите очередную секунду – если, например, система сильна загружена.
    Ответ написан
    Комментировать
  • Какой FTP/SFTP/SSH клиент рекомендуете для MacOS?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Panic Coda – редактор, SFTP и SSH в одном флаконе. Упомянутый ранее Transmit – их же продукт.
    Ответ написан
    Комментировать
  • GET параметры. Как запретить изменение их вручную?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Добавлять параметром подпись, которая считается как хэш от параметров в ссылке и некого «секрета», известного только серверу. Такую подпись злодей не сможет подделать (с приемлемой вероятностью), а при изменении параметров, подпись не совпадёт, при проверке на сервере. Такая схема, в частности, применяется во ВКонтакте для проверки GET-запроса при открытии iFrame приложений.

    Например, ваша ссылка должна содержать параметры param_a и param_b. Когда вы её генерируете на сервере, добавляется параметр sign, равный md5-хэшу от строки, полученной конкатенацией названий параметров, их значений и секретного ключа:

    $secretKey = "nXYFyArf6F6iQXTzg"; // хранится в тайне, известен только серверу
    $a = "значение неподделываемого параметра А";
    $b = "значение неподделываемого параметра B";
    $params = array(
      'param_a' => $a,
      'param_b' => $b,
      'sign'    => md5( "param_a" . $a . "param_b" . $b . $secretKey),
    );
    printf( '<a href="http://site.com?%s">Суперссылка</a>', http_build_query($params));

    На сервере полученные GET-параметры проверяются: необходимо наличие подписи, и её совпадение с переданными параметрами. Подпись для полученных параметров вычисляется так же, как и при генерации ссылки – и сравнивается с переданной подписью.
    Ответ написан
    2 комментария
  • Получить позицию строки в выборке?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Найти рейтинг для этого id, затем сосчитать `COUNT(*) AS POSITION WHERE rating > MyRating` сколько строк с рейтингом выше.
    Ответ написан
    1 комментарий
  • Как определить присутствие текста на фото средствами php?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Если предположить, что телефоны всегда пишут сплошным цветом, без полупрозрачности, можно:
    1. построить гистограмму цветов
    2. найти цвет, стоящий особняком (без близких-похожих цветов в большом количестве)
    3. убедиться, что пиксели этого цвета сосредоточены в довольно вытянутом прямоугольнике, и почти нигде больше в картинке не встречаются

    Это позволит судить, что с большой вероятностью такая картинка содержит телефонный номер (ну, или стильный столик под телевизор). Метод пропустит полупрозрачные телефоны, т.к. у них не будет «отдельного» выраженного цвета.
    Ответ написан
    Комментировать
  • Как менее ресурсоемко обработать 2 масива?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Отсортировать каждый массив по значениям; двигаться по обоим массивам, отлавливая совпадающие значения и их ключи.

    И сортировка может быть выполнена с минимальными затратами по памяти, порциями. И вторая фаза, сравнение – достаточно дежать в памяти текущие значения каждого из массивов.
    Ответ написан
    Комментировать
  • Как вы бы организовали хранение видео и аудиофайлов?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Таки посоветую Amazon. Для долговременного хранения, когда файлы не нужно часто-быстро отдавать, у них есть сервис Glacier, стоящий на порядок меньше, чем S3.

    Представьте Glacier как хранение на магнитной ленте: когда файлы понадобятся, надо их запросить и чуть подождать: пока найдут ленту, вставят в устройство – и файл перекинут на ваш S3 букет.

    Вы не описали в вопросе, как будет использоваться хранение. То ли это загрузил и забыл – пусть где-то хранится; то ли это один загрузил, тысячи бросились скачивать-смотреть. Решения могут быть разными.

    Upd. в комментариях увидел ваше пояснение: «это обучающий сервис будет и там каждое видео будет просматриваться от и до, трафика будет нормально». Я строил видео решение для обучающего сервиса по фотографии несколько лет назад – как раз на основе AWS CloudFront и S3. У нас были бесплатные и платные просмотры контента, свой flash видео-плеер и, извините, Joomla : )
    Ответ написан
    3 комментария
  • Как правильно создать бинарную строку в php?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Я бы бил на байты, и работал с битами и отдельными символами:

    $ar = [0, 2, 3, 7, 8];
    
    $maxValue = max( $ar);
    if( $maxValue >= pow(2, 32)) {
    	return; // больше, чем влезет в один ключ в Redis
    }
    
    $maxBytes = ceil( $maxValue / 8);
    $bin = str_repeat( chr(0x0), $maxBytes);
    foreach($ar AS $bitNumber) {
    	$byteNumber = floor( $bitNumber / 8); // в каком символе строки этот бит окажется
    	$addon = 1 << ( 7 - $bitNumber % 8);  // каков этот бит в своем байте (Redis слева направо)
    	$byteChar = substr( $bin, $byteNumber, 1); // получаем этот символ из нашей строки
    	$byteChar = chr( $addon | ord( $byteChar)); // обновляем символ очередным битом
    	$bin = substr_replace( $bin, $byteChar, $byteNumber, 1); // вставляем обновленный символ в строку
    }
    // return $bin; // строка готова для Redis'а.
    
    // проверка
    for( $i=0; $i<strlen($bin); $i++) printf( "%08b", ord(substr($bin,$i,1)));
    echo PHP_EOL;
    Ответ написан
    Комментировать
  • Почему при копировании файла результующий файл отличаеться одним байтом?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Может, файл качать cURL'ом? Я примерно так делаю:

    $img = 'https://scontent.cdninstagram.com/hphotos-xfa1/t51.2885-15/e15/11378546_468565866637366_80199982_n.jpg';
    
    $localFile = fopen( $_SERVER["DOCUMENT_ROOT"] . '/' . basename($img), 'w');
    $ch = curl_init( $url);
    curl_setopt_array( $ch, array(
        CURLOPT_FILE            => $localFile,
        CURLOPT_SSL_VERIFYPEER  => FALSE,
        CURLOPT_SSL_VERIFYHOST  => FALSE,
        CURLOPT_HEADER          => FALSE,
        CURLOPT_TIMEOUT         => 10,
    ));
    curl_exec( $ch);
    fclose( $localFile);
    curl_close( $ch);
    Ответ написан
    Комментировать
  • Как лучше получить данные из js файла?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Есть php расширение: V8js – для интеграции движка V8 в PHP.
    Ответ написан
    2 комментария