Fwrite与PHP Cron失败

时间:2012-04-16 17:54:26

标签: php cron fwrite

我遇到这个问题,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);
?>

该文件是否有可能被使用,因此最终无法正常工作并写入空白列表?

3 个答案:

答案 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,所以我们无法真正地描述它。

以下是一些建议:

  1. 修复文件处理程序创建中的语法错误
  2. 您可以为已经存在fopen('r')进程的文件获取fopen('w')处理程序,因此请务必在写入文件时使用PHP flock以确保其他文件流程不会破坏您的列表
  3. 检查您的日志要说什么
  4. 写入一个字符串,然后写入整个字符串,这样你就可以在内部循环中花费更少的时间来打开文件处理程序(特别是在这种情况下,它不会认为字符串会那么长 - 列表链接)
  5. 尝试将您的链接(datetamped)输出到latest.html以外的单独文件中;如果它失败的可能性为5%,请回顾时间段链接,看看它们是如何比较的。您还可以在该文件中包含您的查询,以便您可以隔离问题是否与数据库有关或者写入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将有助于减少文件打开和清空的时间(在执行查询和获取结果时存在一些延迟)。

随意对您的查询进行匿名化并发布 - 您肯定会对结果集产生问题,因为您的代码看起来似乎应该有效。