PHP写入文件

3
以下是我正在使用的一些代码,用于将地图数组“翻译”成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);
}
}
}
?>
6个回答

10
这应该很简单。添加


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

将其添加到您的脚本开头。

添加

fclose($f);

为了干净地关闭文件句柄(即使句柄将自动由终止脚本关闭),请在您的脚本末尾添加代码。

然后将所有的echoprint更改为

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

编辑:

这样,如果数据量变得非常大,您甚至可以使用压缩流包装器实时压缩数据。


8
有一种更简单的方法:
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);

2
$str = <<<your string comes here>>>
if( $fh = @fopen( "myfile.txt", "a+" ) ) {
            fputs( $fh, $str, strlen($str) );
            fclose( $fh );
}

这应该可以做到...


请注意,ob_start和fwrite属于“流到文件”类别,而这个方法是一次性“推送到文件”,因此更适合用于转储。虽然“锁定”答案最安全,但在大多数情况下可能过于复杂。如果您认为这样做是可取的话,应该使用类似以下的方法。 - cregox

1

编写所有代码行,然后将文件发送给客户端。

有关进一步说明,请查看this帖子


1
+我的两分钱:

你可以检查一下数据库服务器的批量数据加载功能,因为大多数数据库都可以比执行成千上万个插入操作更快地批量加载文件。


肯定的!这个问题(从标题中)确实已经被其他人回答了。但对于OP实际的问题,可能最好采用另一种方法。因为文件太大而将其转储为TXT文件可能不是最好的选择。 - cregox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接