我必须执行一次PHP代码才能在我的数据库中进行一些更改以获得更好的表。代码太重,向数据库发送超过190000个查询(选择和插入)。
现在的问题是当我在浏览器上执行它,在数据库上形成结果和我设置为echo的单词以检查它是否以正确的方式运行时,我发现它是部分执行的。页面上没有错误/警告/通知。
我将最大执行时间和所有相关设置设置为1小时,但它只需要30分钟并立即停止for循环。
这是我代码的一部分示例:
for ($i=9;$i<=19909; $i++){
$j=0;
$select= "select synonym from synonym where x_=". $i ."";
//echo $select;
//echo "</br>";
$select_result= mysqli_query($connection,$select);
if (mysqli_num_rows($select_result)>0) {
$row = mysqli_fetch_assoc($select_result);
$arra = explode("،",$row["synonym"]);
}
while ($arra[$j]){
$text=trim($arra[$j]);
$search="select word from semiresult where word='". $text ."'";
$search_result= mysqli_query($connection,$search);
if (mysqli_num_rows($search_result)==0) {
$insert="insert into semiresult (x, word, synonym) values ('','". $text."','".$syn."')";
}elseif (mysqli_num_rows($search_result)>0){
$repeat="UPDATE semiresult SET synonym=CONCAT(synonym,'".$syn2."') where word like'".$arra[$j]."'";
$repeat_result=mysqli_query($connection,$repeat) or die ('request "Could not execute SQL query" '.$repeat);
}
答案 0 :(得分:1)
通过工作,你可以避免在PHP中做很多事情。是否值得取决于数据和表格声明。
例如,假设该单词在semiresult表中具有唯一索引,并且同义词字段最多包含1000个分隔字段,则可以执行以下操作(未经测试): -
INSERT INTO semiresult (x, word, synonym)
SELECT '',
'". $text."',
SUBSRTING_INDEX(SUBSRTING_INDEX(t1.synonym, '،', (hundreds.aCnt * 100 + tens.aCnt * 10 + units.aCnt + 1)), '،', -1)
FROM synonym t1
CROSS JOIN
(
SELECT 0 aCnt UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) AS units
CROSS JOIN
(
SELECT 0 aCnt UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) AS tens
CROSS JOIN
(
SELECT 0 aCnt UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) AS hundreds
WHERE t1.x_ BETWEEN 9 AND 19909
AND LENGTH(t1.synonym) - LENGTH(REPLACE(t1.synonym, '،', '')) > (hundreds.aCnt * 100 + tens.aCnt * 10 + units.aCnt)
ON DUPLICATE KEY UPDATE synonym=CONCAT(synonym, VALUES(synonym))
答案 1 :(得分:0)
毕竟我解决了!!
在php设置中将时间限制(例如最大执行时间和任何其他时间限制)更改为两小时之后,我在代码的开头添加了这行代码,然后执行直到代码结束。
set_time_limit(0);
此代码计划仅执行一次,否则我没有进行此更改。