Nano Hash - криптовалюты, майнинг, программирование

Вызов PHP-функции из Smarty с помощью AJAX без действий пользователя

Я посещаю множество разных сайтов, чтобы получить список информации, и я хочу отображать эту информацию по мере ее получения. Прямо сейчас я использую шаблон Smarty, и я хотел бы сделать следующее:

Псевдокод:

{foreach $page} 
  $smarty_var = use AJAX to call a PHP function
  Render out a new table row on the fly w/ the newly assigned var   
  <tr><td>{$smarty_var}</td></tr>
{/foreach}

Я не очень разбираюсь в AJAX, я использовал его давным-давно, и это было похоже на это, но не совсем, было предпринято действие пользователя. Нет, у меня нет JS Framework. Я далеко здесь о том, как это должно идти? В основном я хочу отображать строку таблицы по мере поступления данных, каждая строка таблицы будет запросом на получение данных с другого сайта.

Конечно, я расскажу вам о том, что я пытаюсь сделать: http://bookscouter.com/prices.php?isbn=0132184745+&x=19&y=6 Если вы нажмете «Нажмите, чтобы просмотреть цены по всем 43 ссылкам» внизу этой страницы, вы увидите. Я использую cURL, чтобы получить все страницы, с которых мне нужна цена. Затем для каждой страницы я хочу получить цену. Таким образом, каждая страница будет запускать функцию, которая запускает какой-нибудь забавный код, например:

function parseTBDOTpageNew($page, $isbn)
{
    $first_cut = preg_split('/<table[^>]*>/', $page);
    $second_cut = preg_split('/<td[^>]*>/', $first_cut[2]);
    if(strstr($second_cut[4], "not currently buying this book") == true)
    {
        return "\$0.00";
    }
    $third_cut = preg_split('/<b[^>]*>/', $second_cut[9]);
    $last_cut = preg_split('/</', $third_cut[3]);
    return $last_cut[0];
}

Эта функция вызывается из другой функции, которая помещает цену, возвращенную вышеприведенной функцией, название компании и ссылку в массив, который будет добавлен к другому массиву большего размера, который отправляется в smarty. Вместо этого я просто хочу получить первый возвращаемый массив с индивидуальной информацией и добавить значения в строку таблицы на лету.

Я воспользуюсь вашим советом по Jquery, то, что я начал, - это функция загрузки, которая получает $pages для анализа, и я как раз писал: foreach page получает информацию и выплевывает некоторый html с информацией на страница.

Кроме того, функция, которая вызывает функцию для получения цены, находится в php-файле, поэтому мне нужен запрос на вызов функции в php-файле, а НЕ просто вызов file.php?param1=foo, мне нужно, чтобы он действительно попал в функция в файле. У меня есть Jquery, теперь я просто пытаюсь понять это и заставить его делать то, что мне нужно, тьфу. Я ищу, любая помощь будет оценена.

13.08.2010

Ответы:


1

Нет, у меня нет JS Framework

Исправьте это в первую очередь. Вы не хотите сами жонглировать XMLHTTPRequests. jQuery — это каноническая JS-библиотека SO, и она довольно изящна.

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

Со сколькими рядами вы будете иметь дело? Должны ли они все загружаться асинхронно?

Давайте займемся этим безмозглым, прямолинейным способом. Создайте скрипт, который не делает ничего, кроме:

  1. Возьмите идентификатор сайта и извлеките данные из соответствующего URL-адреса.
  2. Преобразуйте эти данные в какой-либо формат передачи данных, HTML или JSON.

Тогда это просто вопрос создания страницы, которую получает пользователь, которая будет содержать код Javascript, который делает вызовы ajax к сборщику данных, затем либо напрямую вставляет HTML на страницу, либо преобразует данные в HTML, а затем вставляет это в страница.

Вы заметите, что Smarty ни в коем случае не участвует в этом. ;)

Это решение крайне непрактично для асинхронного опроса чего-то большего, чем тривиальное количество сайтов. Если вам нужны строки для десятков или сотен сайтов, это означает, что каждому клиенту потребуется делать десятки или сотни запросов к вашему сайту для каждого обычного просмотра страницы. Это убьет ваш сервер, если более одного или двух человек загрузят страницу одновременно.

Можете ли вы рассказать нам больше о том, что вы делаете, и чего вы пытаетесь достичь? Есть много способов смягчить эту проблему, но все они зависят от того, что вы делаете.


Обновление для редактирования вашего вопроса.

Во-первых, рассмотрите возможность использования настоящего парсера HTML вместо регулярных выражений. DOM очень мощен, и вы можете настроить таргетинг на определенные элементы, используя XPath.

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

Итак, вот конечная проблема. Вы хотите сделать что-то асинхронно. В PHP нет встроенного универсального способа выполнения асинхронных задач. Есть несколько способов решить эту проблему.

Первый, как я описал выше. Вместо того, чтобы выполнять какие-либо запросы curl при загрузке страницы, вы передаете работу конечному пользователю, и браузер конечного пользователя делает запросы к вашему сценарию парсинга один за другим, заполняя результаты.

Второй — использовать асинхронную рабочую очередь, например Gearman. Он имеет отличную поддержку PHP через расширение PECL. Вы бы написали одного или нескольких воркеров, которые могут принимать запросы, и поддерживать их постоянно работающий пул. Чем больше бассейн, тем больше вещей вы можете делать одновременно. Как только все данные будут возвращены, вы можете отправить полный набор данных в свой механизм шаблонов и назвать его хорошим.

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

Независимо от того, как вы с этим справитесь, у вас будет гигантская, огромная проблема. Вы копаете чей-то сайт. Возможно, вы очень часто выполняете парсинг чьего-либо сайта. Не у всех с этим все в порядке. Вы должны серьезно подумать об агрессивном кэшировании результатов или даже проверить у каждого из поставщиков, чтобы узнать, есть ли у них API или экспорт данных, к которым вы можете вместо этого запросить.

13.08.2010
  • Я хочу, чтобы он загружался по мере их получения, я запрашиваю более 40 сайтов, поэтому, если я не буду загружать страницу и отображать их по мере их получения, для загрузки страницы потребуется добрых тридцать или 40 секунд. 13.08.2010
  • мы используем API по мере их получения, и я кеширую результаты, ожидая, когда я добавил jQuery и пытаюсь сделать каждую страницу, по одной странице за раз, будучи новичком в jQuery, я все еще возился с ним. По сути, при загрузке я вызываю функцию js, которая, в свою очередь, загружает php-страницу, которая получает нужные мне данные, возвращает их в формате html, а затем функция js возвращает html на страницу, хотя я все еще работаю с ней, я Возможно сделаю отдельный пост, если не разберусь. 16.08.2010
  • @PylonsN00b: То, что вы делаете с точки зрения jQuery, звучит совершенно нормально и правильно, по крайней мере. Удачи! 16.08.2010
  • Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..