• Как записать массив в БД?

    iqw
    @iqw
    Serior Software Engineer
    Поле id должно быть auto increment (в базе), и его необходимо убрать из запроса, id будет генерироваться на уровне базы
    Ответ написан
    1 комментарий
  • Как программно добавить товар на olx.ua?

    iqw
    @iqw
    Serior Software Engineer
    Так как olx не имеет api - нужно писать софт, который залогинится от реального пользователя и get-post запросами будет поочередно постить обьявления одно за одним, только могут быть подводные камни (не исследовал систему безопасности olx, детальнее не скажу) в виде CSRF токенов на формах, капч, порога обьявлений на единицу времени.
    Ответ написан
    Комментировать
  • Как вывести данные из бд, при использовании Smarty?

    iqw
    @iqw
    Serior Software Engineer
    Сматри всего лишь шаблонизатор для данных, он не умеет фетчить данные из базы, это за рамками его ответственности. В Вашем случае нужно сначала выполнить запрос, который вернет вам 1 запись из базы (используя заранее созданное подключение mysqli), потом эти данные указать в $smarty->assign (вообще assign по факту прикрепляет переменную в шаблон, первый параметр - название этой переменной в шаблоне, второе - ее значение, которое должно там вывестись).
    Если сделать более универсально - можно вытянуть 1 запись из бд, получить ее в виде assoc массива и выполнить примерно следующее:
    $row = //код выборки записи из базы//;
    
    foreach ($row as $column => $value) {
            $smarty->assign($column, $value);
    }


    таким образом Вы динамически назначите шаблону столбцы из записи в базе в виде переменных.
    Ответ написан
    Комментировать
  • Как называется сеть из тысяч компьютеров в разных уголках планеты, НО НЕ ОБЩЕДОСТУПНЫЕ, а принадлежащие одному?

    iqw
    @iqw
    Serior Software Engineer
    Есть кластеры (несколько серверов одного приложения работающих сообща над вычислениями, распределяя их),
    есть CDN-сети серверов, для максимально быстрой доставки контента локально пользователям.
    Но в целом, для тысяч компьютеров какое то обобщение совершенно неприменимо, так как разные серверы выполняют разные функции и на базе этого происходит их классификация в сети.

    P.S. Ботнет это вообще не из той оперы, это не сервера в основном, а пользовательские компьютеры-рабочие станции, зараженные ПО для удаленного доступа, для любой полезной работы не используются, так как заведомо это противозаконно.
    Ответ написан
    Комментировать
  • Mysql. Как обойти ошибку “Lock wait timeout exceeded; try restarting transaction”?

    iqw
    @iqw
    Serior Software Engineer
    Взято отсюда:

    1) Войдите в MySQL
    mysql -u your_user -p

    2) Посмотрите список залоченых таблиц:
    show open tables where in_use>0;

    3) Посмотрите список процессов (один из них лочит вашу таблицу):
    show processlist;

    4) Убейте этот процесс (процессы)
    kill <put_process_id_here>;
    Ответ написан
    1 комментарий
  • Как уменьшить размер изображения в php?

    iqw
    @iqw
    Serior Software Engineer
    Без уменьшения качества - никак, главное чтобы уменьшение качества не повлияло на саму картинку (ее восприятие), вот есть небольшой гайд, (отсюда):

    <?php 
    	function compress($source, $destination, $quality) {
    
    		$info = getimagesize($source);
    
    		if ($info['mime'] == 'image/jpeg') 
    			$image = imagecreatefromjpeg($source);
    
    		elseif ($info['mime'] == 'image/gif') 
    			$image = imagecreatefromgif($source);
    
    		elseif ($info['mime'] == 'image/png') 
    			$image = imagecreatefrompng($source);
    
    		imagejpeg($image, $destination, $quality);
    
    		return $destination;
    	}
    
    	$source_img = 'source.jpg';
    	$destination_img = 'destination .jpg';
    
    	$d = compress($source_img, $destination_img, 90);
     ?>
    Ответ написан
    Комментировать
  • Правильно ли я делаю регистрацию?

    iqw
    @iqw
    Serior Software Engineer
    Из официальной документации PDO (php.net/manual/ru/pdo.prepared-statements.php):
    $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
    $stmt->bindParam(':name', $name);
    $stmt->bindParam(':value', $value);
    
    $stmt->execute();


    Тоесть Вы запрос подготовили, но не выполнили. Так же нужно заменить прямую вставку переменной - параметром, который позже установить с помощью метода bindParam. С точки зрения логики работы - все должно получиться, с точки зрения архитектуры функционала аутентификации - Ваш код небезопасен, монструозен и непереносим, советую использовать готовые библиотеки для реализации данного функционала, или же следовать гайдам, например - https://daveismyname.blog/login-and-registration-s...
    Ответ написан
    Комментировать
  • Что нужно указать, чтобы на всех страницах сайта, кроме главной, были свои значения CSS для элемента?

    iqw
    @iqw
    Serior Software Engineer
    На главной в <body> добавьте class="main-page" (или типо того, как вам удобнее), на остальные страницы - например просто class="page"
    Потом в css происходит разграничение стилей:
    .simple {
    //Базовые стили для всех вариантов .simple
    }
    
    .page .simple {
    //Дополнительные стили для всех страниц
    }
    
    .main-page .simple {
    //Дополнительные стили для главной страницы
    }
    Ответ написан
    Комментировать
  • Как определить конечный сайт через curl?

    iqw
    @iqw
    Serior Software Engineer
    Если нюансы HTTP редиректов еще можно учесть - то javascript редиректы - проблема, там в коде может и не быть ссылки редиректа, а она может получаться с другого хоста аякс запросом (рекламные сети, например так делают). Чтобы пройти по всем редиректам - необходимо качественно выполнять все js на страницах (используя какие-то движки рендера js, например v8 (https://developers.google.com/v8/?hl=ru)
    Ответ написан
    Комментировать
  • Как в symfony3 указать префикс таблиц бд?

    iqw
    @iqw
    Serior Software Engineer
    Загуглил - нашел только пример из официальной документации, где показан кусок кода, которым это можно сделать. Так же здесь - более подробное описание этого куска кода. https://stackoverflow.com/a/8366548

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

    iqw
    @iqw
    Serior Software Engineer
    Я бы делал следующим образом: сделал бы систему ивентов, например - создалась страница, добавлен коммент, и когда происходит одно из этих собитый - тригерится ивент, обработчик его ловит, пишет основные данные в отдельную таблицу (что-то типо EventLog), поля, которые содержит эта таблица - user_id(int), date(datetime), event_type(tinyint), triggered_on(int), где user_id айди юзера, с привязкой его в энтити напрямую, date - дата события, event_type - константа типа ивента (описать можно константами или другим удобным способом, я бы, например, делал дискриминатором по полю event_type с под-сущностями, каждая из которых будет иметь привязку на свой ожидаемый тип сущности, наследуя геттеры, тут есть большое пространство для улучшения взаимодействия), triggered_on - id записи в базе, которая была создана-обновлена etc. После этого имеем список всего, что делал юзер, таблица достаточно простая, логирование можно расширять.
    Данный этап вносит некую денормализацию данных, чтобы упростить их поиск.

    Этап второй - выборка. Тут строится нехитрый запрос, который исключает данные, что этому пользователю не надо.
    Джойном подгружается сущность юзера, остальные данные можно получить на момент рендера этого списка (если есть дискриминатор, предложенный выше, запросив что-то типо {{ eventLog.triggeredOn.title }}).

    Пример - выбираем все данные в каком то спектре (пагинация) с иннерджойном на таблицу подписок юзера на другого юзера, выйдет что ивенты юзеров, на которые текущий юзер не подписан не попадают в выборку уже на уровне самого запроса, что позволяет пагинировать нормально, не вгоняя в память огромного числа данных.
    Этот механизм можно заточить под множество вариаций, если надо больше перфоманса - тут надо думать в сторону грамотного распределения данных, например слать их в какой-то elasticsearch, но потом запросы становяться сложнее.

    В любом случае, построение эффективной бизнес-логики - зависит от всех нюансов задачи, того финальный результат составлять Вам, такие задачи никто не решит в ответ на вопрос на Question-Answer сайте :)
    Ответ написан
    Комментировать
  • Создание крона?

    iqw
    @iqw
    Serior Software Engineer
    * * * * * /usr/local/bin/php /home/c/****/server.php
    запуск каждую минуту

    0 * * * * /usr/local/bin/php /home/c/****/server.php
    запуск каждый час (вариант, который Вы прописали)

    Содержимое самого файла server.php практически не важно, если он не успеет отработать за минуту - крон запустит новый инстанс паралельно
    Ответ написан
    7 комментариев
  • Разъяснения по работе RabbitMQ?

    iqw
    @iqw
    Serior Software Engineer
    1. Трактовка немного неверна, в кролике нету воркеров-задач, это из gearman. Там есть сообщения, обменники, очереди, консюмеры и продюсеры. Сообщения это не всегда задача, это может быть поток данных с другого приложения (не имеющего доступ к СУБД) для сохранения. В зависимости от технологий, которые Вы используете консюмеры выглядят немного по разному, например в php - действительно надо запускать каждый консюмер в 1 процессе (комманда), в java - можно запустить 1 процесс, который будет консюмить очередь и передавать сообщения в треды для обработки паралельно (вместо нескольких процессов). Разрулить ситуацию с поддержанием в запущенном состоянии нескольких комманд-консюмеров (в несколько процессов каждая) можно очень просто - supervisord. Это линуксовый софт, который конфигаеться на запуск определенной консольной команды и на количество ее инстансов, и следит за всеми. Выходит что у вас на каждый тип консюмера будет только по 1 supervisord конфигу, остальную работу по поддержанию в запущенном состоянии выполнит он. (Естесственно, если речь идет о пхп - надо хорошенько подебажить код консюмеров, чтобы избежать memory-leaks).

    2. Зависит от мощностей сервера, нормальная практика - 1 реббит сервер для нескольких проектов, который позже сможет перерости в кластер (на определенных нагрузках), но и на машину с сайтами можно попробовать его насетапать и использовать как Вы и думали - с префиксами.

    3. Очереди нужны там, где вы ощущаете что они помогут вам ускорить/стабилизировать приложение, пробуйте, экспериментируйте, и Вы увидите насколько хорошо кроль применим для Вашего типа задач.

    P.S. Я только когда дописал ответ увидел что вопрос 2016 года, так что извините, если тема уже не актуальна)
    Ответ написан
    Комментировать
  • The server responded with a status of 404 (not found)?

    iqw
    @iqw
    Serior Software Engineer
    Думаю проблема в document_root, в openserver его необходимо сменить на /web, а исполняемый файл указать не index.php, а app.php (или app_dev.php). Альтернативно - web/app.php можно переименовать в web/index.php, тогда поменяв document_root все должно работать
    Ответ написан
    Комментировать
  • Как задеплоить сайт на Symfony3 с MySQL?

    iqw
    @iqw
    Serior Software Engineer
    Думаю главная проблема бесплатного хостинга - невозможность сменить document_root, для symfony document_root должен указывать на подпапку web и искать файл app.php, а по дефолту хостинги ищут index.php в корне папки. Если web/app.php еще можно переименовать, то с document_root необходимо найти хостинг, позволяющий его менять
    Ответ написан
    Комментировать
  • Как определить редирект на сервис?

    iqw
    @iqw
    Serior Software Engineer
    На самом деле - надежно никак. Можно написать воркараунд, если сервис other.com оставляет после себя какие-либо зацепки (например передает кастомные хедеры, которых при прямом запросе на site.com нет). В случае если все чисто и зацепок нет - то ничего с этим не поделать, увы.
    Ответ написан
  • Как смотреть PHP логи в реалтайме через консоль Windows [СРОЧНО]?

    iqw
    @iqw
    Serior Software Engineer
    Можно использовать Power Shell (что-то на подобии терминала linux в windows), там есть комманда tail, которая как раз позволяет читать лог в реальном времени. Документацию можно найти тут - https://blogs.technet.microsoft.com/rmilne/2016/06...
    Ответ написан
    Комментировать
  • Есть готовая библиотека для написания сценариев/логики бота?

    iqw
    @iqw
    Serior Software Engineer
    Для реализации функционала бота хорошо подойдут библиотеки автоматического функционального тестирования, например Selenium Webdriver (www.seleniumhq.org/download ), Codeception (codeception.com ). Причем первый подойдет Вам больше, так как используя реальный браузер может реально отрабатывать JS, кликать по кнопкам, читать формы и много-много другого.
    Суть их работы в чем - сценарий пишется вручную на php-коде (или на любом другом языке в случае с Selenium Webdriver). Сценарии собой представляют последовательность действий, например - открыть страницу, кликнуть по кнопке, считать данные, которые вылезли в попапе, ввести другие данные, нажать кнопку сохранения, проверить что все сработало. Все действия сценария выполняются согласно функциональности выбраной библиотеки и с помощью xpath-css селекторов (для поиска блоков на целевой странице).
    Ответ написан
  • Как при клике изменить число в базе данных?

    iqw
    @iqw
    Serior Software Engineer
    Функция myAlerts() в данной реализации (onclick атрибут) должна послать асинхронный запрос на сервер, который уже сделает запись в базу.

    Так как javascript выполняется в браузере уже после выполнения кода на сервере - единственный способ сделать запись в базу - AJAX (еще есть вебсокеты, но это более сложная тема).

    https://ru.wikipedia.org/wiki/AJAX

    Обработчиком этого запроса может служить выделенный файл php, или роут (если Вы используете фреймворк)
    Ответ написан
    Комментировать
  • Как называется программа, которая перехватывает данные?

    iqw
    @iqw
    Serior Software Engineer
    Есть прикольный софт, BurpSuite называется. Ставишь проксю на любой программе на локалхост, и он отлавливает и позволяет модифицировать все запросы.
    Ответ написан