从CSV使用PHP更新MySQL时超时

从CSV使用PHP更新MySQL时超时,php,mysql,csv,cron,timeout,Php,Mysql,Csv,Cron,Timeout,我需要想出一种方法,使一个大任务更快地完成,以超过超时时间 由于托管公司的限制,我对服务器的访问非常有限 我建立了一个系统,其中cron访问一个PHP文件,该文件获取包含某些产品数据的csv。csv不包含产品将具有的所有字段。只是一些基本的 我读过很多关于超时和处理csv的文章,目前(为了节省时间),我制作了一个表格(我们称之为csv_数据)来保存csv数据。我有一个脚本,它截断csv_数据表,然后插入来自csv的数据,这样每晚csv的最新记录集都在该表中(csv文件每晚更新)。到目前为止,没有

我需要想出一种方法,使一个大任务更快地完成,以超过超时时间

由于托管公司的限制,我对服务器的访问非常有限

我建立了一个系统,其中cron访问一个PHP文件,该文件获取包含某些产品数据的csv。csv不包含产品将具有的所有字段。只是一些基本的

我读过很多关于超时和处理csv的文章,目前(为了节省时间),我制作了一个表格(我们称之为csv_数据)来保存csv数据。我有一个脚本,它截断csv_数据表,然后插入来自csv的数据,这样每晚csv的最新记录集都在该表中(csv文件每晚更新)。到目前为止,没有超时问题。该任务只需要大约4-5秒

超时发生在我必须筛选数据以更新products表时。它现在运行的步骤如下所示

