2010-08-13 4 views
0

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

Псевдо код:

{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, которая получает анализируемые страницы $, и я был только посреди написания: для каждой страницы вы можете получить информацию и наплевать некоторый html w/информацию на странице.

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

ответ

1

Нет, я не имею JS Framework вместо

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

+0

NOte edit Я только что сделал. – KacieHouser

+0

Я хочу, чтобы он загружался, когда я их получаю, я запрашиваю более 40 сайтов, поэтому, если я не буду идти вперед и загружать страницу и отображать их по мере их получения, для загрузки страницы требуется 30 или 40 секунд , – KacieHouser

+0

+1 для jQuery :) –

Смежные вопросы