Задать вопрос
Ответы пользователя по тегу PHP
  • Как сгенерировать последовательно набор из одной буквы и две цифры в PHP?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    В базе данных или где-то ещё хранить последовательные целые ID, присваиваемые пользователям.

    Остаётся сделать мэппинг из целых 0, 1, 2, ... в A00, A01, ... A99, B00, B01, ...

    26 значений (A–Z), 10 значений (0–9), ещё 10 значений (0–9) – 2600 значений всего получится записать в три таких разряда. Вам этого точно достаточно?

    <?php
    function encode($n) {
      if($n >= 2600 || $n<0) throw(new Exception('Out of range 0 <= n < 2600'));
      return chr( 65 + floor( $n / 100)) . sprintf( '%02d', $n % 100);
    }
    
    echo encode(1654); // Q54

    Проверяем, чтобы на вход пришло число не больше 2599 ("Z99") и не меньше 0.
    Берём символ по его ASCII-коду функцией chr(): А=65, B=66 ... Z=90. Чтобы получить из сотен нужный код, делим $n на 100 и округляем вниз. Получается от 0 до 25. Прибавив 65 получаются значения от 65 до 90 – как раз коды от A до Z.

    Младшие два разряда, десятки и единицы, у числа сохраняются.
    Ответ написан
    1 комментарий
  • Как синхронизировать время на таймере между сервером и браузером с помощью JS?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Наверное, надо написать что-то похожее на cинхронизацию времени между клиентом и серверами в NTP. Это потребует нескольких запросов к серверу, чтобы оценить время отклика – т.е. не сразу с загрузки страницы удастся точно запустить таймер. Показать его можно сразу, и в течение следущих секунд скорректировать. Есть готовое решение: NTPJS, не пробовал.

    В простейшем варианте можно обойтись одним AJAX запросом после полной загрузки страницы. Запомнить текущее локальное время var tPing = (new Date).getTime();, запросить ajax'ом с сервера его текущее время tServ, получить ответ и запомнить локальное время tPong, когда ответ получен. И положиться на очень грубую гипотезу, что сервер ответил точно посередине интервала tPing..tPong. Т.е. решить, что разница серверного времени и локального составляет ровно tDiff = tServ - tPing + (tPong - tPing) / 2;

    Теперь для получения предполагаемого серверного «точного» времени, просто прибавлять к текущему локальному времени этот tDiff.
    Ответ написан
    1 комментарий
  • Как правильно шифровать ссылку на видео?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Передавайте потоковое видео. Например, через Amazon CloudFront или установите свой стриминговый сервер – к примеру nginx умеет.
    Ответ написан
  • Подписан ли человек на такую группу и оставлял ли он там фотографии?

    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 комментария