циклы — время ожидания PHP-скрипта на хосте закончено

Я поговорил со службой поддержки one.com, которая сказала, что время их сервера истекло через 50 секунд.

Проблема в том, что время ожидания сценария закончено. Как сделать цикл скриптов, пока он не закончится?

Это мой сценарий:

    <?php

//$id = $_GET['id'];

//$content = file_get_contents("http://www.boligsiden.dk/salg/$id");

$con=mysqli_connect("danico.dk.mysql","danico_dk","password hidden","danico_dk");
// Check connection
if (mysqli_connect_errno()) {
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

$result = mysqli_query($con,"SELECT * FROM elements");

$int = 0;while($row = mysqli_fetch_array($result)) {

if($int < 500 && $row['link'] != "," && $row['link'] != "") {

$link = $row['link'];

$content = file_get_contents("http://www.boligsiden.dk/salg/$link");

preg_match('#"LatLng":{"Lat":(.*?),"Lng":#', $content, $match1);
$lat = $match1[1];

echo "<tr>";

echo "<td>" . $lat . "</td>";
echo "</tr>";

$int = $int + 1;

}

}

?>

Срок не может быть перезаписан. Значение по умолчанию на хосте one.com всегда составляет 50 секунд.

-1

Решение

Как сказали другие ответы, вы должны использовать set_time_limit( int $seconds_before_timeout ) но не нужно помещать это в цикл:

set_time_limit(0) будут отрезать любой тайм-аут (кроме как в безопасном режиме).

Вы должны добавить систему кеширования: после того, как вы повторили свои данные с file_get_contents()Вы можете сохранить его в локальном файле (например, /cache/boligsiden/salg/$link.dat) так что в следующий раз, если кеш является последним (вы решаете, что означает «недавний»), вы получите локальный файл вместо того, чтобы выполнять долгое время http запрос.

Одно из решений:

<?php
$con=mysqli_connect("danico.dk.mysql","danico_dk","password hidden","danico_dk");
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
exit();
// else, script will continue...
// You could use a throw new Exception(...) instead
}

$result = mysqli_query($con,"SELECT * FROM elements WHERE `link`!=',' and `link`!='' LIMIT 500");
// Way easier to put the conditions on the query itself
// as your query is not reused anywhere else

set_time_limit(0);  // No timeout

while($row = mysqli_fetch_array($result))
{
// No more if there since the query itself managed it faster
$link = $row['link'];
$content = file_get_contents("http://www.boligsiden.dk/salg/$link");
preg_match('#"LatLng":{"Lat":(.*?),"Lng":#', $content, $match1);

$lat = $match1[1];

echo "<tr><td>$lat</td></tr>";
}

set_time_limit(30); // From now on, script will timeout again
// That line can be removed depending on what's coming next
// Aka if you still want the script to not timeout, remove that line
?>

set_time_limit() : http://php.net/set_time_limit

1

Другие решения

Вы можете изменить время запуска скрипта:

set_time_limit(300); // allow a maximum execution time of 5 minutes

Предупреждение

Эта функция не работает, когда PHP работает в безопасном режиме. Обходного пути, кроме отключения безопасного режима или изменения ограничения по времени в php.ini, не существует.

Предупреждение

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

0

По вопросам рекламы [email protected]