主机上的PHP脚本在完成之前超时

时间:2014-09-17 08:33:38

标签: php loops while-loop

我与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秒。

2 个答案:

答案 0 :(得分:1)

像其他答案一样,你应该使用set_time_limit( int $seconds_before_timeout ),但不需要把它放在循环中:

set_time_limit(0)切断任何超时(安全模式除外)。

您应该添加一个缓存系统:一旦您使用file_get_contents()重试数据,就可以将其保存到本地文件(如/cache/boligsiden/salg/$link.dat),以便下次如果缓存是最近(你决定&#34;最近&#34;的意思),你将获得本地文件,而不是做一个长期完成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 :(得分:0)

您可以更改允许运行脚本的时间:

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

警告

当PHP以安全模式运行时,此功能无效。除了关闭安全模式或更改php.ini中的时间限制外,没有其他解决方法。

警告

小心这个选项。错误的使用会导致脚本永远不会结束。在脚本的顶部放置一个明确的时间限制是最安全的方法。