PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи

Страниц (1): [1]

> Найдено сообщений: 12
mikka Отправлено: 28 Мая, 2019 - 11:56:24 • Тема: phpQuery. Проблема с памятью • Форум: Программирование на PHP

Ответов: 4
Просмотров: 781
Провел небольшие исследования расставив в различных частях скрипта memory_get_usage.
Потребляемая память увеличивается непосредственно после создания объекта phpQuery из переменной $content , при этом память не уменьшается после вызова phpQuery::unloadDocuments(). Также, память накапливается не после каждого создания объекта phpQuery, а как-то периодически (один раз в несколько итераций, закономерность увеличения не удалось установить). К примеру: было 2097152 после стало 4194304, спустя несколько итераций значение не изменялось, но после снова увеличилось и стало 6291456.
Также хотелось бы добавить, что в некоторых случаях, память увеличивается не после создания объекта phpQuery, а после одного из циклов foreach (1-го либо 2-го сверху)
mikka Отправлено: 27 Мая, 2019 - 19:46:33 • Тема: phpQuery. Проблема с памятью • Форум: Программирование на PHP

Ответов: 4
Просмотров: 781
LIME пишет:
а возможно и где-то еще течет вне это ф-ции
выводи в консоль отладочную инфу
https://www.php.net/manual/ru/fu...ry-get-usage.php
в начале ф-ции, вне ф-ции, перед и после unloadDocuments итд
может надебажишь что
(Добавление)
я бы конечно вовнутрь полез и посмотрел что он там кэширует и как
в newDocument и unloadDocuments если выяснишь что именно он течет


В том что дело phpQuery используется только в этой функции и больше нигде.
Вот снова получил эту ошибку

PHP Fatal error: Allowed memory size of 1610612736 bytes exhausted (tried to allocate 1073741824 bytes) in C:\OSPanel\domains\home-page-parcer.ru\phpQuery.php on line 3494

Спасибо за совет с памятью. Буду пытаться отладить.
mikka Отправлено: 26 Мая, 2019 - 14:35:06 • Тема: phpQuery. Проблема с памятью • Форум: Программирование на PHP

Ответов: 4
Просмотров: 781
Добрый день!

Есть функция, которая, используя библиотеку phpQuery, парсит данные со страницы на сайте. Данные на странице обновляются регулярно, поэтому функция вызывается в цикле приблизительно каждые 5-10 секунд (в зависимости от скорости получения страницы). После продолжительной работы скрипта (приблизительно 8-10 часов, при этом ~3-5 часов из этого времени ноутбук я не трогал), получаю ошибку (забыл ее скопировать с логов), что не хватает памяти для работы phpQuery. В php.ini memory_limit = 1536M. Скрипт работает на локальном сервере (OpenServer). В диспетчере задач объем памяти потребляемый Apache HTTP Server постоянно колеблется, к примеру: несколько минут назад (после небольшого простоя бездействия ноутбука было 170Мб), сейчас (спустя минут 10) - 60 Мб. Собственно сама функция. Не могу понять в чем проблема и почему phpQuery::unloadDocuments(); как-то избирательно очищает документы
PHP:
скопировать код в буфер обмена
  1. function parcer($url){
  2. $ids=[];
  3. $indexIds=0;
  4. $content = get_content($url);
  5.  
  6. $doc = phpQuery::newDocument($content);
  7.  
  8. foreach ($doc->find('[id^=name_]:input') as $opt) { // получаем товары которые успели преобразоваться в input
  9.         $opt=pq($opt);
  10.         $numTov = preg_replace('~[^0-9]*~','',$opt->attr('id')); // получаем с ID номер товара
  11.         $ids[$indexIds][] = $numTov;
  12.         $ids[$indexIds][] = $opt->attr('value'); // получаем значение input
  13.         $ids[$indexIds][] = $opt->nextAll('input:first-of-type')->prev('a')->text(); //ищем последнюю ссылку каталога
  14.         $ids[$indexIds][] = $opt->nextAll('nobr')->children('[id^=manf]')->text(); //ищем поставщика
  15.         $indexIds++;
  16. }
  17.  
  18. foreach ($doc->find('td>[id^=name_]:not(:input)') as $opt) { // получаем товары в span, которые без родителя
  19.         $opt=pq($opt);
  20.         $numTov = preg_replace('~[^0-9]*~','',$opt->attr('id'));
  21.         $ids[$indexIds][] = $numTov;
  22.         $ids[$indexIds][]= $opt->text();
  23.         $ids[$indexIds][] = $opt->nextAll('[id^=cats_]:last')->text();
  24.         $ids[$indexIds][] = $opt->nextAll('nobr')->children('[id^=manf]')->text();
  25.         $indexIds++;
  26. }
  27.  
  28. foreach ($doc->find('div>[id^=name_]') as $opt) { // получаем товары в span, которые с родителем
  29.         $opt=pq($opt);
  30.         $numTov = preg_replace('~[^0-9]*~','',$opt->attr('id'));
  31.         $ids[$indexIds][] = $numTov;
  32.         $ids[$indexIds][]= $opt->text();
  33.         $ids[$indexIds][] = $opt->parent()->nextAll('[id^=cats_]:last')->text();
  34.         $ids[$indexIds][] = $opt->parent()->nextAll('nobr')->children('[id^=manf]')->text();
  35.         $indexIds++;
  36. }
  37.  
  38. phpQuery::unloadDocuments(); //очистка документа
  39. gc_collect_cycles(); // принудительный вызов встроенного сборщика мусора PHP
  40. return $ids;
  41. }
