PHP: бесконечный цикл и ограничение по времени! - PullRequest
1 голос
/ 30 мая 2010

У меня есть кусок кода, который выбирает данные, давая ему идентификатор. Например, если я назначу ему идентификатор 1230, код извлекает данные статьи с идентификатором 1230 с веб-сайта (внешний) и вставляет их в базу данных.

Теперь проблема в том, что мне нужно получить все статьи, скажем, от ID 00001 до 99999. Если цикл for a for, через 60 секунд внутреннее ограничение времени PHP останавливает цикл. Если вы используете header("Location: code.php?id=00001") или header("Location: code.php?id=".$ID) и увеличиваете $ ID ++, а затем перенаправляете на ту же страницу, браузер останавливает меня из-за проблемы бесконечного цикла или перенаправления.

Пожалуйста, ПОМОГИТЕ!

Ответы [ 3 ]

1 голос
/ 30 мая 2010

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

set_time_limit(0);
0 голосов
/ 30 мая 2010

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

Другой подход: используйте Javascript "window.location =" вместо заголовка для перенаправления.

0 голосов
/ 30 мая 2010

Ну, есть несколько способов сделать это.

Лучший способ сделать это - настроить cron на выполнение вашего скребка каждые X минут.

В этом случае вам нужно будет отслеживать, какой у вас сейчас идентификатор.

поэтому, если вы настроили функцию записи в файл, вы можете сделать это следующим образом

-

Открыть файл (получить текущий идентификатор) Запустите Parser с идентификатором 60 раз Вставьте данные Откройте файл и обновите его с новым идентификатором закройте файлы и выйдите.

Это займет несколько часов или столько времени, сколько потребуется.

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

    `session_start();
    $id = (isset($_SESSION['position']) ? $_SESSION['position'] : 0);
    for($i=$id;$<=9999;$i++)
    {
       //FetchItem($id); //Or whatever function it is you use!
       //Update the id for next run.
       $_SESSION['position'] = $id;
    }`
    
  2. Если вы желаете перераспределить ресурсы своих серверов, вы можете продлить эти 60 секунд, используя set_time_limit (120), на 120 секунд или что вы предпочитаете.

...