所以,我有一个包含大数据的数据库。目前使用的数据约为2,6 GB。
需要将所有数据写入文本文件,以便以后在其他脚本中使用。
每个文件的数据受到限制,并分成多个部分。每个文件100个结果(每个文件大约37MB)。那是大约71个文件。
数据是序列化的json数据,然后用openssl加密。
正确地将数据写入文件,直到240秒后达到最大执行时间。那是在大约20个文件之后......
好吧,我可以延长那个时间,但那不是问题。
问题如下:
data
换句话说,每写入一个文件,每个文件的写入时间都会大大增加,这会导致脚本慢速离开。
脚本的结构有点像这样:
Writing file 1-6: +/- 5 seconds
Writing file 7-8: +/- 7 seconds
Writing file 9-11: +/- 12 seconds
Writing file 12-14: +/- 17 seconds
Writing file 14-16: +/- 20 seconds
Writing file 16-18: +/- 23 seconds
Writing file 19-20: +/- 27 seconds
Note: time is needed time per file
帮助后的工作代码
$needed_files = count needed files/parts
for ($part=1; $part<=$needed_files; $part++) { // Loop throught parts
$query > mysqli select data
$data > json_encode > serialize > openssl_encrypyt
file_put_contents($filename.$part, $data, LOCK_EX);
}
答案 0 :(得分:1)
就我个人而言,我会把它编码为没有LIMIT的单个SELECT,然后根据$rec_per_file = ?;
编写单while get results
循环中的输出
请原谅这些神秘的代码,你没有给我们很多线索
<?php
//ini_set('max_execution_time', 600); // only use if you have to
$filename = 'something';
$filename_suffix = 1;
$rec_per_file = 100;
$sql = "SELECT ....";
Run query
$rec_count = 0;
while ( $row = fetch a row ) {
$data[] = serialize > openssl_encrypyt
$rec_count++;
if ( $rec_count >= $rec_per_file ) {
$json_string = json_encode($data);
file_put_contents($filename.$filename_suffix,
$json_string,
LOCK_EX);
$filename_suffix++; // inc the suffix
$rec_count = 0; // reset counter
$data = array(); // clear data
// add 30 seconds to the remaining max_execution_time
// or at least a number >= to the time you expect this
// while loop to get back to this if statement
set_time_limit(30);
}
}
// catch the last few rows
$json_string = json_encode($data);
file_put_contents($filename.$filename_suffix, $data, LOCK_EX);
此外,我不确定您为什么要serialize()
和json_encode()
根据您对执行时间的评论,我有一个想法。如果您将set_time_limit(seconds)
放在if
循环内的while
内,它可能更干净,您不必将ini_set('max_execution_time', 600);
设置为非常大的数字,如果您这里有一个真正的错误可能会导致PHP在踢出脚本之前长时间处理。
从手册:
设置允许脚本运行的秒数。如果达到此值,脚本将返回致命错误。默认限制为30秒,如果存在,则为php.ini中定义的max_execution_time值。
调用时,set_time_limit()从零重新启动超时计数器。换句话说,如果超时是默认的30秒,并且脚本执行25秒,则进行诸如set_time_limit(20)之类的调用,脚本将在超时之前运行总共45秒。