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

    @Paltinik Автор вопроса
    Наткнулся на пост где человек делал подобное, ссылка: тык
    ну я бы ещё к этому функционалу подключил мультикурл + поддержку прокси (есть отличная штука под это дело AngryCurl) на его базе я и делал свой парсер, только вместо crawler использовал DiDom.
    И ещё в своём парсере настройку для разных сайтов я закидывал в отдельный php файл, при запуске парсера я задаю параметры. Например ставлю на крон задание запускать скрипт каждую минуту такой командой:
    /parser.php https://toster.ru/

    первым делом проверяем в скрипте работает ли сейчас скрипт с этими параметрами, если работает то ничего не делаем. Контроль работы скрипта осуществляю лочкой файла, таким способом:

    $site=$argv[1];
    if(!$argv[1]) {
    $site = $_GET['site'];
    }
    flock($lock = fopen(__DIR__.'/parser/lock_files/'.md5($site),"w"),LOCK_EX|LOCK_NB) or die('ERROR: SCRIPT RUNNING...');


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

    В скрипте стоит неограниченное время выполнения, даже если скрипт упадёт, крон его практически сразу же и поднимет. Так же удобно что под каждый сайт можно в кроне задать разную частоту запуска парсера.

    Не знаю на сколько эффективно я сделал контроль работы скрипта отдельного экземпляра (через лочку файла) т.к. доступа к процессам например у меня нету на шаред хостинге, нашёл решение такое, попробовал = работает = меня устраивает.. может и всплывут какие то подводные камни хз, на данный момент полёт нормальный.

    Как вообще такая логика, может что то надо пересмотреть ?
    Ответ написан
    Комментировать
  • Почему этот скрипт забирают всю память?

    @Paltinik
    phpQuery скорее всего, у меня как раз таки недавно с этой библиотекой были проблемы с озу, в большом цикле забивалась вся память и скрипт слетал с ошибкой.
    Пруф скрин:
    5b16cad91617b139508747.jpeg

    попробовал без него, уровень потребления как был до старта скрипта, так и оставался..
    попробуйте nokogiri nokogiri github очень лёгкая библиотечка, но у меня с ней были проблемы с кодировкой.
    Нашёл для себя вариант DiDOM DiDOM github очень много вариантов работы с ней, вроде лучше чем pq...
    Ответ написан
    Комментировать
  • Как лучше сделать редирект?

    @Paltinik Автор вопроса
    Сделал на php

    $req = parse_url($_SERVER['REQUEST_URI']);
    $req = $req['path'];
    if ($req != '/') {
    $req = strtolower($req);
    $req = preg_replace('#//+#','/',$req);
    if ($req != '/') {
    $req = rtrim($req, '/\\');
    }
    }
    
    if ($_SERVER['REQUEST_URI'] != $req) {
      header('Location: '.$req,true,301);
      exit;
    }


    htacces
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^.* /index.php


    Норм ? или лучше подобные запросы в htacces обрабатывать (типа удаление слешей, query string и тд ..)?
    Ответ написан
    Комментировать
  • Цикличная запись из массива в файлы, как оптимизировать?

    @Paltinik Автор вопроса
    размер xml файла примерно 4-5 мб.. скрипт 1 раз в неделю запускается, а далее уже всё в статике хранится... я думаю статические файлы не создают нагрузки на хост? если сравнить html сайт и сайт который к примеру на mysql работает? так же во многих cms кеш в статику генерируется что бы запросы в бд не делать ?? почему тогда на файлах плохо ?? меня интересует сам процесс конструктора, как бы его оптимизировать что бы во время генерации файлов не так нагружало сайт ??
    Ответ написан
  • Как распарсить XML c последующей записью в json по кускам?

    @Paltinik Автор вопроса
    Получается такой массив
    59ec6826c1b0a063898184.jpeg
    Но мне не все данные из него нужны, [icon] => Array ( Array [stop] => вот эти не нужны к примеру... как их можно убрать?) ну или не убирать, как лучше в базу записать ? что бы было удобно посуточно выводить к примеру ?

    Кому несложно помогите )) или за мат. помощь сделать что бы всё красиво было, тут делов то на 5 минут)))
    что в php добавить что бы записать всё в бд )?

    <?php
    $xml = simplexml_load_file("xmltv.xml");
    $json = json_encode($xml);
    $array = json_decode($json,TRUE);
    
    print_r($array);
    
    ?>


    xml сократил для наглядности.

    <?xml version="1.0" encoding="utf-8" ?><!DOCTYPE tv SYSTEM "http://www.teleguide.info/download/xmltv.dtd">
    <tv generator-info-name="TVH_W/0.751l" generator-info-url="http://www.teleguide.info/">
    <channel id="1">
    <display-name lang="ru">Первый канал</display-name>
    <icon src="http://img.teleguide.info/channel/1.gif" />
    </channel>
    <channel id="2">
    <display-name lang="ru">Россия 1</display-name>
    <icon src="http://img.teleguide.info/channel/2.gif" />
    </channel>
    <programme start="20171016050000 +0300" stop="20171016090000 +0300" channel="1">
    <title lang="ru">Телеканал "Доброе утро" (12+)</title>
    <category lang="ru">Развлекательные</category>
    </programme>
    <programme start="20171016090000 +0300" stop="20171016091500 +0300" channel="1">
    <title lang="ru">Новости (12+)</title>
    <category lang="ru">Информационные</category>
    </programme>
    <programme start="20171016091500 +0300" stop="20171016095000 +0300" channel="1">
    <title lang="ru">Контрольная закупка (12+)</title>
    <category lang="ru">Познавательные</category>
    </programme>
    <programme start="20171016095000 +0300" stop="20171016105500 +0300" channel="1">
    <title lang="ru">Жить здорово! (12+)</title>
    <category lang="ru">Познавательные</category>
    </programme>
    <programme start="20171016105500 +0300" stop="20171016120000 +0300" channel="1">
    <title lang="ru">Модный приговор (12+)</title>
    <category lang="ru">Развлекательные</category>
    </programme>
    <programme start="20171016120000 +0300" stop="20171016121500 +0300" channel="1">
    <title lang="ru">Новости с субтитрами (12+)</title>
    <category lang="ru">Информационные</category>
    </programme>
    <programme start="20171016121500 +0300" stop="20171016150000 +0300" channel="1">
    <title lang="ru">Время покажет (12+)</title>
    </programme>
    <programme start="20171016150000 +0300" stop="20171016151500 +0300" channel="1">
    <title lang="ru">Новости с субтитрами (12+)</title>
    <category lang="ru">Информационные</category>
    </programme>
    <programme start="20171016151500 +0300" stop="20171016160000 +0300" channel="1">
    <title lang="ru">Давай поженимся! (12+)</title>
    <category lang="ru">Развлекательные</category>
    </programme>
    <programme start="20171016160000 +0300" stop="20171016170000 +0300" channel="1">
    <title lang="ru">Мужское / Женское (12+)</title>
    <category lang="ru">Развлекательные</category>
    </programme>
    <programme start="20171016170000 +0300" stop="20171016180000 +0300" channel="1">
    <title lang="ru">Время покажет (12+)</title>
    </programme>
    <programme start="20171016180000 +0300" stop="20171016184500 +0300" channel="1">
    <title lang="ru">Вечерние новости с субтитрами (12+)</title>
    <category lang="ru">Информационные</category>
    </programme>
    <programme start="20171016184500 +0300" stop="20171016195000 +0300" channel="1">
    <title lang="ru">На самом деле (12+)</title>
    <category lang="ru">Развлекательные</category>
    </programme>
    <programme start="20171016195000 +0300" stop="20171016210000 +0300" channel="1">
    <title lang="ru">Пусть говорят (12+)</title>
    <category lang="ru">Развлекательные</category>
    </programme>
    <programme start="20171016210000 +0300" stop="20171016213500 +0300" channel="1">
    <title lang="ru">Время (12+)</title>
    </programme>
    <programme start="20171016213500 +0300" stop="20171016233000 +0300" channel="1">
    <title lang="ru">"Гостиница "Россия" (1-я и 2-я серии) (12+)</title>
    <desc lang="ru">1-я серия. Москва, 1976 год. Сотринтересте в гостинице жена партийного чиновника замечает на...</desc>
    <category lang="ru">Сериал</category>
    </programme>
    <programme start="20171016233000 +0300" stop="20171017000000 +0300" channel="1">
    <title lang="ru">Вечерний Ургант (12+)</title>
    <category lang="ru">Развлекательные</category>
    </programme>
    <programme start="20171017000000 +0300" stop="20171017010000 +0300" channel="1">
    <title lang="ru">Познер (Стивен Возняк) (12+)</title>
    <category lang="ru">Познавательные</category>
    </programme>
    <programme start="20171016050000 +0300" stop="20171016090000 +0300" channel="2">
    <title lang="ru">Утро России (12+)</title>
    <category lang="ru">Развлекательные</category>
    </programme>
    <programme start="20171016090000 +0300" stop="20171016091500 +0300" channel="2">
    <title lang="ru">Вести (12+)</title>
    <category lang="ru">Информационные</category>
    </programme>
    <programme start="20171016091500 +0300" stop="20171016095500 +0300" channel="2">
    <title lang="ru">Утро России (12+)</title>
    <category lang="ru">Развлекательные</category>
    </programme>
    <programme start="20171016095500 +0300" stop="20171016110000 +0300" channel="2">
    <title lang="ru">О самом главном (12+)</title>
    <category lang="ru">Познавательные</category>
    </programme>
    <programme start="20171016110000 +0300" stop="20171016114000 +0300" channel="2">
    <title lang="ru">Вести (12+)</title>
    <category lang="ru">Информационные</category>
    </programme>
    <programme start="20171016114000 +0300" stop="20171016120000 +0300" channel="2">
    <title lang="ru">Вести. Местное время (12+)</title>
    <category lang="ru">Информационные</category>
    </programme>
    <programme start="20171016120000 +0300" stop="20171016130000 +0300" channel="2">
    <title lang="ru">Судьба человека с Борисом Корчевниковым (12+)</title>
    <category lang="ru">Развлекательные</category>
    </programme>
    <programme start="20171016130000 +0300" stop="20171016140000 +0300" channel="2">
    <title lang="ru">60 минут (12+)</title>
    <category lang="ru">Развлекательные</category>
    </programme>
    <programme start="20171016140000 +0300" stop="20171016144000 +0300" channel="2">
    <title lang="ru">Вести (12+)</title>
    <category lang="ru">Информационные</category>
    </programme>
    <programme start="20171016144000 +0300" stop="20171016145500 +0300" channel="2">
    <title lang="ru">Вести. Местное время (12+)</title>
    <category lang="ru">Информационные</category>
    </programme>
    <programme start="20171016145500 +0300" stop="20171016160000 +0300" channel="2">
    <title lang="ru">Тайны следствия-13 ("Семья без урода", 1-я серия) (12+)</title>
    <desc lang="ru">На железнодорожной насыпи под э у Фаддеева золота...</desc>
    <category lang="ru">Сериал</category>
    </programme>
    <programme start="20171016160000 +0300" stop="20171016170000 +0300" channel="2">
    <title lang="ru">Тайны следствия-13 ("Семья без урода", 2-я серия) (12+)</title>
    <desc lang="ru">Визит Маши к следователю Никавляет Руслана в отдел...</desc>
    <category lang="ru">Сериал</category>
    </programme>
    <programme start="20171016170000 +0300" stop="20171016174000 +0300" channel="2">
    <title lang="ru">Вести (12+)</title>
    <category lang="ru">Информационные</category>
    </programme>
    <programme start="20171016174000 +0300" stop="20171016180000 +0300" channel="2">
    <title lang="ru">Вести. Местное время (12+)</title>
    <category lang="ru">Информационные</category>
    </programme>
    <programme start="20171016180000 +0300" stop="20171016190000 +0300" channel="2">
    <title lang="ru">Андрей Малахов. Прямой эфир (12+)</title>
    <category lang="ru">Развлекательные</category>
    </programme>
    <programme start="20171016190000 +0300" stop="20171016200000 +0300" channel="2">
    <title lang="ru">60 минут (12+)</title>
    <category lang="ru">Развлекательные</category>
    </programme>
    <programme start="20171016200000 +0300" stop="20171016204500 +0300" channel="2">
    <title lang="ru">Вести (12+)</title>
    <category lang="ru">Информационные</category>
    </programme>
    <programme start="20171016204500 +0300" stop="20171016210000 +0300" channel="2">
    <title lang="ru">Вести. Местное время (12+)</title>
    <category lang="ru">Информационные</category>
    </programme>
    <programme start="20171016210000 +0300" stop="20171016221000 +0300" channel="2">
    <title lang="ru">Бумеранг (1-я серия) (12+)</title>
    <desc lang="ru">Профессорская дочка Даша Лебедева влюблена в хулигана Андрея Куликова, и несмотря на то, что Даша еще учится в школе, влюбленнакануне отъезда мать Андрея попадает в больницу, планы влюбленных рушатся.</desc>
    <category lang="ru">Сериал</category>
    </programme>
    <programme start="20171016221000 +0300" stop="20171016231500 +0300" channel="2">
    <title lang="ru">Бумеранг (2-я серия) (12+)</title>
    <desc lang="ru">Даша переживинит себя. Регина находит письмо Даши.</desc>
    <category lang="ru">Сериал</category>
    </programme>
    <programme start="20171016231500 +0300" stop="20171017015000 +0300" channel="2">
    <title lang="ru">Вечер с Владимиром Соловьёвым (12+)</title>
    <category lang="ru">Познавательные</category>
    </programme>
    <programme start="20171017015000 +0300" stop="20171017025000 +0300" channel="2">
    <title lang="ru">Бегущая от любви (9-я серия) (12+)</title>
    <desc lang="ru">На фабрике произошла забастовка. Рабочие отказываются трудиться, пока Петра Ваевича не восстановят .</desc>
    <category lang="ru">Сериал</category>
    </programme>
    <programme start="20171017025000 +0300" stop="20171017034500 +0300" channel="2">
    <title lang="ru">Бегущая от любви (10-я серия) (12+)</title>
    <desc lang="ru">Ксения и Татьяна решают все же отмечать Новый год вместе в ресторане. К ним приходит тся устроить ему побег, в итоге ее саму задерживают.</desc>
    <category lang="ru">Сериал</category>
    </programme>
    <programme start="20171017034500 +0300" stop="20171017050000 +0300" channel="2">
    <title lang="ru">Фамильные ценности (1-я серия) (12+)</title>
    <desc lang="ru">Традиционный воскресный обед в доме советской примы-балерины Анны Гореевой. Ее дети - Ольга, Игорь и=</desc>
    <category lang="ru">Сериал</category>
    </programme>
    </tv>
    Ответ написан
    Комментировать
  • Система голосования на файла, как защититься от накрутки ??

    @Paltinik Автор вопроса
    В общем сделал что смог, + защита от голосования 2 раза на LocalStogare
    Как и сказал, сделал на чистом css+js
    Скрипт минимальный, с 1 картинкой, 4кб ничего лишнего, осталось только стилизовать под себя )
    Если вдруг кому надо, качайте : тыц

    сам код:
    index.php

    <?php
    $data = array();
    $data = unserialize(file_get_contents('./ratings.data.txt'));
    $rate = $data['rate'];
    $votes = $data['votes'];
    ?>
     
    <div id="total">Голосов <?php echo $votes; ?></div>
    <div id="rate">Рейтинг  <?php  echo $rate; ?> </div>
    <div class="stars-contanet"></div>
    <div class="stars-you"></div>
    
    <style>
        .star-proc {
            background: #000;
            height: 100%;
            -webkit-transition: 0.5s;
            -o-transition: 0.5s;
            transition: 0.5s;
        }
            .stars-contanet {
                position: relative;
                width:      150px;
                height:     30px;
            }
            .stars {
                background: url('star.png') no-repeat;
                float:      left;
                height:     30px;
                width:      30px;
            }
            .star-active {
                height: 100%;
               background-color: yellow;
               cursor:pointer;
            }
        </style>
    
    
    
    
    <script src="http://code.jquery.com/jquery-latest.js"></script>
    <script>
    var star = '<div class="stars"></div>';
    $('.stars-contanet').html(star+star+star+star+star+'<div class="star-proc"></div>');
    $('.star-proc').width($('#rate').text().replace('Рейтинг', '')*20+'%');
    
    if (!localStorage.getItem('rate')){
    $('.stars').bind('click', getrate); 
            $('.stars').hover(
                function() {
                    $(this).prevAll('.stars').andSelf().addClass('star-active').attr('title',$('.star-active').length);
                },
                function() {
                    $(this).prevAll('.stars').andSelf().removeClass('star-active');
                }
            );
    } else {
    $('.stars-you').text('Ваша оценка: '+localStorage.getItem('rate'));
    }
    
    function getrate() {
    $('.stars').unbind(); 
    var val = $('.star-active').length;
    $('.stars').removeClass('star-active');
    localStorage.setItem('rate', val);
                $.post('rate.php',
                    {val : val},
                    function(d) {
     $('.star-proc').width(d.rate*20+'%');
     $('#total').text('голосов '+d.votes);
     $('#rate').text('рейтинг '+d.rate);
                    },
                    'json'
                ).complete(function(){
                 $('.stars-you').text('Ваша оценка: '+val);
                });
    }
        </script>


    И обработчик запросов rate.php
    <?php
        $data = array();
        $data = unserialize(file_get_contents('./ratings.data.txt'));
        preg_match('/([1-5]{1})/', $_POST['val'], $match);
        $vote = $match[0];
        $data['votes'] += 1;
        $data['total_points'] += $vote;
        $data['rate'] = round( $data['total_points'] / $data['votes'], 1 );
        file_put_contents('./ratings.data.txt', serialize($data));
        echo json_encode($data);
    ?>


    Волнует вопрос, что на счёт дыр и производительности в этом коде??
    Ответ написан