【问题标题】:PHP write to filePHP写入文件
【发布时间】:2009-04-10 11:59:18
【问题描述】:

以下是我用来将地图数组“翻译”为 SQL 代码的一些代码,以便在更新游戏地图时轻松更新数据库。如您所见,它将 SQL 代码打印到屏幕上,因此我可以复制和粘贴它。

随着我的地图变得越来越大,这将变得低效,因为它会由于大量输出而导致浏览器崩溃,所以我想知道是否可以让它创建一个 .txt 文件并将所有数据写入其中打印到屏幕上?

<?php
if (isset($_POST['code'])){
$map = $_POST['code'];
$map = preg_replace("/,\\s*}/i", "}", $map);
$map = str_replace("{", "[", $map);
$map = str_replace("}", "]", $map);
$map = json_decode('[' . $map . ']');

$arrayCount1 = 0;
$arrayCount2 = -1;

$H = sprintf('%05d', 00000);
$V = sprintf('%05d', 00000);
$id = 1;

echo "INSERT INTO `map` (`id`, `horizontal`, `verticle`, `image`) VALUES" . "<br />";

for ($count1 = 0; $count1 < sizeof($map[0]); $count1++){
$arrayCount2++;
$arrayCount1 = 0;
$V = sprintf('%05d', $V + 1);
$H = sprintf('%05d', 00000);

for ($count2 = 0; $count2 < sizeof($map); $count2++){
echo "(" . $id . ", '" . $H . "', '" . $V . "', '" . $map[$arrayCount1][$arrayCount2] . "')," . "<br />";
$arrayCount1++;
$id++;
$H = sprintf('%05d', $H + 1);
}
}
}
?>

【问题讨论】:

    标签: php file


    【解决方案1】:

    这应该很简单。添加

    // second parameter 'a' stands for APPEND
    $f = fopen('/path/to/the/file/you/want/to/write/to', 'a');
    

    到脚本的开头。

    添加

    fclose($f);
    

    到您的脚本结束时干净地关闭文件句柄(即使句柄会自动关闭终止脚本)。

    然后将您所有的echoprints 更改为

    fwrite($f, '<<your string>>');
    

    编辑:

    这样,如果数据量非常大,您甚至可以使用 compression stream wrapper 即时压缩数据。

    【讨论】:

      【解决方案2】:

      还有一种更简单的方法:

      ob_start();
      # Your code here ...
      file_put_contents('yourfile.txt', ob_get_clean());
      

      【讨论】:

        【解决方案3】:

        如果这是您计划定期或通过不同脚本编写的内容,请考虑使用flock() 锁定文件并防止数据损坏。

            $fp = fopen("/tmp/lock.txt", "w+");
        
        if (flock($fp, LOCK_EX)) { // do an exclusive lock
            fwrite($fp, "Write something here\n");
            flock($fp, LOCK_UN); // release the lock
        } else {
            echo "Couldn't lock the file !";
        }
        
        fclose($fp);
        

        【讨论】:

          【解决方案4】:
          $str = <<<your string comes here>>>
          if( $fh = @fopen( "myfile.txt", "a+" ) ) {
                      fputs( $fh, $str, strlen($str) );
                      fclose( $fh );
          }
          

          这应该可以...

          【讨论】:

          • 请注意,这里还有其他三个类似的答案... ob_start 和 fwrite 属于“流到文件”类别,而这是一次“推送到文件”,因此更适合转储。 “锁定”答案是最安全的答案,但在大多数情况下很可能是矫枉过正。像这样的东西应该是更可取的,如果你看到它的话。
          【解决方案5】:

          写入所有行,然后将文件发送到客户端。

          查看this 帖子了解更多说明

          【讨论】:

            【解决方案6】:

            +我的 2 美分:

            您可以检查您的数据库服务器的海量数据加载功能,因为它们中的大多数可以比执行数千次插入更快地批量加载文件。

            【讨论】:

            • 绝对!这个问题(来自标题)确实已经被其他人在这里回答了。但对于 OP 实际问题,采用另一种方法可能会更好。转储 TXT 文件,因为它对于浏览器来说太大可能不是最好的。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-03-07
            • 1970-01-01
            • 2010-11-15
            • 2015-12-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多