Здравствуйте! Сделал мне фрилансер парсер один. Суть в том, что он берет из базы ссылку, данные для парсинга phpquery и проверяет на каждом сайте нужную информацию. Таких ссылок сейчас 1800. Будет еще больше. Так вот, пока задач было немного все было хорошо. Дальше пришлось увеличивать execution_time до 2 часов. Но ведь это ненормально? Если скрипт запустить в браузере - он уходит на выполнение и ждать приходится очень долго. При этом страница "грузится" и только в конце выдается список выполненных задач. То же самое происходит если скрипт запустить в консоли командой PHP: php "/var/www/site.ru/data/www/sie.ru/path/parser.php" Он уходит на выполнение на длительное время, а по идее в это время в консоли после каждой проверки должна выводится строка с указанием Url. Что нужно сделать, чтобы после каждой итерации и в браузере и в консоли отображалась текущая задача? Вот такой код: PHP: <?php include './model.php'; include './phpQuery.php'; $set_proxy = $db->get_set_proxy(); $rules = $db->get_rules(); foreach ($rules as $key => $rule) { $url = $rule['url']; $id = $rule['id']; $selector = $rule['selector']; $headers = get_headers($url); $code = $headers[0]; $page = get_page($url, $set_proxy, $db); $page = phpQuery::newDocument($page); $value = $page->find( $selector )->text(); $value = strip_tags($value); $value = str_replace(array("'", '"', '`'), "", $value); $db->update_value($value, $code, $id); $row = $db->get_url_by_id($id); echo "<b>".$row['code'] ."</b> <br> ". $row['url']. " <br> ". $row['value'].'<hr>'; flush(); ob_flush(); $page = ''; unset($page); phpQuery::unloadDocuments(); gc_collect_cycles(); } function get_page($url, $set_proxy, $db){ if ($set_proxy == 1) { $arr = $db->get_random_proxy(); $auth = base64_encode($arr['proxyauth']); $aContext = array( 'https' => array( 'proxy' => 'tcp://'.$arr['proxy'], 'request_fulluri' => true, 'header' => "Proxy-Authorization: Basic ".$auth, "verify_peer"=>false, "verify_peer_name"=>false, "timeout"=>2 ), 'ssl'=>array( "verify_peer"=>false, "verify_peer_name"=>false, ), ); $cxContext = stream_context_create($aContext); $page = file_get_contents($url, False, $cxContext); return $page; }else{ $page = file_get_contents($url); return $page; } } ?> И наконец, при запуске данной задачи через крон вот такие ошибки (но не всегда): Код (Text): Ошибка выполнения задания "0 1 * * * wget -O /dev/null 'https://site/path/parser.php'" Runtime error: unable to execute: 'su -l -c bash /tmp/crontab710032882 site.ru' stdout: '' stderr: '--2019-01-03 17:11:15-- https://site/path/parser.php Resolving site.ru (site.ru)... 233.33.33.33 Connecting to site.ru (site.ru)|233.33.33.33|:443... connected. HTTP request sent, awaiting response... Read error (Success.) in headers. Retrying. --2019-01-03 17:26:16-- (try: 2) https://site/path/parser.php Connecting to site.ru (site.ru)|233.33.33.33|:443... connected. HTTP request sent, awaiting response... 500 Internal Server Error 2019-01-03 17:26:35 ERROR 500: Internal Server Error.
Дык откуда я знал, шарит он или нет. Сам скрипт работает на малых задачах... Руками сейчас можно сделать что-то? Добавить что-то в этот файл? Доделаете? Отблагодарю.
Парсить сайты, не такое уж и легкое дело, тем более, когда их за 2к. Чтобы скрипт не отваливался, нужно выполнять задачу поэтапно, сохраняя при этом сайты с которых уже получена информация, а потом все разом затирать.