【问题标题】:PHP generating XML, time-outs randomlyPHP生成XML,随机超时
【发布时间】:2008-10-17 11:29:15
【问题描述】:

我不知道。这会导致看似随机的超时。这些反过来会破坏我正在加载它的闪存。有没有人见过这样的东西?

<?php
require_once("../includes/class.database.php");
require_once("../includes/dbConnectInfo.inc");
require_once("../includes/functions.php");

include("../includes/conn.php");

$cat = $_GET['category'];
$result = mysql_query("SELECT * FROM media WHERE related_page_id=4 && type='copy' ORDER BY id ASC LIMIT 6");

$media = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\n";
$media .= "<content>\n";
while($row = mysql_fetch_array($result)) {
    $media .="<member>\n";
    $body = $row[copy];

    if($row[title] == "") {
        $media .= "<title><![CDATA[";
        $media .= "Team";
        $media .="]]></title>\n";
    } elseif ($row['path']=="") {
        $name = explode("/",$row[title],2);

        $media .= "<name><![CDATA[";
        $media .= $name[0];
        $media .="]]></name>\n";

        $media .= "<job><![CDATA[";
        $media .= $name[1];
        $media .="]]></job>\n";
    } 

    if($body !="") {
        $media .="<bio><![CDATA[";
        $media .= $body;
        $media .= "]]></bio>\n";
    }

    $something = $row['id'];
    $result1 = mysql_query("SELECT * FROM media WHERE assets='$something'");
    $media .= "<images>";
    while($row1 = mysql_fetch_array($result1)) {
        $img = explode("/",$row1[path],2);
        $media .= "<image url='$img[1]' />";
    }
    $media .= "</images>\n";
    $media .="</member>\n";
}   
$media .= "</content>";
echo $media;
?>

【问题讨论】:

  • 通过连接将两个查询合并为一个,而不是对第一个返回的每一行进行额外查询,难道不是更快吗?

标签: php xml


【解决方案1】:

如果在代码中添加set_time_limit(0); 会发生什么?我通常将该行添加到包含语句下方的长时间执行代码中。

既然这行得通,让我详细说明一下。

默认情况下,PHP 脚本设置为只执行这么长时间。我相信安装 PHP 时的限制是 30 秒,但这可以在 php.ini 文件中更改。但是,您可能不想让所有脚本运行相同的时间长度 - 对于大多数脚本来说,30 秒可能就可以了。 set_time_limit 函数允许您设置一个脚本的执行时间。它需要一个整数值,表示脚本运行的秒数,但值为 0 表示脚本将永远运行。

【讨论】:

    【解决方案2】:

    PHP 的默认超时为 30 秒。如果该代码需要 30 秒,那么我认为您遇到了一些问题!您在媒体表上有索引吗(related_page_id + type 上有一个索引,assets 上有一个索引应该这样做)。

    增加时间限制更像是隐藏问题而不是解决问题,我绝对不会使用set_time_limit(0);。您需要某种合理的最大值,可以是一分钟、一小时、一天或其他什么,这取决于您的需要。

    【讨论】:

    • 但是您确实希望运行一些代码以完成。我们有一个包含 30k 条记录的数据库,并且我们每月检查一次。我们不希望因为任何原因而停止,所以无限的时间限制是合适的。
    • 你真的是这个意思吗?无限时间意味着一个多月……您是否使用同时运行的两个(或更多)脚本副本对其进行了测试? 24/7 全天候运行对性能有何影响?我仍然认为您最好将其运行的最长时间乘以例如 10。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-03
    • 2014-09-25
    • 2010-09-05
    • 2014-05-18
    • 2013-04-02
    • 2013-06-03
    相关资源
    最近更新 更多