За последние 24 часа нас посетили 186489 программистов и 1972 робота. Сейчас ищет 1181 программист ...

Как сделать периодический отклик скрипта?

Тема в разделе "PHP для новичков", создана пользователем romagromov, 3 янв 2019.

  1. romagromov

    romagromov Активный пользователь

    С нами с:
    17 дек 2015
    Сообщения:
    73
    Симпатии:
    0
    Здравствуйте!
    Сделал мне фрилансер парсер один.
    Суть в том, что он берет из базы ссылку, данные для парсинга phpquery и проверяет на каждом сайте нужную информацию. Таких ссылок сейчас 1800. Будет еще больше.
    Так вот, пока задач было немного все было хорошо. Дальше пришлось увеличивать execution_time до 2 часов. Но ведь это ненормально?
    Если скрипт запустить в браузере - он уходит на выполнение и ждать приходится очень долго. При этом страница "грузится" и только в конце выдается список выполненных задач.

    То же самое происходит если скрипт запустить в консоли командой

    PHP:
    1. php "/var/www/site.ru/data/www/sie.ru/path/parser.php"
    Он уходит на выполнение на длительное время, а по идее в это время в консоли после каждой проверки должна выводится строка с указанием Url.

    Что нужно сделать, чтобы после каждой итерации и в браузере и в консоли отображалась текущая задача?

    Вот такой код:

    PHP:
    1. <?php
    2.     include './model.php';
    3.     include './phpQuery.php';
    4.  
    5.     $set_proxy = $db->get_set_proxy();
    6.     $rules = $db->get_rules();
    7.  
    8.     foreach ($rules as $key => $rule) {
    9.         $url = $rule['url'];
    10.         $id = $rule['id'];
    11.         $selector = $rule['selector'];
    12.         $headers = get_headers($url);
    13.         $code = $headers[0];
    14.  
    15.         $page = get_page($url, $set_proxy, $db);
    16.  
    17.         $page = phpQuery::newDocument($page);
    18.         $value = $page->find( $selector )->text();
    19.         $value = strip_tags($value);    
    20.         $value = str_replace(array("'", '"', '`'), "", $value);
    21.         $db->update_value($value, $code, $id);
    22.         $row = $db->get_url_by_id($id);
    23.  
    24.         echo "<b>".$row['code'] ."</b> <br> ". $row['url']. " <br> ". $row['value'].'<hr>';
    25.         flush();
    26.         ob_flush();
    27.  
    28.         $page = '';
    29.         unset($page);
    30.         phpQuery::unloadDocuments();
    31.         gc_collect_cycles();
    32.     }
    33.  
    34.  
    35.     function get_page($url, $set_proxy, $db){
    36.         if ($set_proxy == 1) {
    37.             $arr = $db->get_random_proxy();
    38.  
    39.             $auth = base64_encode($arr['proxyauth']);
    40.             $aContext = array(
    41.                 'https' => array(
    42.                     'proxy' => 'tcp://'.$arr['proxy'],
    43.                     'request_fulluri' => true,
    44.                     'header' => "Proxy-Authorization: Basic ".$auth,
    45.                     "verify_peer"=>false,
    46.                     "verify_peer_name"=>false,
    47.                     "timeout"=>2
    48.                 ),
    49.                 'ssl'=>array(
    50.                     "verify_peer"=>false,
    51.                     "verify_peer_name"=>false,
    52.                 ),
    53.             );
    54.             $cxContext = stream_context_create($aContext);
    55.             $page = file_get_contents($url, False, $cxContext);
    56.             return $page;
    57.         }else{
    58.             $page = file_get_contents($url);
    59.             return $page;
    60.         }
    61.     }
    62. ?>

    И наконец, при запуске данной задачи через крон вот такие ошибки (но не всегда):

    Код (Text):
    1. Ошибка выполнения задания "0 1 * * * wget -O /dev/null 'https://site/path/parser.php'"
    2. Runtime error: unable to execute: 'su -l -c bash /tmp/crontab710032882 site.ru'
    3. stdout: ''
    4. stderr: '--2019-01-03 17:11:15--  https://site/path/parser.php
    5. Resolving site.ru (site.ru)... 233.33.33.33
    6. Connecting to site.ru (site.ru)|233.33.33.33|:443... connected.
    7. HTTP request sent, awaiting response... Read error (Success.) in headers.
    8. Retrying.
    9.  
    10. --2019-01-03 17:26:16--  (try: 2)  https://site/path/parser.php
    11. Connecting to site.ru (site.ru)|233.33.33.33|:443... connected.
    12. HTTP request sent, awaiting response... 500 Internal Server Error
    13. 2019-01-03 17:26:35 ERROR 500: Internal Server Error.
     
  2. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    нанять фрилансера, который шарит в демонах и сокетах
     
  3. romagromov

    romagromov Активный пользователь

    С нами с:
    17 дек 2015
    Сообщения:
    73
    Симпатии:
    0
    Дык откуда я знал, шарит он или нет. Сам скрипт работает на малых задачах...
    Руками сейчас можно сделать что-то? Добавить что-то в этот файл?
    Доделаете? Отблагодарю.
     
    #3 romagromov, 3 янв 2019
    Последнее редактирование: 3 янв 2019
  4. lastdays

    lastdays Активный пользователь

    С нами с:
    27 сен 2012
    Сообщения:
    410
    Симпатии:
    74
    Парсить сайты, не такое уж и легкое дело, тем более, когда их за 2к.

    Чтобы скрипт не отваливался, нужно выполнять задачу поэтапно, сохраняя при этом сайты с которых уже получена информация, а потом все разом затирать.
     
    webtask нравится это.