1. Get the sku from csv_data table (that holds thousands of records)
2. Select * from Products where products.sku = csv.sku (products table also holds thousands of records to loop through)
3. Get numrows.   
    If numrows<0{no record in products, so skip}. 
    If numrows>1{duplicate entries, don't change anything, but later on report the sku}
    If numrows==1{Update selected fields in the products table with csv data}
4. Go to the next record in csv_data all over again

我认为你可以用cron解决这个问题。它从来没有超时过。

我想你可以用cron解决这个问题。它从来没有超时过。

是在返回第一行之前超时,还是在读取期间在行之间超时?一个很好的做法是分块处理查询;首先进行计数,查看您正在处理的SKU记录数量,然后循环较小的数据块(这些数据块的大小取决于您必须对每行执行多少操作)。更新后的工作流更像这样:

  • 从CSV获取下一个SKU
  • 获取总计数:
    从products.sku=csv.sku的产品中选择count(*)作为totalCount
  • 确定块大小(此演示使用25)
  • loopCount=ceil(totalCount/25)
  • 使用如下循环遍历所有结果:
    for($i=0;$i
  • 在循环中,您应该运行如下查询:
    SELECT*FROM products WHERE products.sku=csv.sku LIMIT(loopCount*25),25

  • 您将希望对所选块使用固定顺序;您的唯一ID可能是最好的。

    是在返回第一行之前超时,还是在读取期间在行之间超时?一个很好的做法是分块处理查询;首先进行计数,查看您正在处理的SKU记录数量,然后循环较小的数据块(这些数据块的大小取决于您必须对每行执行多少操作)。更新后的工作流更像这样:

  • 从CSV获取下一个SKU
  • 获取总计数:
    从products.sku=csv.sku的产品中选择count(*)作为totalCount
  • 确定块大小(此演示使用25)
  • loopCount=ceil(totalCount/25)
  • 使用如下循环遍历所有结果:
    for($i=0;$i
  • 在循环中,您应该运行如下查询:
    SELECT*FROM products WHERE products.sku=csv.sku LIMIT(loopCount*25),25

  • 您将希望对所选块使用固定顺序;您的唯一ID可能是最好的。

    显示您的代码,这样我就可以帮助建议一个“延迟加载处理程序”在您不需要的时候永远不要抓取
    *
    (这也取决于您每行有多少数据),如果您只需要知道
    numrows
    只需抓取一个ID,或者单个值并进行测试。Jakub,谢谢:)我抓起了product.sku字段,它将我的时间减少到了1.5分钟,我已经超过了超时时间耶!!!!!谢谢你,你确实帮了我很大的忙。我还将实现Shawn的想法,看看我是否能更快地完成它,因为虽然1.5分钟很好,但随着越来越多的产品添加到csvSorry,我可以看到脚本需要更高的效率,这些代码在格式和工作流程方面都很混乱。但是如果你提到成千上万的记录,那应该不是问题。你在SKU列上有索引吗?显示你的代码,这样我就可以帮助建议一个“惰性负载处理程序”在你不需要的时候永远不要抓取
    *
    (这取决于你每行也有多少数据),如果你只需要知道
    numrows
    ,只需抓取一个id,或者单个值,然后进行测试。Jakub,谢谢:)我抓起了product.sku字段,它将我的时间减少到了1.5分钟,我已经超过了超时时间耶!!!!!谢谢你,你确实帮了我很大的忙。我还将实现Shawn的想法,看看我是否能更快地完成它,因为虽然1.5分钟很好,但随着越来越多的产品添加到csvSorry,我可以看到脚本需要更高的效率,这些代码在格式和工作流程方面都很混乱。但是如果你提到成千上万的记录,那应该不是问题。SKU列上有索引吗?我希望我可以cron。不幸的是,Web服务器提供的访问权限是无限的。我希望我可以cron。不幸的是,Web服务器提供的访问权限是无限的。它在两行之间超时。我已经用一个只有100条记录的csv测试了它,它工作得很好(很慢但很好)。。。。我将尝试这个方法,看看是否能解决它:)我很快就会更新。感谢Shawn,如果在行之间超时,上述解决方案应该可以解决此问题。我有兴趣知道如何去,所以请发回:)。此外,对于较小的文件,它可能会稍微慢一点,因为您正在处理多个请求,但您可以调整块大小,以找到最佳性能/可靠性混合。享受吧!嗨,肖恩,我对stackoverflow还比较陌生,所以如果我做得不对,请原谅我。我(根据评论框中的字符限制)假设我应该编辑你的答案,然后将我的回复放入。达斯汀,通常人们编辑自己的帖子,并添加一个“解决方案:”部分,在其中提供代码片段或类似的内容;这样,当其他人找到帖子时,他们可以很快看到你是如何找到的
    $csvdata="SELECT * FROM csv_update";
        $csvdata_result=mysql_query($csvdata); 
        mysql_query($csvdata);
        $csvdata_num = mysql_num_rows($csvdata_result);
        $i=0;       
    while($i<$csvdata_num){
    
    $csv_code=@mysql_result($csvdata_result,$i,"skucode");
    
    $datacheck=NULL;    
    $datacheck=substr($csv_code,0,1);
    
    if($datacheck>='0' && $datacheck<='9'){
    
    $csv_price=@mysql_result($csvdata_result,$i,"price");
    $csv_retail=@mysql_result($csvdata_result,$i,"retail");
    $csv_stock=@mysql_result($csvdata_result,$i,"stock");
    $csv_weight=@mysql_result($csvdata_result,$i,"weight");
    $csv_manufacturer=@mysql_result($csvdata_result,$i,"manufacturer");
    $csv_misc1=@mysql_result($csvdata_result,$i,"misc1");
    $csv_misc2=@mysql_result($csvdata_result,$i,"misc2");
    $csv_selectlist=@mysql_result($csvdata_result,$i,"selectlist");
    $csv_level5=@mysql_result($csvdata_result,$i,"level5");
    $csv_frontpage=@mysql_result($csvdata_result,$i,"frontpage");
    $csv_level3=@mysql_result($csvdata_result,$i,"level3");
    $csv_minquantity=@mysql_result($csvdata_result,$i,"minquantity");
    $csv_quantity1=@mysql_result($csvdata_result,$i,"quantity1");
    $csv_discount1=@mysql_result($csvdata_result,$i,"discount1");
    $csv_quantity2=@mysql_result($csvdata_result,$i,"quantity2");
    $csv_discount2=@mysql_result($csvdata_result,$i,"discount2");
    $csv_quantity3=@mysql_result($csvdata_result,$i,"quantity3");
    $csv_discount3=@mysql_result($csvdata_result,$i,"discount3");
    
        $count_check="SELECT COUNT(*) AS totalCount FROM products WHERE skucode = '$csv_code'";
        $count_result=mysql_query($count_check); 
        mysql_query($count_check);
        $totalCount=@mysql_result($count_result,0,'totalCount');
        $loopCount = ceil($totalCount / 25);
        for($j = 0; $j < $loopCount; $j++){
    
        $prod_check="SELECT skucode FROM products WHERE skucode = '$csv_code' LIMIT ($loopCount*25), 25;";
        $prodresult=mysql_query($prod_check); 
        mysql_query($prod_check);
        $prodnum =@mysql_num_rows($prodresult);
        $prod_id=@mysql_result($prodresult,0,"catalogid");
    
    
        if($prodnum<1){ 
        echo "NOT FOUND:$csv_code<br>";
        $count_sku_not_found=$count_sku_not_found+1;
        $list_sku_not_found=$list_sku_not_found." $csv_code";}
    
        if($prodnum>1){ 
        echo "DUPLICATE:$csv_ccode<br>";    
        $count_duplicate_skus=$count_duplicate_skus+1;
        $list_duplicate_skus=$list_duplicate_skus." $csv_code";}
    
    
    if ($prodnum==1){
    ///This prevents an overwrite from happening if the csv file doesn't produce properly
        if ($csv_price!="" OR $csv_price!=NULL)
        {$sql_price='price="'.$csv_price.'"';}
    
        if ($csv_retail!="" OR $csv_retail!=NULL)
        {$sql_retail=',retail="'.$csv_retail.'"';}
    
        if ($csv_stock!="" OR $csv_stock!=NULL)
        {$sql_stock=',stock="'.$csv_stock.'"';}
    
        if ($csv_weight!="" OR $csv_weight!=NULL)
        {$sql_weight=',weight="'.$csv_weight.'"';}
    
        if ($csv_manufacturer!="" OR $csv_manufacturer!=NULL)
        {$sql_manufacturer=',manufacturer="'.$csv_manufacturer.'"';}
    
        if ($csv_misc1!="" OR $csv_misc1!=NULL)
        {$sql_misc1=',misc1="'.$csv_misc1.'"';}
    
        if ($csv_misc2!="" OR $csv_misc2!=NULL)
        {$sql_pother2=',pother2="'.$csv_misc2.'"';}
    
        if ($csv_selectlist!="" OR $csv_selectlist!=NULL)
        {$sql_selectlist=',selectlist="'.$csv_selectlist.'"';}
    
        if ($csv_level5!="" OR $csv_level5!=NULL)
        {$sql_level5=',level5="'.$csv_level5.'"';}
    
        if ($csv_frontpage!="" OR $csv_frontpage!=NULL)
        {$sql_frontpage=',frontpage="'.$csv_frontpage.'"';}
    
    
    
    $import="UPDATE products SET $sql_price $sql_retail $sql_stock $sql_weight $sql_manufacturer $sql_misc1 $sql_misc2 $sql_selectlist $sql_level5 $sql_frontpage    $sql_in_stock WHERE skucode='$csv_code'";
     mysql_query($import) or die(mysql_error("error updating in products table"));
    
    
    echo "Update ".$csv_code." successful ($i)<br>";
    
    $count_success_update_skus=$count_success_update_skus+1;
    $list_success_update_skus=$list_success_update_skus." $csv_code";
    
    
    
    //empty out variables 
    $sql_price='';
    $sql_retail='';
    $sql_stock='';
    $sql_weight='';
    $sql_manufacturer='';
    $sql_misc1='';
    $sql_misc2='';
    $sql_selectlist='';
    $sql_level5='';
    $sql_frontpage='';
    $sql_in_stock='';
    $prodnum=0;
    
    }
    }
    $i++;
    }