处理大批量百万级的数据几点重要知识点:
一:设置php运行的内存配置 ini_set("memory_limit","1200M");
在php.ini中有如下配置
; Maximum input variable nesting level
; http://php.net/max-input-nesting-level
;max_input_nesting_level = 64
; How many GET/POST/COOKIE input variables may be accepted
; max_input_vars = 1000
; Maximum amount of memory a script may consume (128MB)
; http://php.net/memory-limit
memory_limit = 100M
会有一个默认的配置,导致运行到一定数量的时候,报错,无法运行下去。
二:设置脚本最大执行时间 set_time_limit ( int $seconds
)
三:不设置缓存结果 mysql_unbuffered_query
在处理大批量数据的时候优势非常大,
(PHP 4 >= 4.0.6, PHP 5)
mysql_unbuffered_query — 向 MySQL 发送一条 SQL 查询,并不获取和缓存结果的行
说明
$query
[, resource $link_identifier
] )mysql_unbuffered_query() 向 MySQL 发送一条 SQL 查询 query
,但不像 mysql_query() 那样自动获取并缓存结果集。一方面,这在处理很大的结果集时会节省可观的内存。另一方面,可以在获取第一行后立即对结果集进行操作,而不用等到整个 SQL 语句都执行完毕。当使用多个数据库连接时,必须指定可选参数 link_identifier
。
Note:
mysql_unbuffered_query() 的好处是有代价的:在 mysql_unbuffered_query() 返回的结果集之上不能使用mysql_num_rows() 和 mysql_data_seek()。此外在向 MySQL 发送一条新的 SQL 查询之前,必须提取掉所有未缓存的 SQL 查询所产生的结果行。
四:取消变量缓存 unset($x)
在循环的结束环节,使用unset方法释放变量占用的内存。
具体代码例子(使用pdo):
$pdo = new PDO("mysql:host=127.0.0.1;dbname=aa","root","root"); $pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false); ini_set("memory_limit","1200M"); set_time_limit(0); $sql = 'select url,num from cas_key limit 100000 '; $rs = $pdo->query($sql); while($value = $rs->fetch()){ unset($xxx); unset($xxx); unset($xxx); } var_dump(memory_get_usage());//查看内存占用方法
如有更多优化方法,欢迎请教指点!