2010-04-18 3 views
13

В настоящее время я использую file_get_contents() для отправки данных GET в массив объектов, но при выполнении страницы я получаю эту ошибку:Быстрее альтернатива file_get_contents()

Фатальная ошибка: Максимальное время выполнения 30 секунды превышены

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

Вот что я в настоящее время:

 foreach($sites as $s) //Create one line to read from a wide array 
     { 
       file_get_contents($s['url']); // Send to the shells 
     } 

EDIT: Для того, чтобы очистить путаницы, этот скрипт используется для запуска сценариев на других серверах, которые не возвращают никаких данных.

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

 $ch = curl_init($s['url']); //load the urls 
     curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1); //Only send the data, don't wait. 
     curl_exec($ch); //Execute 
     curl_close($ch); //Close it off. 

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

EDIT: А, нашел проблему. Я использовал CURLOPT_CONNECTTIMEOUT вместо CURLOPT_TIMEOUT. Упс.

Однако теперь скрипты не запускаются. Каждый из них использует ignore_user_abort (TRUE); поэтому я не могу понять проблему

Hah, царапина это. Работает сейчас. Большое спасибо всем

+0

Вы пытались использовать локон? –

+0

Нет, у меня нет опыта работы с cURL. Хотел сделать это с чем-то, с чем я, по крайней мере, немного поработал. Вы думаете, что я должен отказаться от этого php и пойти с cURL? – Rob

+0

Что именно делает веб-страница? вы просто хотите, чтобы он запускал скрипт, который должен запускаться сам по себе, который не возвращает никаких данных? –

ответ

6

Существует много способов решить эту проблему.

Вы можете использовать cURL с его функциями curl_multi_ * для асинхронного выполнения запросов.Или используйте cURL обычным способом, но используя 1 в качестве предела тайм-аута, чтобы он запрашивал и возвращал таймаут, но запрос будет выполнен.

Если у вас нет установленной cURL, вы можете продолжать использовать file_get_contents, но процессы forking (не так здорово, но работают), используя что-то вроде ZendX_Console_Process_Unix, чтобы избежать ожидания между каждым запросом.

+0

Да дайте мне взглянуть на это и играть с ним в течение нескольких минут – Rob

+0

попытался это: \t \t \t $ CH = curl_init ($ s [ 'URL']); // загружать URL-адреса \t \t \t curl_setopt ($ ch, CURLOPT_CONNECTTIMEOUT, 1); // Только отправлять данные, не ждите. \t \t \t curl_exec ($ ch); // Выполнение \t \t \t curl_close ($ ch); // Закройте его Он по-прежнему загружает все из них – Rob

+0

Извините, у меня нет времени его протестировать. Вы можете попробовать другие методы. – Franco

2

Re вашего обновления, вам нужно только триггера операции:

Вы можете попробовать использовать file_get_contents с тайм-аутом. Это приведет к вызову удаленного сценария, но соединение прекращается через n секунд (например, 1).

Если удаленный сценарий сконфигурирован так, что он продолжает работать, даже если соединение прерывается (в PHP должно быть ignore_user_abort), оно должно работать.

Попробуйте. Если это не сработает, вам не придется увеличивать ваш time_limit или использовать внешний исполняемый файл. Но из того, что вы говорите, вам просто нужно сделать запрос - это должно сработать. Вы даже можете попытаться установить тайм-аут на 0, но я бы не стал доверять этому.

От here:

<?php 
$ctx = stream_context_create(array(
    'http' => array(
     'timeout' => 1 
     ) 
    ) 
); 
file_get_contents("http://example.com/", 0, $ctx); 
?> 

Чтобы быть справедливым, ответ Криса уже включает в себя такую ​​возможность: curl также имеет переключатель тайм-аут.

+0

Ну, я знаю, почему загрузка занимает так много времени, ее страницы, которые я загружаю, им требуется от 30 секунд до 5 минут для полной загрузки. – Rob

1

Это не файл_get_contents(), который потребляет столько времени, сколько сам по себе.
Считайте, что вы не отправляете данные GET в массив сайтов, а создаете rss и позволяете им получать данные RSS.

+0

+1, самый удобный подход, если канал доступен. Но это оставит некоторые источники слабых мест, где он продолжает блокировать, что завихрение будет исправлено. –

1

Я не полностью понимаю смысл вашего сценария. Но вот то, что вы можете сделать:

  1. Для того, чтобы избежать фатальной ошибки быстро вы можете просто добавить set_time_limit (120) в начале файла. Это позволит сценарию работать в течение 2 минут. Конечно, вы можете использовать любое число, которое вы хотите, и 0 для бесконечного.
  2. Если вам просто нужно вызвать URL-адрес, и вы не «заботитесь» о результатах, вы должны использовать cUrl в асинхронном режиме. В этом случае любой вызов URL-адреса не будет ждать завершения. И вы можете позвонить им очень быстро.

BR.

1

Если удаленные страницы загружаются до 5 минут, ваш файл_get_contents будет сидеть и ждать 5 минут. Есть ли способ изменить удаленные сценарии на fork в фоновый процесс и сделать там тяжелую обработку? Таким образом, ваш первоначальный хит вернется почти сразу, и не придется ждать периода запуска.

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

+0

Мне нравится идея HEAD, возможно, стоит попробовать. – svens

2

Как упоминал Франко, и я не уверен, что вас подхватили, вы специально хотите использовать функции curl_multi, а не обычные завитки. Это объединяет несколько объектов curl в объект curl_multi и выполняет их одновременно, возвращая (или не в вашем случае) ответы по мере их поступления.

Пример на http://php.net/curl_multi_init

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