php 执行多个文件,PHP提高执行多个查询时读取一千行文件的性能
我試圖建立一個腳本,我需要讀取txt文件并使用文件上的行執行某個過程。例如,我需要檢查ID是否存在,如果信息已更新(如果有),則更新當前表(如果不存在),則在另一個臨時表上插入一個新行,稍后手動檢查。PHP提高執行多個查詢時讀取一千行文件的性能
這些文件可能包含超過20,30000行。
當我剛剛讀取文件并從行中打印一些dummie內容時,需要40-50ms。但是,當我需要連接到數據庫來執行所有這些驗證時,由于超時而在停止之前停止。
這是我在做什么至今:
$handle = fopen($path, "r") or die("Couldn't get handle");
if ($handle) {
while (!feof($handle)) {
$buffer = fgets($handle, 4096);
$segment = explode('|', $buffer);
if (strlen($segment[0]) > 6) {
$param = [':code' => intval($segment[0])];
$codeObj = Sql::exec("SELECT value FROM product WHERE code = :code", $param);
if (!$codeObj) {
$param = [
':code' => $segment[0],
':name' => $segment[1],
':value' => $segment[2],
];
Sql::exec("INSERT INTO product_tmp (code, name, value) VALUES (:code, :name, :value)", $param);
} else {
if ($codeObj->value !== $segment[2]) {
$param = [
':code' => $segment[0],
':value' => $segment[2],
];
Sql::exec("UPDATE product SET value = :value WHERE code = :code", $param);
}
}
}
}
fclose($handle);
}
這是我的SQL類與PDO連接并執行查詢:
public static function exec($sql, $param = null) {
try {
$conn = new PDO('mysql:charset=utf8mb4;host= '....'); // I've just deleted the information to connect to the database (password, user, etc.)
$q = $conn->prepare($sql);
if (isset($param)) {
foreach ($param as $key => $value) {
$$key = $value;
$q->bindParam($key, $$key);
}
}
$q->execute();
$response = $q->fetchAll();
if (count($response)) return $response;
return false;
} catch(PDOException $e) {
return 'ERROR: ' . $e->getMessage();
}
}
正如你所看到的,每個查詢我通過Sql::exec()來做,正在打開一個新的連接。我不知道這是否可能是此過程出現延遲的原因,因為當我沒有執行任何Sql查詢時,腳本在ms內運行。
或者其他部分的代碼可能會導致這個問題?
+0
例如,您是通過命令行還是通過HTTP和Apache在后臺運行它。似乎更適合后臺進程。 –
+0
當然,我不會連接到循環中的數據庫,你應該保存連接到一個類屬性或你有什么,并重新使用它。 –
+0
@ArtisticPhoenix這是通過cron作業在后臺運行。我的意思是,cronjob調用這個php文件來執行這個函數,但它也可以手動調用(如果需要的話 - 不常見),或者在這個測試階段,我仍然在構建腳本,然后我正在通過xhr request –
總結
以上是生活随笔為你收集整理的php 执行多个文件,PHP提高执行多个查询时读取一千行文件的性能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 租车信息系统数据库设计(3)
- 下一篇: GridView 自写分页 存储过程