• Стоит ли учить Ruby и Rails в 2016 году?

    LINKeRxUA
    @LINKeRxUA
    ИМХО: PHP разработчиков намного больше чем Ruby. Соответственно и конкуренция на Ruby меньше == стоимость за работу больше. Плюс ко всему математичиские задачи Ruby более быстро обрабатывает. elliottback.com/wp/ruby-vs-php-performance-revisited
  • Что нужно освоить веб разработчику чтобы облегчить себе жизнь?

    LINKeRxUA
    @LINKeRxUA Автор вопроса
    Я же писал "..чем пользуетесь вы помимо знаний в своей области?.."
    Имеется ввиду, помимо знаний в программировании и языках разметки.
  • Как перевести таблицу (типа id, pid, name) в Nested Sets?

    LINKeRxUA
    @LINKeRxUA
    Ооо.. спасибо!!! По этому запросу немного больше информации чем по тех - что я искал!
  • Не могу разобраться с сессией?

    LINKeRxUA
    @LINKeRxUA
    Я не думаю что смогу вам помочь,кроме как посоветовать внемательно изучить и проанализировать логику работы своего кода, убедиться строчка за строчкой что вы делаете все как в примерах тех.доков на офф. сайте. Убедитесь что вы используете только стандартный модуль, что сессия стартует раньше чем вы к ней обращаетесь.
  • Не могу разобраться с сессией?

    LINKeRxUA
    @LINKeRxUA
    тут уже нужно смотреть по коду. я думаю что у вас скорее всего из-за неправильной работы с модулем сессии. Вы раньше работали с сессиями через Code Igniter ? Или это ваш первый опыт?
  • Kohana Framework. Как кешировать роут?

    LINKeRxUA
    @LINKeRxUA Автор вопроса
    Ок. Спасибо за консультацию!
  • Kohana Framework. Как кешировать роут?

    LINKeRxUA
    @LINKeRxUA Автор вопроса
    Я ожидал такого ответа) Все-таки прийдется на эти колеса ставить свой велосипед.
  • Kohana Framework. Как кешировать роут?

    LINKeRxUA
    @LINKeRxUA Автор вопроса
    Так в том то и дело, что он слишком простой механизм. Я думал что там будет что-то более серьезное.
  • Как сделать парсинг информации сайта?

    LINKeRxUA
    @LINKeRxUA
    Разрабатывал я когда-то универсальный кикабельный парсер веб-ресурсов с модулем паука на борту. Проект был коммерчески большего масштаба, по-этому мне кажется не хорошо выкладывать хорошо документированный ООП код в сеть в свободный доступ, все-таки денги за это платились не малые. Я поделюсь отдельными частями проекта:

    /**
    * Class Web_Processor - мультипоточный загрузчик!
    *
    * !!!!! - Будет зависать если идет работа с сессией! делдать session_write_close() перед вызовом!
    *
    */
    class Web_Processor {
    protected $conf;

    /** var \Web_Response[]*/
    protected $response = array();

    public function __construct(array $urls, Web_Configurator &$conf){//multi thread
    $this->conf = &$conf;

    $_autoreferrer = Kohana::$config->load('admin_/webloader.curl_autoreferer-X-val');
    $_follow_loc = Kohana::$config->load('admin_/webloader.curl_followlocation-X-val');
    $_max_redirects = Kohana::$config->load('admin_/webloader.curl_maxredirs-X-val');
    $_connection_timeout = Kohana::$config->load('admin_/webloader.curl_connectiontimeout-X-val');
    $_curl_timeout = Kohana::$config->load('admin_/webloader.curl_timeout-X-val');
    //
    $_autoreferrer = (bool) $_autoreferrer;
    $_follow_loc = (bool) $_follow_loc;
    $_max_redirects = (int) $_max_redirects;
    $_connection_timeout = (int) $_connection_timeout;
    $_curl_timeout = (int) $_curl_timeout;

    // инициализируем "контейнер" для отдельных соединений (мультикурл)
    $cmh = curl_multi_init();

    // массив заданий для мультикурла
    $tasks = array();

    // перебираем наши урлы
    foreach ($urls as $url) {
    // инициализируем отдельное соединение (поток)
    $ch = curl_init($url); //URL запроса
    // если будет редирект - перейти по нему

    curl_setopt($ch, CURLOPT_AUTOREFERER, $_autoreferrer); //для автоматической установки поля Referer: в запросах, перенаправленных заголовком Location:
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, $_follow_loc); //для следования любому заголовку "Location: ", отправленному сервером в своем ответе (учтите, что это происходит рекурсивно, PHP будет следовать за всеми посылаемыми заголовками "Location: ", за исключением случая, когда установлена константа CURLOPT_MAXREDIRS
    curl_setopt($ch, CURLOPT_MAXREDIRS, $_max_redirects); //Максимальное количество принимаемых редиректов. Используйте этот параметр вместе с параметром CURLOPT_FOLLOWLOCATION

    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //FIX для "HTTPS://" - без цього не хоче грузити контент

    curl_setopt($ch, CURLOPT_HEADER, 0); // TRUE для включения заголовков в вывод.

    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $_connection_timeout); // Количество секунд ожидания при попытке соединения. Используйте 0 для бесконечного ожидания.
    curl_setopt($ch, CURLOPT_TIMEOUT, $_curl_timeout); //Максимально позволенное количество секунд для выполнения cURL-функций
    //
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // TRUE для возврата результата передачи в качестве строки из curl_exec() вместо прямого вывода в браузер.
    curl_setopt($ch, CURLINFO_HTTP_CODE, true); // ВОЗВРАТ КОДОВ СОСТОЯНИЯ

    curl_setopt($ch, CURLOPT_PROXY, $this->conf->getProxyIP().":".$this->conf->getProxyPort()); //PROXY TODO UNCOMMENT
    curl_setopt($ch, CURLOPT_USERAGENT, $this->conf->getUserAgent()); //ПОДМЕНА БРАУЗЕРА
    if($referrer = $this->conf->getReferrer() !== false){ //REFERRER
    curl_setopt($ch, CURLOPT_REFERER, $referrer);
    }

    // добавляем дескриптор потока в массив заданий

    $tasks[$url] = $ch;
    // добавляем дескриптор потока в мультикурл
    curl_multi_add_handle($cmh, $ch);
    }

    // количество активных потоков
    $active = null;
    // запускаем выполнение потоков
    do {
    $mrc = curl_multi_exec($cmh, $active);
    // sleep(0.1);
    }
    while ($mrc == CURLM_CALL_MULTI_PERFORM);

    // выполняем, пока есть активные потоки
    while ($active && ($mrc == CURLM_OK)) {
    // sleep(0.1);
    // если какой-либо поток готов к действиям
    if (curl_multi_select($cmh) != -1) {
    // ждем, пока что-нибудь изменится
    do {
    $mrc = curl_multi_exec($cmh, $active);
    // получаем информацию о потоке
    $info = curl_multi_info_read($cmh);
    // если поток завершился
    if ($info['msg'] == CURLMSG_DONE) {
    $ch = $info['handle'];
    // ищем урл страницы по дескриптору потока в массиве заданий
    $url2 = array_search($ch, $tasks);
    // забираем содержимое
    $tasks[$url2] = curl_multi_getcontent($ch);
    $this->response[] = new Web_Response(
    $url2,
    curl_getinfo($ch), //headers
    curl_multi_getcontent($ch), //response body
    curl_errno($ch), //error code
    curl_error($ch) //error message
    );
    // удаляем поток из мультикурла
    curl_multi_remove_handle($cmh, $ch);
    // закрываем отдельное соединение (поток)
    curl_close($ch);
    }
    // sleep(0.1);
    }
    while ($mrc == CURLM_CALL_MULTI_PERFORM);
    }
    }

    // закрываем мультикурл
    curl_multi_close($cmh);

    // return $this->response;

    }

    public function results(){
    return $this->response;
    }

    }

    Потом сюда мы скармливаем разметку:

    protected static function toDOMXPath($html){

    $dom_doc = new DOMDocument("1.0", "utf-8");

    @$dom_doc->loadHTML( mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8') ); // otto.de - helps instead of $page_->document->encoding = 'UTF-8';

    $page_ = new DOMXPath($dom_doc);

    $page_->document->encoding = 'UTF-8';

    return $page_;

    }

    А так выглядит пример извлечения ссылок меню:

    protected function extractMenu_mainPage($html_content){

    $result = array();

    $xpath_code= '//div[@id="navigationWrp"]//ul[contains(@class, "firstRow")]/li/a';

    $DOMXPath = self::toDOMXPath($html_content);

    $elements = $DOMXPath->query($xpath_code);

    for($i=0; $i < $elements->length; $i++ ){

    $url = $elements->item($i)->getAttribute('href');

    $res = array(

    'anchor' => trim($elements->item($i)->nodeValue),

    'url' => 'https://www.otto.de'.$url

    );

    $result[] = $res;

    }

    return $result;

    }
  • Как правильно написать запрос sql для вывода данных из 2х таблиц?

    LINKeRxUA
    @LINKeRxUA
    "Как сделать правильный запрос?" - не будет такой вопрос возникать, если сделать правильную архитектуру БД
  • Award BIOS. Что значит сигнал?

    LINKeRxUA
    @LINKeRxUA Автор вопроса
    Это невероятно - но реально была проблема в клавиатуре!
  • Award BIOS. Что значит сигнал?

    LINKeRxUA
    @LINKeRxUA Автор вопроса
    Вечером попробую - дам знать о результатах. Но дело в том что если бы кнопка залипла - то в биосе я бы увидел анимацию переходов по меню, а так - могу только в лево, в право и вниз тыкать
  • Award BIOS. Что значит сигнал?

    LINKeRxUA
    @LINKeRxUA Автор вопроса
    На сколько я помню: Эти звуки происходят в момент "Detecting memory freequency 333" - или как-то так (сейчас на работе, по этому не могу точнее сказать). После прослушивания этой "полифонии" автоматом запускается биос. За этим ПК лично я - работаю редко. Поэтому сейчас могу ошибаться, но походу перестала работать кнопка "стрелка вверх" на подключенной USB клавиатуре. Может ли быть такое - что сам контроллер клавиатуры "сошел с ума" и находиться в полурабочем состоянии, и ПК конфликтует с этим устройством?