我遇到这个问题,cron每5分钟运行一次php脚本来更新列表。
但是,列表无法在5%的时间内更新,列表最终为空白。我不相信它与cron有关,因为我认为我没有像100次尝试那样手动生成列表两次。
我认为与此相关的是,当网站上有50多人时,它将无法生成,可能与服务器正忙有关。我添加了一个检查,以确保它不是MySQL不返回行(这似乎是不可能的)但它仍然让我相信fwrite失败。
<?
$fileHandle = fopen("latest.html", 'w');
$links = array();
$query1 = $db_conn -> query("SELECT * FROM `views` ORDER BY `date` DESC LIMIT 0,20");
while ($result1 = $db_conn -> fetch_row($query1))
{
$result2 = $db_conn -> fetch_query("SELECT * FROM `title` WHERE `id` = '" . $result1['id'] . "'");
array_push($links, "<a href='/title/" . $result2['title'] . "'>" . $result2['title'] . "</a>");
}
if (count($links) > 0)
fwrite($fileHandle, implode(" • ", $links));
else
echo "Didn't work!";
fclose($fileHandle);
?>
该文件是否有可能被使用,因此最终无法正常工作并写入空白列表?
答案 0 :(得分:1)
$ fileHandle =“latest.html”,“w”);
我会假设你的意思
$ fileHandle = fopen(“latest.html”,“w”);
这里的'w'打开文件,将光标放在开头并将文件截断为零长度。
如果在执行此操作之前检查count($ links),则在没有任何内容写入时不会截断该文件。
<?php
$links = "QUERY HERE AND HANDLE THE RESULTS (REMOVED)";
if (count($links) > 0)
{
$fileHandle = fopen("latest.html", 'w');
fwrite($fileHandle, implode(" • ", $links));
fclose($fileHandle);
}
else
{
echo "Didn't work!";
}
?>
答案 1 :(得分:1)
该文件是否有可能被使用,所以最终没有 工作和写一个空白列表?
嗯,是的。我们不知道你运行的其他代码是什么操纵了latest.html,所以我们无法真正地描述它。
以下是一些建议:
答案 2 :(得分:1)
我认为你让自己开放的可能是查询没有返回任何数据。你的例子中的“删除”逻辑可能有助于揭示正在发生的事情。解决这个问题的一个好方法是将一些内容写入日志文件,并在几十次迭代脚本后检查该日志文件。为了在你的latest.html文件中包含 something ,我会在你当前的代码中使用file_put_contents。
<?php
$links = array();
$query = "SELECT links FROM tableA";
$result = mysql_query($links);
while ($row = mysql_fetch_row($result)) {
$links[] = $row[0];
}
if (count($links) > 0) {
file_put_contents('latest.html', implode(" * ", $links));
file_put_contents('linkupdate.log', "got links: " . count($links) . "\n", FILE_APPEND);
} else {
file_put_contents('linkupdate.log', "No links? [(" . mysql_errno() . ") " . mysql_error() . "]\n", FILE_APPEND);
}
?>
如果我们找不到链接,我们将不会覆盖以前的数据文件。如果我们遇到可能导致问题的MySQL错误,它将显示在日志输出中。
对文件的读取不应该阻止写入,但切换到file_put_contents将有助于减少文件打开和清空的时间(在执行查询和获取结果时存在一些延迟)。
随意对您的查询进行匿名化并发布 - 您肯定会对结果集产生问题,因为您的代码看起来似乎应该有效。