具體的情境:php從網站列表上抓取資料,然後直接插入mysql資料庫,使用cli模式運行,一次可能要插入上萬條資料
我之前的代碼是這樣的:
ini_set('memory_limit', '512M');$con = mysqli_connect(''');for(...) {//爬蟲抓取代碼省略mysqli_query($con,'抓取後產生的insert語句');}
這樣差不多半天就會報Allowed memory size of 536870912 bytes exhausted (tried to allocate 1542571 bytes)
PS:如果不執行mysql插入操作,而直接將sql語句file_put_contents到一個檔案中,那是不會報錯的,所以排除爬蟲代碼的問題
現在我把mysql的插入語句封裝成一個方法:
function execute($query){ $mysqli = new mysqli(...); $mysqli->query('set names utf8mb4'); $mysqli->query($query); $mysqli->close();}
不知道還會不會發生這個問題呢?
各位有什麼好辦法嗎?
回複內容:
具體的情境:php從網站列表上抓取資料,然後直接插入mysql資料庫,使用cli模式運行,一次可能要插入上萬條資料
我之前的代碼是這樣的:
ini_set('memory_limit', '512M');$con = mysqli_connect(''');for(...) {//爬蟲抓取代碼省略mysqli_query($con,'抓取後產生的insert語句');}
這樣差不多半天就會報Allowed memory size of 536870912 bytes exhausted (tried to allocate 1542571 bytes)
PS:如果不執行mysql插入操作,而直接將sql語句file_put_contents到一個檔案中,那是不會報錯的,所以排除爬蟲代碼的問題
現在我把mysql的插入語句封裝成一個方法:
function execute($query){ $mysqli = new mysqli(...); $mysqli->query('set names utf8mb4'); $mysqli->query($query); $mysqli->close();}
不知道還會不會發生這個問題呢?
各位有什麼好辦法嗎?
你目前的做法是上萬次插入上萬條資料,而不是一次插入上萬條資料。
From
INSERT INTO tbl_name (a,b,c) VALUES (1,2,3);INSERT INTO tbl_name (a,b,c) VALUES (4,5,6);INSERT INTO tbl_name (a,b,c) VALUES (7,8,9);
To
INSERT INTO tbl_name (a,b,c)VALUES (1,2,3), (4,5,6), (7,8,9);
資料庫插入操作改為批量提交方式
$sql = array(); foreach( $data as $row ) { $sql[] = '("'.mysql_real_escape_string($row['text']).'", '.$row['category_id'].')';}mysql_query('INSERT INTO table (text, category) VALUES '.implode(',', $sql));
之前做個一個類似的功能,規模是大幾十萬條
我是用的web方式去執行,在for{}中判斷一個條件,比如達到萬條後跳回本頁面,把n*10000這個參數傳過去。