PHP write to file

2020-03-27 04:51发布

below is some code I am using to "translate" a map array into SQL code so I can easily update my database when I have updated my game map. As you can see it prints out the SQL code onto the screen so I can copy and paste it.

As my maps will get bigger this will become inefficient as it will crash the browser due to mass output, so instead I am wondering if it is possible to make it create a .txt file and write all of the data to it instead of printing onto the screen?

<?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
6条回答
不美不萌又怎样
2楼-- · 2020-03-27 05:07

That should be quite simple. Add

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

to the beginning of your script.

Add

fclose($f);

to the end fo your script to cleanly close the file handle (good pratice even though handles would be closed the the terminating script automatically).

And the change all your echo's and prints to

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

EDIT:

That way you can even compress the data on the fly using a compression stream wrapper if amnount of data gets really large.

查看更多
等我变得足够好
3楼-- · 2020-03-27 05:14
$str = <<<your string comes here>>>
if( $fh = @fopen( "myfile.txt", "a+" ) ) {
            fputs( $fh, $str, strlen($str) );
            fclose( $fh );
}

this should do...

查看更多
Lonely孤独者°
4楼-- · 2020-03-27 05:15

There is an even simpler approach:

ob_start();
# Your code here ...
file_put_contents('yourfile.txt', ob_get_clean());
查看更多
何必那么认真
5楼-- · 2020-03-27 05:21

If this is something you plan on writing on a regular interval or by different scripts, look at using flock() to lock the file and prevent data corruption.

    $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);
查看更多
迷人小祖宗
6楼-- · 2020-03-27 05:25

+my 2 cents:

You may check your database servers mass data loading features, as most of them can load files in batch faster than performing thousands of inserts.

查看更多
孤傲高冷的网名
7楼-- · 2020-03-27 05:29

write all the lines and then send the file to the client.

Check this post for further instructions

查看更多
登录 后发表回答