Циклирование функции отнимает много времени - PullRequest
0 голосов
/ 08 ноября 2011

У меня есть функция php, которая анализирует URL-адрес xml и выдает мне массив. Эта функция использует perticular id и выдает всю информацию, относящуюся к этому id, которая передается в форме.Теперь у меня есть 20 различных идентификаторов, и я передаю эти идентификаторы в этой форме, используя цикл foreach, как показано ниже

<?php 
    $relatedSlides = $result['RelatedSlideshows'];
    if(!empty($relatedSlides)){
        $k=1;
        foreach($relatedSlides as $Related){
            RelatedSlides($Related);
            if($k%6==0){
                echo '</tr><tr>';
            }
            $k++;
        }
    }
?>

Это цикл foreach.$relatedSlides - это массив всех идентификаторов слайдов.Сейчас я пишу функцию, которая анализирует информацию об определенном идентификаторе.

function RelatedSlides($slideId){
    $secret_key = 'my api key';
    $ts=time();
    $hash=sha1($secret_key.$ts);
    $key = 'my secret key';
    $url = 'http://www.slideshare.net/api/2/get_slideshow?api_key='.$key.'&ts='.$ts.'& hash='.$hash.'&slideshow_id='.$slideId.'&detailed=1';
    echo $url;
    $ch=curl_init() or die (curl_error());
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla Firefox');
    $query = curl_exec($ch);
    $errorCode = curl_errno($ch); 
    curl_close($ch);
    $array = (array) simplexml_load_string($query);
    //echo '<pre>';
    //print_r($array);
    //return $array;
    echo "<font size=\"18\">return code is ".$errorCode."</font>";
    echo '<td valign="top"><div id="slide_thumb"><a href="viewslide.php?slideId='.$array['ID'].'&title='.$array['StrippedTitle'].'"><img src=" '.$array['ThumbnailURL'].'" width="100" height="100"/></a></div><div id="slide_thum_des"><strong>Views:</strong>'.$array['NumViews'].'<br /><ahref="'.$array['DownloadUrl'].'">'.$array['Title'].'....</a></div></td>';
}

Когда я вызываю эту функцию, мое соединение каждый раз прерывается.Функция абсолютно правильная.Он выдает все данные о конкретном идентификаторе, но когда я запускаю его в цикле foreach для многих идентификаторов, отображается «соединение было сброшено» или «истекло время ожидания соединения».

Ответы [ 2 ]

0 голосов
/ 09 ноября 2011

Вы можете попробовать несколько вещей:

  1. Настройте ваш обработчик скручивания вне функции RelateSlides ().Таким образом, вам не нужно собирать и разбирать ресурс $ ch каждую итерацию.

  2. Проверьте API-интерфейс slideshare.net и посмотрите, есть ли какие-либо параметры, которые вы можете передать для удаленияфайлы меньшего размера.

  3. Как мудро упомянул Люк, вы можете сделать страницу асинхронной, то есть вы можете визуализировать страницу с 6 плитками, а затем заставить каждую плитку выполнить вызов ajax для нужного слайда.,Таким образом, по крайней мере, пользователь может видеть что-то во время загрузки плитки, а не «зависать», когда вы извлекаете все изображения одновременно.

  4. Я верю, что слайдшер имеет довольноНадежный CDN, на котором размещены эти изображения, возможно, вы захотите узнать, есть ли у них серверы ближе к вашему веб-серверу.

Быстрый вопрос, является ли опция скручивания тем, как slideshare.net предложил вам потянуть изображения?Скорее всего, вы можете просто создать тег изображения со ссылкой непосредственно на их API:

 echo '<img src="http://www.slideshare.net/api/2/get_slideshow?api_key='.$key.'&ts='.$ts.'& hash='.$hash.'&slideshow_id='.$slideId.'&detailed=1' />';

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

0 голосов
/ 08 ноября 2011

Тайм-аут из-за того, что ваша функция занимает время, как вы уже сказали. Это нормально, его также можно настроить в PHP config или Apache (не помню, я бы сначала проверил PHP config). Помните, что тайм-аут существует по причине - например. хорошо, когда вы запускаете цикл inf - редко, но возможно.

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

например.

  1. Загрузите страницу с некоторыми скриптами JS / JQuery.
  2. Вызовите async, чтобы получить список идентификаторов (это делается с помощью ajax-вызова через jquery - самый простой)
  3. Анализировать ответ (JSON?) На стороне клиента и выполнять каждый запрос для каждого асинхронного идентификатора.
  4. Подождите, пока все результаты вернутся и отобразят их так, как вы хотите.
...