mikka Отправлено: 03 Ноября, 2018 - 09:29:44 • Тема: phpQuery не находит таблицу по классу • Форум: Вопросы новичков

Ответов: 3
Просмотров: 328
Спасибо. Проблему устранил, все оказалось предельно банально. Для вывода использовал ранее написанную функцию, заменил ее на echo и получил нужную мне таблицу. Вот эта функция
PHP:
скопировать код в буфер обмена
  1.  
  2. function print_arr($arr){
  3.         echo '<pre>' . print_r($arr, true) . '<pre>';  
  4. }
  5.  
mikka Отправлено: 01 Ноября, 2018 - 17:48:56 • Тема: phpQuery не находит таблицу по классу • Форум: Вопросы новичков

Ответов: 3
Просмотров: 328
На странице сайта имеется следующая таблица (класс "topper" единственный на странице):

PHP:
скопировать код в буфер обмена
  1.  
  2. <table cellpadding="4" width="100%" cellspacing="0" border="0" class="topper">
  3.     <tbody>
  4.         <tr>
  5.             <td>
  6.                 <span onclick="(function() {vart=document.getElementById('trBirthday');
  7.                    if(t.style.display=='none'){t.style.display='';}
  8.                    else {t.style.display='none';}})();" style="cursor:pointer;color:white;"><b>
  9.                     Дни рождения: <font color="green">Прошло: 7</font> /
  10.                     <font color="red">Сегодня: 1 !!!</font> /
  11.                     <font color="orange">Завтра: 6</font> /
  12.                     <font color="blue">Скоро: 34</font></b>
  13.                 </span>
  14.             </td>
  15.             <td width="450" align="right" style="white-space:nowrap;">
  16.                 <span class="orange">Вошли&nbsp;как:&nbsp;USER</span>&nbsp;|&nbsp;<span class="tabs">выйти</span></a>&nbsp;|&nbsp;<img src="./Товары [2018-09-30 09_57_54]_files/uoff.gif">
  17.             </td>
  18.         </tr>
  19.     </tbody>
  20. </table>
  21.  

При помощи phpQuery пытаюсь ее спарсить, но результат выводит всю страницу. Что делаю не так? Код ниже:
в переменной $url находится ссылка на страницу
также хочу добавить, что если вместо таблицы искать на этой странице текстовое поле по id тогда все работает нормально
PHP:
скопировать код в буфер обмена
  1.  
  2. function get_content($url){
  3.     $content = file_get_contents($url);
  4.     $doc = phpQuery::newDocument($content);
  5.     $elem = $doc->find('.topper');
  6.     return $elem;
  7. }
  8.  
mikka Отправлено: 29 Октября, 2018 - 10:11:51 • Тема: Поиск между тегами • Форум: Регулярные выражения

Ответов: 13
Просмотров: 936
Уже в процессе обновления. =)
А данную задачу как-то при помощи phpQuery реализовать возможно?
mikka Отправлено: 29 Октября, 2018 - 08:23:24 • Тема: Поиск между тегами • Форум: Регулярные выражения

Ответов: 13
Просмотров: 936
версия PHP 5.3.13
Спасибо огромное за помощь и за разъяснения!
mikka Отправлено: 28 Октября, 2018 - 18:48:25 • Тема: Поиск между тегами • Форум: Регулярные выражения

Ответов: 13
Просмотров: 936
после удаления в начале регулярного выражения ?<= ошибка ушла и получил практически нужный результат.
использую вот так вот

PHP:
скопировать код в буфер обмена
  1.  
  2. function get_content($url){
  3.         $content = file_get_contents($url);
  4.         $pcre = "~(</script>\r\n|\h)<a[^>]*>(.+?)</a>~s";
  5.         preg_match_all($pcre,$content,$katalog_link);
  6.         return $katalog_link;
  7. }
  8.  
  9. url='http://test1.ru/';
  10. $nameNum=get_content($url);
  11. print_arr($nameNum);
  12.  


Был бы признателен, если бы Вы объяснили принцип работы данного регулярного выражения.
mikka Отправлено: 28 Октября, 2018 - 18:11:50 • Тема: Поиск между тегами • Форум: Регулярные выражения

Ответов: 13
Просмотров: 936
теперь получаю ошибку

