Вызовите функцию PHP из Smarty с AJAX без каких-либо действий пользователя - PullRequest
0 голосов
/ 13 августа 2010

Я посещаю множество разных сайтов, чтобы получить список информации, и я хочу отображать эту информацию, когда получаю ее. Сейчас я использую шаблон 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. Я запустил функцию onload, которая получает анализируемые $ страниц, и я только начал писать: foreach page получает информацию и выплевывает html с помощью информация на странице.

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

1 Ответ

1 голос
/ 13 августа 2010

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

Сначала исправьте.Вы не хотите манипулировать запросами XMLHTTP самостоятельно. jQuery - это каноническая библиотека JS SO, и она довольно изящна.

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

...