Ответы пользователя по тегу PHP
  • Как распознавать пользователей при использовании модуля Nginx Push Stream Module?

    @theg4sh
    Можно аутентифицировать пользователя c помощью прокси:
    https://github.com/wandenberg/nginx-push-stream-mo...

    На вскидку: При авторизации достаточно записать ключ во время авторизации в memcache (или др. in-memory db) и обновлять его время жизни при получении long-pulling запроса от бэкэнд-прокси.
    Ответ написан
    Комментировать
  • Какая best practice защиты от записи в файл в несколько потоков?

    @theg4sh
    Проблему с проверкой занятости файла думаю лучше всего решать с помощью shm:
    php.net/manual/en/ref.sem.php
    Либо установкой брокировки на запись, используя:
    php.net/manual/en/function.flock.php

    Используя семафоры, можно маркировать файл как используемый, при этом не будет необходимости в стороннем хранилище, таком как memcache.

    В случае, если требуется "плотная" запись (имею ввиду, что есть требование писать сперва в первые доступные файлы), нужно будет использовать цикл поиска свободного от записи файла.
    Если плотная запись не требуется, то можно фиксировать имя последнего закрытого файла опять же в shm, минусом данной реализации будет неравномерное распределение данных.

    Имхо, в вашем случае будет достаточно flock(). Внутри, насколько понимаю, как раз используется shm для бокировок записи (прошу поправить меня если я ошибаюсь).

    Примерно так может выглядеть поиск первого доступного файла:
    for($i=0; $i<MAX_OFILES; ++$i) {
      $fp = fopen("file$i.log", "w");
      if ($fp && !flock($fp, LOCK_EX | LOCK_NB)) {
        fclose($fp);
        continue;
      }
      // write your actions here
      fclose($fp);
      break;
    }

    Пример ожидания доступности файла не сильно отличается от приведенного и есть по ссылке на доку к методу flock.
    з.ы. Давно не писал на пыхе, поэтому код может быть не валидным.
    Ответ написан
    Комментировать
  • Как сделать граббер на php с использованием cURL с авторизацией?

    @theg4sh
    curl_setopt(($ch), CURLOPT_POSTFIELDS
    Скобки?

    Вы забыли поля _token и remember из формы.
    Ответ написан
  • Чем может быть вызвано странное поведение PHP при замене параметров через Nginx?

    @theg4sh
    По факту получается, что вы передаете строку php-конфига через fastcgi_param PHP_ADMIN_VALUE.
    Следовательно нужно придерживаться его стандарта и вероятно поэтому все, что было после точки с запятой интерпретировалось как коментарий и "; pinba.enabled=0" отбрасывалось. Попробуйте ради эксперимента заменить ";\n " на "\n", полагаю должно сработать.

    К тому же, не будет ли лучше/удобней разбить установку php-параметров на два nginx-параметра?
    fastcgi_param PHP_ADMIN_VALUE "open_base_dir=/var/www"
    fastcgi_param PHP_ADMIN_VALUE "pinba.enabled=0"
    Ответ написан
  • Как в php скрипте определить, что его запустил Cron?

    @theg4sh
    Насколько знаю, при запуске "вручную" появляются переменные $_SERVER['argc'] и $_SERVER['argv'], также появляются другие переменные окружения пользователя.

    Следовательно:
    if (isset($_SERVER['argc']) && isset($_SERVER['argv'])) {
        define('SELFSERVICE', 1);
    }
    
    if (defined('SELFSERVICE')) {
        echo "I'm a service";
    } else {
        echo "I'm a web-dispatcher";
    }


    Ну или запускать скрипт через http-запрос
    curl "http://name.site/script.php?cron=1"
    Ответ написан
    Комментировать
  • Передача своих данных в HTTP-заголовках в ответ на Ajax-запрос - как?

    @theg4sh
    Вы может использовать все заголовки, которые описаны в RFC HTTP
    https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

    Так же для запроса с кастомным именем HTTP-запроса стоит взглянуть сюда:
    https://developer.mozilla.org/en-US/docs/Web/HTTP/...
    Да и в целом ознакомиться с
    https://developer.mozilla.org/ru/docs/Web/HTTP/%D0...

    Примеров полно при гуглении "ajax custom request".
    Ответ написан
    Комментировать
  • Пароль не проверяется в базе данных.Как устранить проблему с авторизацией?

    @theg4sh
    Если есть возможность использовать меньше запросов - используйте ее.
    var_dump - так же хорош для начинающих, это как перочинный ножик который всегда и везде с вами, но не забывайте, что есть и другие способы отладки - xdebug, например.
    <?php
    if (isset ($_POST['done'])) {
        $login = $_POST["login"];
        $password = $_POST["password"];
        if(empty($login)) {
            exit ("Вы не ввели логин.");
        }
        if(empty($password)) {
            exit ("Вы не ввели пароль");
        }
        $mysqli = new mysqli ("localhost", "root", "", "ural_steel");
        $q = $mysqli -> prepare ("SELECT `password` FROM `registr` WHERE `login`=?");
        $q->bind_param('s', $login);
        $result = $q->execute();
        $row = $q->fetch();
        if ($row !== NULL) {
            if (crypt(md5($password)) == $row['password']) {
                exit ("Поздравляю, вы вошли!");
            } else {
                exit ("Пароль не верный!");
            }
        } else {
            exit("Такого логина не существует!");
        }
    
    }
    ?>
    Ответ написан
    Комментировать
  • Получить изображение с ip камеры в режиме реального времени на php или js?

    @theg4sh
    В свое вермя делал обертку на php для стриминга на сайте с китайской ip-камеры с RTMP-авторизацией.
    К сожалению, кусок кода реализующий данную задачу утерян во времени.
    Пользовался curl и документацией RFC по протоколу RTMP.

    На мой взгляд, будет лучше и относительно проще реализовать с помощью модуля nginx https://habrahabr.ru/post/236359/ , тогда на стороне клиента достаточно будет сделать запрос для получения картинки через AJAX, да и использовать для стриминга через будет проще.
    Ответ написан
    Комментировать
  • Почему php форма отправляет только "запомненные" данные на мейл?

    @theg4sh
    Для начала нужно найти место потери данных. Сделайте
    $('#form').submit(function(e) {
          var $form = $(this);
          console.log($form.serialize());
          return false;
          ...
    });

    В консоль должны упасть сериализованные данные.
    Далее если все ок, то смотрим в FireBug вкладку Net и глядим, все ли данные попадают в тело запроса.
    Ну и наконец смотрим что приходит на сторону сервера через
    var_dump($_POST); die();
    Ответ написан
    Комментировать
  • Как запустить парсер Кинопоиска?

    @theg4sh
    Для начала Warning - не Error.
    Какая частота запросов? Вполне возможно (даже скорее всего) Кинопоиск Вас попросту блокирует, выдавая пустую страницу... поэтому и список актеров в результате не массив и выдается это предупреждение.
    Попробуйте подождать минуту-другую и повторить запрос, если все ок - значит блокировака на лицо.
    Ответ написан
    Комментировать
  • Как в PHP сделать правильнее выполнение условия при множестве схожих условий?

    @theg4sh
    Да, использование массива это один из самых простых способов.
    Но все же конструкция из if будет быстрее - в случае с массивам помимо выделения памяти под строки, будет также аллоцироваться память под сам массив, тоже с деаллокацией.
    На одном условии это не заметно, только в масштабах крупного проекта сотни лишних операций выделения памяти от каждого клиента ни к чему.

    Как альтернатива блокам из if - конструкция switch-case:
    switch($a){
    case "one":
    case "two":
    case "three":
      // your code
    }


    В случае использования поиска только простых строк можно воспользоваться трюком с strpos:
    if (strpos(":"+$a+":", ":one:two:three:space ship:") !== FALSE) {
      // your code here
    }

    в данном случае будет запущен всего один цикл поиска подстроки.
    Ответ написан
    Комментировать