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

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Повальсировать с бубном всё же придётся. Надо установить/скачать на сервер ffmpeg и его утилиту ffprobe, которая даёт инфу о медиафайле. Через exec() выполнить её и распарсить ответ:
    <?php
    $filename = "test.mp4";
    $cmd = sprintf('ffprobe -v quiet -show_streams -of json "%s"', $filename);
    $output = array();
    exec(  $cmd, $output);
    $data = json_decode( implode('', $output));
    
    $width = $height = 0;
    if( $data  &&  isset($data->streams) && is_array($data->streams)  &&  count($data->streams)) {
    	foreach( $data->streams AS $i => $stream) {
    		if( isset( $stream->width, $stream->height)) {
    			$width = $stream->width;
    			$height = $stream->height;
    			break;
    		}
    	}
    }
    
    echo "Video is ${width}x$height\n"; // Video is 400x224
    Ответ написан
    Комментировать
  • CURL+PHP Google авторизация?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Google рекомендует использовать их клиентские библиотеки для авторизации по протоклу OAuth.

    Имитировать браузер cURL'ом и PHP скорее всего, не получится. Если очень уж хочется – смотрите в сторону устаревших мобильных браузеров без JS – как с них выглядит авторизация в Google.
    Ответ написан
    2 комментария
  • Как проигрывать прямые url на mp3 с vk.com?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Забыли атрибут crossorigin:

    <audio crossorigin="anonymous" src="..." autoplay loop></audio>


    Upd. Не забывайте, что эти ссылки живут совсем недолго, буквально несколько минут.

    Эксперимент 1. Воспроизвожу какой-нибудь трек прямо в ВК, копирую ссылку на него из панели Network запросов браузера. В анонимном окне браузера, через прокси, т.е. с другого IP, открываю тестовую страничку на своём сайте, где вставлен тег audio с этой ссылкой на mp3.
    1. с прописанным атрибутом crossorigin="anonymous" – играет.
    2. без атрибута crossorigin – не играет, в консоли ошибка про кросс-доменные запросы.
    Эксперимент 2. Эта же страница, через 5 минут. Не играет. В сетевой панели видно, что запрос к первоначальной ссылке на mp3 вернул 404 редирект на vk.com/404.php?...

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

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    В JavaScript смещение временной зоны считается (почему-то) в минутах. Поэтому примерно так можно:
    var offset = 180; // в минутах часовой пояс Москвы +3 часа = +180 минут
    var D = new Date();
    D.setMinutes( D.getMinutes() + D.getTimezoneOffset() + offset);
    // объект D теперь содержит дату-время соответствующую Москве.
    Ответ написан
    Комментировать
  • Как организовать генерацию номеров тикетов?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Как это сделано у Redis, алгоритм Redlock:
    1. понадобится доп. поле для случайной строки;
    2. генерите случайный ID и случайное значение;
    3. вставляете в таблицу запись с этим ID и значением. БД не позволит вставить, если уже есть такой ID.
    4. Читаете эту запись и её доп.поле. Если считанное доп.значение совпало с вашим сгенеренным случайным значением – всё круто, этот ID ваш, можно его использовать;
    5. Если считалось, но там другое значение доп. поля – придётся снова генерить новый случайный ID и сл. значение ему в пару – до тех пор, пока не попадёте пальцем в небо. Чем больше тикетов в системе, тем дольше может понадобиться погадать. И скорее переписать всю ущербную систему на последовательную нумерацию записей и генерацию не выглядящих последовательными биьективных трансформаций из них (самое простое – инверсия порядка битов).


    Upd. подробнее об идее с перемешиванием битов последовательных ID, чтобы они выглядели непоследовательно. Самый простой вариант однозначного соответствия между двумя множествами это инверсия порядка битов. В БД храните последовательные возрастающие ID. Тип INT в MySQL занимает 4 байта, это 32 бита. Для отображения их клиенту вы в PHP или NodeJS (они все 64-битные) инвертируете порядок бит в младших 4 байтах. Например:
    было 199
    00000000 00000000 00000000 11000111
    стало (зеркально)
    11100011 00000000 00000000 00000000
    это 64-битное число 3808428032
    
    было 200
    00000000 00000000 00000000 11001000
    стало
    00010011 00000000 00000000 00000000 (318767104)


    Такое зеркалирование порядка – операция обратимая. Дважды отзеркалить – будет исходное. Поэтому клиентам показываете эти сложные номера, у себя ведёте последовательные упорядоченные ID.

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

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Для каждого нового сериала новые таблицы? – нет, это неприемлемо.

    Сделайте примерно так:
    • Таблица «Сериалы»: id, название, год, описание, режиссёр, рейтинг IMDB и т.п.
    • «Серии»: id_сериала, id_серии (в формате S02E05), ссылка
    • «Оценки»: id_юзера, id_сериала (+id_серии?), оценка
    • «Юзеры»: id, ник, хэш пароля, дата последнего визита
    • «Комменты»: id, id_сериала, id_юзера, текст коммента


    Ответ написан
    1 комментарий
  • Как строчное число перевести в численное?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Набросал класс для конвертации.

    Принцип действия:
    1. разбить фразу на массив слов по пробелам;
    2. разбить на группы слов по разрядам троек – по словам «тысяч», «млн» и пр.;
    3. внутри этих групп оставшиеся слова переводятся в числа 0..999 по одинаковым правилам;
    4. домножить на соотв. экспоненту десяти ( в 0-й, 3-й, 6-й степени) и сложить.


    Ответ написан
  • Как правильно сделать пост на стене группы при помощи Вконтакте API wall.post?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Токен нужно получить с того же IP, что и будет вызываться метод. Будете вызывать с сервера – надо получать токен, используя этот сервер как прокси для захода браузером в ВК.
    Ответ написан
    3 комментария
  • Как грамотнее сделать, добавление ID пользователя к задаче, или ID задачи к пользователю?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Таблица "Подписки": user_id, page_id

    Primary key – составной индекс из обоих столбцов, просто-индекс по page_id для поиска.
    Ответ написан
    4 комментария
  • Как организовать уведомление о новой заявке на landing page в личку VK?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Варианты:
    1. личное сообщение сообщение от вашего «запасного» аккаунта ВК;
    2. сообщение от Сообщества (группы);
    3. уведомление от Приложения ВК;
    4. смс (платно).

    Метод messages.send() отправляет сообщение от пользователя или сообщества; secure.sendNotification() – уведомление от приложения; secure.sendSMSNotification() – эсэмэсина от приложения. Наверное, лучше сделать сообщение от Сообщества.

    Создайте себе новую закрытую группу, где будете только вы. Включите сообщения сообщества и получите ключ (просто скопируйте его из Настроек сообщества – Работа с API.

    При событии в лендинге откройте скриптом ссылку API ВКонтакта, например, так:
    $url = "https://api.vk.com/method/messages.send";
    $params = [
    	'user_id' => 123456, // ваш user_id в ВК
    	'message' => 'Новая заявка!',
    	'access_token' => $TOKEN, // токен сообщества
    	'v' => 5.62
    ];
    $url = $url . '?' . http_build_query($params);
    file_get_contents($url);
    Ответ написан
    1 комментарий
  • Как вывести каждый день текущего месяца?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Символ 't' в функции date() даёт число дней в текущем месяце. Очень удобно!
    $last = (int) date('t');
    $d = 1;
    do{ echo $d . PHP_EOL; } while($d++ < $last);


    Ideone
    Ответ написан
    Комментировать
  • Как автоматически с интервалом постить изображения из альбома ВК на стену сообщества?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    1. создать Standalone приложение ВК;
    2. получить для него токен админа/редактора сообщества с правами photos, wall;
    3. запускать по расписанию на сервере, брать очередное фото photos.get() и постить wall.post() на стену – всё через api ВКонтакте.
    Ответ написан
    Комментировать
  • Как получить куки с заголовками через guzzle?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Guzzle имплементирует для response psr интерфейс Psr\Http\Message\ResponseInterface
    $res->getHeaders(); // вернет массив всех заголовков


    Про работу с cookies см. документацию Guzzle.
    Ответ написан
    Комментировать
  • Какой создать хеш при передачи api?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Например, как это реализовано у ВКонтакте. Посетитель авторизуется на основном сайте. Для выполнения запросов к api он получает токен – хэш от его id, иногда ip адреса или подсети, «секрета» самого ВК, «секрета» приложения. С любым запросом к api идёт этот хэш, который гарантирует только то, что запрос пришёл от имени такого-то пользователя (и с валидного IP, а не «вдруг» с другого континента).

    Кроме этого, при запросе вычисляется хэш от параметров запроса и «секрета» приложения. Это позволяет убедиться в том, что параметры запроса не подделаны в клиенте – т.к. «секрет» приложения не покидает серверов и не попадает в клиент.
    Ответ написан
    Комментировать
  • Найти в строке подстроку, которая содержит максимальное количество последовательных символов в этой строке?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Надо двигать концы отрезка: правый R и левый L. Изначально оба на нуле.
    Держим текущий набор символов, чтобы проверять на повторы. Помним найденный максимальный отрезок.
    Двигаем правый конец на 1. Если символа нет в наборе, добавляем. Если есть, двигаем L вправо за найденный символ. Перед этим проверяем, а не нашли ли мы очередной максимум.

    Очень кривая спать-хочу реализация, вроде, работает: Ideone

    Старый ответ, please ignore: Двигаться по одному символу. Помнить найденную макс. длину. Сравнивать символ с предыдущим.
    Равен – длина текущего сегмента растёт.
    Не равен – закончился предыдущий сегмент и начался новый. Если длина больше найденного максимума – найден очередной кандидат. Запомнить его длину и начало. Запомнить начало очередного сегмента и считать длину с 1.

    Итого один раз пройтись. Не надо регулярок.
    Ответ написан
    Комментировать
  • Как лучше организовать хранение временных данных?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Надо как-то определять момент «выхода» пользователя. Будь то таймаут после последнего действия или регулярный ping.

    Для временных, недолго живущих данных, можно порекомендовать любую базу данных в оперативной памяти. Кроме того MySQL умеет хранить таблицы в памяти.

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

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Можно сконфигурить свой nginx так, чтобы при запросе к определенному пути, запросы передавались на тот сервер. Например, вы получили путь к файлу "totServ.com/get/file/abcd-1234". У себя настроили, что все запросы к папке "svojServ.ru/dl/" проксируют запросы туда. И отдаёте пользователю ссылку "svojServ.ru/dl/abcd-1234"
    Ответ написан
    Комментировать
  • Как заменить ключ следующим значением?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Неплохо использовать встроенные функции array_chunk() и array_reduce() :
    <?php
    function pair( $arr) {
    	function keyValue( $result, $item) {
    		$result[ $item[0]] = isset($item[1]) ? $item[1] : null;
    		return $result;
    	}
    	return array_reduce( array_chunk($arr, 2), 'keyValue', []);
    }
    
    print_r( pair( [1,2,3,4,5] ));
    /* Array (
        [1] => 2
        [3] => 4
        [5] => 
    ) */
    Ответ написан
    Комментировать
  • Запуск скрипта через cron?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Вообще веб-часть не нужна. Через крон запускайте скрипт как локальную команду: /usr/bin/php script.php
    Ответ написан
    2 комментария
  • Как сделать обработку формы по двум submit?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Нажатый "submit" передаст своё имя-значение. Ненажатый "submit" – не отправит.
    if( $_POST['message'] === 'Отправить') {
        // отправляем сообщение
      } else if( $_POST['recall'] === 'Перезвонить') {
        // перезваниваем
      }
    Ответ написан
    Комментировать