Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP脚本超时时间过长_Php_Mysql_Performance - Fatal编程技术网

PHP脚本超时时间过长

PHP脚本超时时间过长,php,mysql,performance,Php,Mysql,Performance,我正在读取一个包含1000行的csv文件。我对每一行执行一个查询,查询如下: $foobar = SELECT foo1.ID FROM foo1 INNER JOIN foo2 ON foo2.ID = foo1.ID LEFT JOIN foo3 bar1 ON bar1.ID = foo1.ID LEFT JOIN foo3 bar2 ON bar2.ID = foo1.ID WHERE foo1.Text LIKE :txt AN

我正在读取一个包含1000行的csv文件。我对每一行执行一个查询,查询如下:

$foobar = 
    SELECT foo1.ID
    FROM foo1
    INNER JOIN foo2 ON foo2.ID = foo1.ID
    LEFT JOIN foo3 bar1 ON bar1.ID = foo1.ID
    LEFT JOIN foo3 bar2 ON bar2.ID = foo1.ID
    WHERE foo1.Text LIKE :txt
    AND foo2.col1 = 31 AND bar1.col1 = 138 AND bar2.col1 = 271
    AND (bar1.col2 = "" OR bar1.col2 IS NULL) 
    AND (bar2.col2 = "" OR bar2.col2 IS NULL)
对此运行explain,只返回正在搜索的100行,并返回常量ref,这意味着它应该使用索引

现在在我的循环中,我有以下内容:

while ($line = fgetcsv($handle)){
    $foobar->execute(); 
    $data = $foobar->fetchAll(\PDO::FETCH_ASSOC);
    var_dump($data); echo '<br /><br />';
}
while($line=fgetcsv($handle)){
$foobar->execute();
$data=$foobar->fetchAll(\PDO::FETCH\u ASSOC);
变量转储($data);回显“

”; }
为什么要花很长时间?CSV文件中只有1000行,在查询中运行explain似乎足够快

它会在5-10分钟后超时,但不会花那么长时间,我不知道是什么问题


有一件事需要注意foo3表包含7百万条记录。

尝试在控制台中启动该过程。请参阅after exec()。进程可以将有关进程状态的数据放在共享存储(mysql/file/etc…)中。

仅仅因为查询“使用”索引,并不意味着“它应该很快”。速度取决于是否可以使用“正确”的索引,以及查询的构造是否高效

例如,您的查询使用:

WHERE foo1.Text LIKE :txt
如果foo1和/或foo1.Text中有许多行(即文本类型字段),并且:txt可能以%开头,则表示主表将无法使用索引

此外,所有必需的联接索引可能都不存在。例如,从查询中可以明显看出,字段foo3.ID不是主键


为了更好地回答“为什么要花很长时间?”的问题,我需要更多关于表foo1/2/3结构的信息。

您是否确保脚本能够实际检测行尾?如果没有,那就试试看

ini_set('auto_detect_line_endings',TRUE);
如果您似乎没有指定数据的长度,请尝试以下操作:

$line = fgetcsv($handle, 1000)
在浏览了PHP手册之后,最常用的方法是检查

while (($line = fgetcsv($handle, 1000)) !== FALSE)
我还注意到您在fetchAll语句中添加了\项,请尝试以下操作:

fetchAll(PDO::FETCH_ASSOC)
您还可以执行以下操作来处理数据:

if($result = $stmt->fetchAll(PDO::FETCH_ASSOC))
{
    foreach($result as $res)
    {
        foreach($res as $key=>$val)
        {
            $temp[$key] = utf8_encode($val);
        }
        array_push($array, $temp);
    }
    var_dump($array);
    echo '<br /><br />';
}
if($result=$stmt->fetchAll(PDO::FETCH_ASSOC))
{
foreach(结果为$res)
{
foreach($res as$key=>$val)
{
$temp[$key]=utf8_编码($val);
}
阵列推送($array,$temp);
}
变量转储($数组);
回音“

”; }

另一方面,您的主要问题可能是查询本身。也许我给你的方法可以更快地解决问题。

是否可能只有一行有问题?我将从CLI运行此命令开始;将输出更改为只记录行的索引及其执行所需的时间。这将有助于澄清问题。

Hmmm。。。它运行得很慢,因为您对数据库发出了1000个查询?好主意,但是1000个查询需要10分钟?非常感谢($line=fgetcsv($handle)!==FALSE)完成了这项任务。我不知道false将使其立即执行。