Ответы пользователя по тегу PHP
  • Определенное RDS (запросы в секунду) в сервере очередей?

    konst20
    @konst20
    Программист, преподаватель, немного электронщик
    Средствами Gearman этого сделать, разумеется, нельзя - это явно внешняя по отношению к gearman задача.
    Главная идея - запустить весь поток через какой-то регулятор.
    Как бы я сделал.
    1) есть мастер-воркер, который добавляет задачи на сервер очередей на запрос к внешнему АПИ
    2) клиенты кидают в очередь не задачи на запрос к внешнему АПИ, а задачи на запрос к этому самому мастер-воркеру
    3) мастер-воркер, получив задачу, смотрит, не превышен ли поток, и, если превышен, ждет, не превышен - кидает в очередь задачу на запрос к внешнему АПИ
    Ответ написан
    8 комментариев
  • Как запускать параллельные задачи на PHP?

    konst20
    @konst20
    Программист, преподаватель, немного электронщик
    Лихая задача.
    Что бы вы ни делали, все будет ресурсозатратно, а ну ка, у вас в онлайне 1000 чел запустили по нескольку задач, которые делают по нескольку тысяч действий ))
    Не вижу проблемы в том, чтобы запустить много воркеров. Вы можете использовать вот эту мою разработку для автоматического запуска и остановки воркеров, там есть класс, из которого можно управлять воркерами.
    https://habrahabr.ru/post/212761/
    Алгоритм: появилась задача - бросаем ее на сервер очередей - запускаем один воркер. Задача выполнилась - останавливаем один воркер.

    Воркеры можно располагать на разных серверах. Можно мониторить, на каком сервере по скольку воркеров запущено, и догружать свободные.
    Таким образом, задача с помощью Gearman превращается в распределенную.
    Сам по себе Gearman ресурсов почти не потребляет. Ресурсы будут потреблять воркеры, но от этого вам никак вообще не уйти - воркеры ведь решают задачу, чем бы вы ни решали задачу, вы потребите те же самые ресурсы.

    Еще. Вам не нужно для распределения задачи несколько Gearman. Вам нужен один сервер очередей Gearman, на котором регистрируются воркеры с разных серверов. Вообще введите в курс задачи подробнее где-то в личке, я смогу помочь более предметно.
    Ответ написан
    2 комментария
  • Как добавить переменную в суперглобальный массив $_SERVER?

    konst20
    @konst20
    Программист, преподаватель, немного электронщик
    Давайте называть вещи своими именами.
    $_SERVER - это переменная
    внутрь нее нельзя добавить переменную
    Но $_SERVER - это массив, поэтому можно добавить значение внутрь массива с каким-то ключом.
    Эта переменная уже существует независимо от воли программиста, в массиве $_SERVER есть какие-то ключи и значения. И, конечно же, можно изменять этот массив как нравится.

    Изменить значение:
    $_SERVER['DOCUMENT_ROOT'] = 'foo';
    $_SERVER['PROTOCOL'] = 'bar'


    Добавить пару "ключ-значение":
    $_SERVER['bar'] = '132';
    $_SERVER['foo'] = 111;


    Удалить значение:
    unset($_SERVER['DOCUMENT_ROOT']);
    или грохнуть весь массив $_SERVER
    unset($_SERVER);

    Все как с обычным массивом. Туда же все суперглобальные массивы, коих есть несколько:
    php.net/manual/ru/language.variables.superglobals.php

    Кстати, "суперглобальные" не означает никакой магии. Просто при использовании суперглобальных переменных внутри ф-и не нужно писать вот такого например
    global $_SERVER
    global $_POST
    Ответ написан
    Комментировать
  • Как узнать, использует ли сайт API?

    konst20
    @konst20
    Программист, преподаватель, немного электронщик
    Это неправильный вопрос.
    Вы можете узнать снифферами:
    - какие JS библиотеки/фреймворки используются
    - веб-сервер (Apache/Nginx/IIS)
    - иногда платформу (Debian/Fedora/Windows etc.)
    - иногда язык серверной части (PHP/node.js etc.)
    - иногда серверный фреймворк (Yii/Zend etc.)
    - практически всегда - CMS, если она есть конечно (Wordpress/Joomla/Magento etc)
    Используйте вот такие снифферы (это расширения для Chrome):
    Wappalyzer
    Ghostery
    Ответ написан
  • Имеет ли право php скрипт по умолчанию читать-записывать в файл?

    konst20
    @konst20
    Программист, преподаватель, немного электронщик
    Постановка вопроса некорректная.
    Скрипт имеет право на все что угодно, но делать это самое все что угодно он будет от имени пользователя веб-сервера, www-data например (это типично для debian)

    100% - если вы в скрипте создаете файл, например, file_put_contents('my_file.txt', 'hello world'), то с файлом 'my_file.txt' ваши скрипты смогут делать все что угодно.
    99% - вы сможете читать любые файлы
    А вот если вы попробуете записать в уже имеющийся файл или папку, то тут все зависит от того, какие права и кто создал эти файл/папку.

    .htaccess тут вообще ни при чем
    Ответ написан
    Комментировать
  • Почему не работает php код?

    konst20
    @konst20
    Программист, преподаватель, немного электронщик
    Конкретизируйте вопрос.
    Что значит "не работает"? Fatal Error, или другие ошибки, или не работает логика, то есть подали то-то и то-то, ожидали вот это, а на выходе - совсем другое.

    Белый экран - это 99% отключен вывод ошибок на уровне php.ini. Включите их, гугл в помощь - "php отображение ошибок"

    Я бы сделал вот что.
    1. Убедился. что все ОК с путем к файлу
    2. проверил работу кусков кода между if-ами
    3. и потом погрузился бы в раздумия, потому как все остальное в коде очевидно

    P.S. сори, а зачем эти пляски с fopen и пр.? Есть же file_get_contents() без всяких $fh

    P.P.S. и да, раз такое веселье, разберитесь с проверкой isset($_POST['Check']), иначе код будет сыпать нотайсы
    Ответ написан
    Комментировать
  • Какой парсер HTML на PHP выбрать?

    konst20
    @konst20
    Программист, преподаватель, немного электронщик
    Simple HTML DOM
    Удобный скрипт, но маленький выбор селекторов


    Простите, не соглашусь
    библиотека понимает, например, такое
    $css = "div.class1 p.class2 a" - элемент a, который внутри p class="class2", который внутри div class ="class1"
    при этом между указанными элементами могут быть еще элементы.
    Селекторы библиотека понимает любые, с чего вы взяли "маленький выбор селекторов".
    С Simple HTML Dom есть некоторый гемморой на старте, также нужно отслеживать ситуацию, когда элемент не найден, но нареканий у меня нет.
    Ответ написан
    Комментировать
  • Каков план личностного развития PHP программиста с нуля?

    konst20
    @konst20
    Программист, преподаватель, немного электронщик
    Есть опыт помощи таким начинающим.
    реальный срок до запуска джуниора - полгода, никого не слушайте.

    Важные моменты
    веб-программирование на базе PHP - это стек технологий: PHP/SQL/CSS/HTML/JS + Linux хотя бы азы + знание важных инструментариев (FTP, Git/SVN, работа с БД)
    чистый PHP плюс даже все перечисленное выше - не особо нужно и не интересно. Нужно знание конкретных платформ: фреймворков и/или CMS. (Почитайте вакансии на Хантиме по запросу PHP, обратите на это внимание). Навскидку самые востребованные (спорно конечно): Yii фреймворк, CMS Битрикс и Wordpress.

    Как начать?
    Смело на амбразуру!
    1) Установите у себя рабочую среду LAMP/WAMP - Apache, PHP, MySQL. Для этого возьмите пакет Denwer или OpenServer, что больше понравится. Сделайте Hello World просто как HTML, потом на PHP, потом алертом на JS. Порадуйтесь.
    Установите все редакторы кода. Кто там вам будет рекомендовать блокнот или notepad++ - не слушайте. Варианты: если машина мощная (4+ Гб памяти и пр.), берите редактор phpStorm (для php/html/css/js). Если не очень мощная - берите komodo edit. Для работы с БД инструмент встроен в Denwer/OpenServer, это phpMyAdmin
    2) Идеально, если вы договоритесь сделать кому-нибудь сайт. Бесплатно или за небольшую плату. Если нет - сами себе поставьте задачу: сайт про котиков/про детей etc. Красивый сайт, с галереей, с эффектами, с материалами
    Возьмите CMS Wordpress и попытайтесь сделать сайт у себя на компьтере. Настоящий сайт, во всей красе, как вы хотите. Правьте его, смотрите код, экспериментируйте. Сообщество огромное, вы найдете ответы на все свои вопросы
    Потратьте чуть денег, купите себе домен и хостинг, залейте сайт на хостинг.
    Порадуйтесь. Похвастайтесь.
    3) Ищите в сети тестовые задачи и решайте их, изучайте материалы собеседований, вопросы - их много.
    4) Зарегистрируйтесь на odesk.com под каким-то фейковым email, пройдите тесты по PHP, CSS, HTML, jQuery, Wordpress, а во время прохождения делайте скриншоты вопросов. Потом изучайте эти вопросы, ищите ответы, далеко не обязательно на все. Тесты вы, конечно, не пройдете, но вам нужны только вопросы.
    5) Постоянно следите за вакансиями "PHP-программист", "веб-программист" на Хантиме, на hh.ru и подобных ресурсах.

    И да, как только напишете первую строку кода - начните читать про Git. Как будете готовы - сразу внедрите у себя Git, вы будете очарованы его возможностями.

    Вот как раз на полгода.
    После этого у вас появится масса информации, и дальше вы сами сориентируетесь.
    Ответ написан
    11 комментариев
  • Простейшая очередь задач на PHP?

    konst20
    @konst20
    Программист, преподаватель, немного электронщик
    А на том же Gearman нужно писать гору лишнего кода

    Это еще почему?
    $client = new GearmanClient();
    $client->doBackground(<function>, <data>);

    Как раз пара строк кода.
    Ответ написан
    Комментировать
  • Как вы организовываете модульность в ваших PHP-проектах?

    konst20
    @konst20
    Программист, преподаватель, немного электронщик
    Вместо всей этой пачки инклудов вставьте куда-нибудь вот такое
    function class_loader($className){
          include_once $className.'.php';
    }
    
    spl_autoload_register('class_loader');

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

    konst20
    @konst20
    Программист, преподаватель, немного электронщик
    Я обращу внимание на то, что предлагавшиеся выше решения в духе "бегите по строкам" и "построчно сранивайте" в данном случае имеют сложность до О(n*n), то есть придется сделать 100000*100000 = примерно 10 миллардов операций.
    боюсь, это может затянуться на несколько часов.
    Ответ написан
  • Как средствами php сравнить два больших массива?

    konst20
    @konst20
    Программист, преподаватель, немного электронщик
    1. Формируем массив array1 - имена файлов в папке - ф-я scandir

    2. Формируем массив array2 - названия в БД, выборка наподобие
    SELECT image_name FROM my_db
    выбираем только имена image_name, то есть названия.

    Форматы названий должны совпадать, то есть одинаковые картинки и в БД, и в папке должны иметь абсолютно одинаковые имена, с учетом того, что файлы в папке имеют еще и расширения. Если что - приводим строковыми ф-ями к одинаковому формату (отрезаем расширение файла например)

    3. Ф-я array_diff(array1, array2) даст те элементы, которые есть в массиве array1, но нет в массиве array2.
    Ответ написан
    Комментировать
  • Как реализовать парсер товаров из интернет магазина средствами PHP?

    konst20
    @konst20
    Программист, преподаватель, немного электронщик
    Я активно использовал Zend_Dom_Query (работает без самого ZendFW, несколько файлов от фреймворка нужно подключить будет к проекту). Просто, понятно и быстро
    http://framework.zend.com/manual/1.12/ru/zend.dom.query.html

    Вот структура нужных файлов/папок от Zend
    4fdb361154d7f5590882c8f78a54e8dd.png

    и пример кода (кусок парсера хорошей погоды)
    /**
         * Получение погодных "значений"
         * @return array
         */
        protected function parse_weather_page(){
    
            $page = $this->get_page_with_weather();
    
            $weather = array();
            $zDom = new Zend_Dom_Query($page);
            $elements = $zDom->query($this->weather_css);
            foreach($elements as $dom_element){
                $weather[] = $dom_element->getAttribute('title');
            }
    
            return $weather;
        }
    Ответ написан
    Комментировать
  • Динамическое создание классов (PHP)?

    konst20
    @konst20
    Программист, преподаватель, немного электронщик
    Присоединяюсь к мнениям о том, что:
    - обязательно проверку class_exists()
    - затея спорная и из контекста/кода никак не следует ее оправданность.

    Приведу пару примеров оправданности динамического создания классов и eval()
    1) есть пачка клиентов (в смысле заказчиков). Для каждого в коде - свой класс, причем унификация невозможна: методы этих классов называются одинаково, смысл, входные и выходные параметры одинаковые, но реализованы для всех весьма по-разному в силу индивидуальных особенностей.
    есть обработчики на сервере очередей, они универсальные. Обработчику передается имя класса, он создает объект и работает так, как нужно для данного заказчика.

    2) есть псевдокод с однозначной логикой, заведомо безопасный. Для выполнения его в PHP заменяем просто через str_replace все согласно синтаксису PHP, и выполняем через eval()

    Для того, чтобы указанное выше веселье можно было спокойно дорабатывать, сделаны доп. методы тестирования и обработки ошибок.
    Ответ написан
    4 комментария
  • PHP и Gearman, что и как?

    konst20
    @konst20
    Программист, преподаватель, немного электронщик
    Пользуясь случаем, хочу еще узнать: если вы имели дело с этой темой, какое из решений вы выбрали для организации выполнения отложенных задач? Я в настоящее время выбираю между RabbitMQ, Gearman и php-resque.

    Gearman — великолепен. Я свой выбор сделал
    Ответ написан
    Комментировать
  • PHP и Gearman, что и как?

    konst20
    @konst20
    Программист, преподаватель, немного электронщик
    Есть ли стандартный способ из клиентского скрипта посмотреть, что сейчас происходит с данной задачей, не запуская ее на выполнение вновь. если она выполнена?

    Еще момент: воркер может в процессе выполнения передавать клиенту промежуточные данные.
    Посмотрите, в моей публикации есть пример с кодом и видео
    Ответ написан
  • PHP и Gearman, что и как?

    konst20
    @konst20
    Программист, преподаватель, немного электронщик
    — этот вопрос вытекает из предыдущего: понятно дело, когда клиент — демон, он поставил задание и просто ждет результата, или регулярно опрашивает Gearman на предмет результата…

    Я делаю «в лоб» — как только задачи определенной группы начали выполняться, я делаю инкремент одной переменной в БД, как только задача завершается — делаю декремент. В итоге, когда хоть какие-то задачи выпоняются — переменная отлична от 0, как готовы все — там 0. Из веб-приложения аяксом просто опрашиваю БД
    Ответ написан
    Комментировать
  • PHP и Gearman, что и как?

    konst20
    @konst20
    Программист, преподаватель, немного электронщик
    их можно запускать из консоли или скриптом.
    кстати, я готовлю новую публикацию — веб-интерфейс для сервера очередей. Он давно готов, сыроват, но рабочий, я его юзаю, руки не доходят
    Вот код
    code.google.com/p/gearman-monitor-and-control/
    Ответ написан
    Комментировать
  • PHP и Gearman, что и как?

    konst20
    @konst20
    Программист, преподаватель, немного электронщик
    у меня демоны — только воркеры
    Ответ написан
    1 комментарий
  • PHP и Gearman, что и как?

    konst20
    @konst20
    Программист, преподаватель, немного электронщик
    Доброго :)
    Отвечаю на вопросы

    — чем концептуально отличается GearmanJob от GearmanTask и какой из них следует использовать для оформления отложенного задания?

    Job — это то, что поступает воркеру.
    Task — это то, что передает клиент

    То есть клиент кидает Task на сервер очередей, там два агрумента — имя ф-и и сериализованные данные (в виде строки).
    Если у воркера есть ф-я, указанная в Task, то есть он готов ее обработать, то он принимает задачу, а данные получает в виде Job.
    Извлекаются данные вот так (кусок реального кода):

    function create_campaign(GearmanJob $job){

    $rawData = $job->workload();
    $data = unserialize($rawData);


    А передаются на сервер вот так (я использую не Task, а чуть проще — просто doBackground)

    $gclient = new GearmanClient();
    $gclient->addServer('localhost');

    $new_offers = $client_db->select_new_offers();

    if(is_array($new_offers) AND count($new_offers) > 0){
    foreach($new_offers as $item){
    $data_for_gearman = array(
    'item' => $item,
    'client_class_name' => 'axxa',
    );
    $gclient->doBackground('new_offer', serialize($data_for_gearman));
    }
    }

    echo «Для добавления товаров на сервер очередей добавлено ».count($new_offers)." задач \n";
    Ответ написан
    1 комментарий