Warning: preg_match_all() [function.preg-match-all]: Compilation failed: lookbehind assertion is not fixed length at offset 18
mikka Отправлено: 28 Октября, 2018 - 17:33:18 • Тема: Поиск между тегами • Форум: Регулярные выражения

Ответов: 13
Просмотров: 936
строка которую необходимо спарсить представляет собой страницу сайта, она очень большая, а вот этот кусочек кода имеется в ней, для большего понимания публикую немного большую часть
PHP:
скопировать код в буфер обмена
  1. <script type="text/javascript" src="./Товары _files/ckeditor.js.Без названия"></script>
  2. <table width="100%" border="0" cellpadding="0" cellspacing="5" class="text" bgcolor="#FAFAFA">
  3.   <tbody><tr>
  4.     <td bgcolor="#C0C0C0" valign="top" width="1"><img src="./Товары_files/spacer.gif" width="1" height="1" border="0"></td>
  5.     <td width="50%" valign="top">
  6.  
  7. <script>
  8. function checkregform()
  9. {
  10.         name = document.getElementById('name').value;
  11. //      price = document.getElementById('price').value;
  12.   man =  document.getElementById('man').value;
  13.  
  14.         error = false;
  15.  
  16.         if(name == '')
  17.         error = 'не указано наименование товара';
  18.  
  19.         if(man == '0' && newm=='')
  20.         error = 'не указан производитель товара';
  21.  
  22.         if(!error)
  23.         return true;
  24.         else
  25.         {
  26.                 alert(error);
  27.                 return false;
  28.         }
  29. }
  30. </script>
  31. <a href="http://site.ru/monitor/?menu=products&edit=1108&88066504932163">Зарядные устройства, аккумуляторы</a> » <a href="http://site.ru/monitor/?menu=products&edit=1747&6067337044425">внешние аккумуляторы</a> » <br><a href="http://site.ru/monitor/?menu=products&edit=1&4572837043506&highlight=6061#6061"><b><< вернуться в каталог</b></a>
  32. <a href="http://site.ru/monitor/?menu=products&edit=1747&324337048278&highlight=6061#6061"><b><< перейти в каталог товара</b></a>
  33.  
  34. <script language="Javascript1.2"><!-- // load htmlarea
  35. _editor_url = "/monitor/menus/products/"; // URL to htmlarea files
  36. var win_ie_ver = parseFloat(navigator.appVersion.split("MSIE")[1]);
  37. if (navigator.userAgent.indexOf('Mac')        >= 0) { win_ie_ver = 0; }
  38. if (navigator.userAgent.indexOf('Windows CE') >= 0) { win_ie_ver = 0; }
  39. if (navigator.userAgent.indexOf('Opera')      >= 0) { win_ie_ver = 0; }
  40. if (win_ie_ver >= 5.5) {
  41.         document.write('<scr' + 'ipt src="' +_editor_url+ 'editor.js"');
  42.         document.write(' language="Javascript1.2"></scr' + 'ipt>');
  43. } else { document.write('<scr'+'ipt>function editor_generate() { return false; }</scr'+'ipt>'); }
  44. // -->
  45. </script><script>function editor_generate() { return false; }</script>
mikka Отправлено: 28 Октября, 2018 - 17:10:21 • Тема: Поиск между тегами • Форум: Регулярные выражения

Ответов: 13
Просмотров: 936
PHP:
скопировать код в буфер обмена
  1.  
  2. </script>
  3. <a href="http://site.ru/monitor/?menu=products&edit=1108&88066504932163">Зарядные устройства, аккумуляторы</a> » <a href="http://site.ru/monitor/?menu=products&edit=1747&6067337044425">внешние аккумуляторы</a> » <br><a href="http://site.ru/monitor/?menu=products&edit=1&4572837043506&highlight=6061#6061"><b><< вернуться в каталог</b></a>
mikka Отправлено: 28 Октября, 2018 - 16:35:56 • Тема: Поиск между тегами • Форум: Регулярные выражения

Ответов: 13
Просмотров: 936
Здравствуйте!
Задача следующая:
При помощи регулярного выражения необходимо найти и получить всю информацию (текст и ссылки - соответственно латинские и русские символы), которые находятся между двумя тегами </script> и <br>. Данная информация не находится ни в <div> ни в таблице, она просто выводится скриптом. На странице много тегов </script> и <br>, но всего лишь одна комбинация когда после </script> идут текст и ссылка, а после них тег <br>. Получить результат пытаюсь при помощи следующего кода, но получаю bool(false).
P.S. в переменной $url хранится адрес страницы, с которой пытаюсь спарсить инфо
PHP:
скопировать код в буфер обмена
  1. function get_content($url){
  2.         $content = file_get_contents($url);
  3.         $katalog_link = array();
  4.         $katalog_link=preg_match_all('/<\/script>(.*?)<br>/uis',$content, $katalog_link);
  5.         return $katalog_link;
  6. }

Страниц (1): [1]
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB