【问题标题】:Long PHP script does not run completely长 PHP 脚本无法完全运行
【发布时间】:2015-08-16 06:35:20
【问题描述】:

问题

我正在尝试在 PHP 中执行一个读取 CSV 文件的脚本,并且对于脚本读取的每一行,它都会获取代码以验证它是否已存在于数据库中。如果此代码存在于数据库中,则更新库存,如果不存在,则插入数据库。

我的 CSV 文件有 700 多行,每行至少执行 2 次查询,因此集成页面超时。

尝试 创建了一个禁用 GZIP 的 .htaccess 文件。

SetEnv no-gzip 1

将我的时间限制设置为超过 1000+

set_time_limit(9999999999);

发生了什么

当我运行脚本时,它会读取 40 行并停止执行并停止加载。

编辑

对每一行执行以下代码:

if ($produto->getId()) {
    $stock = $produto->getStockData();
    $stock['qty'] = $quantidade;
    $stock['is_in_stock'] = $this->initStock($quantidade);
    $stock['manage_stock'] = 1;
    $stock['use_config_manage_stock'] = 1;
    if ($altura > 0)
        $produto->setData('volume_altura', $altura);
    if ($comprimento > 0)
        $produto->setData('volume_comprimento', $comprimento);
    if ($largura > 0)
        $produto->setData('volume_largura', $largura);
    $produto->setData('weight', $this->initWeight($peso));
    $produto->setStockData($stock);

    if ($produto->save()) {
       $this->showLog('<EDIT> Produto com código [' . $codigo . '] editado com sucesso.', true);
       $this->writeLog('<EDIT> Produto com código [' . $codigo . '] editado com sucesso.');
    } else {
        $this->showLog('<EDIT> Não foi possível editar o produto com código [' . $codigo . ']', false);
        $this->writeLog('<EDIT> Não foi possível editar o produto com código [' . $codigo . ']');
    }
} else {
    $produto = Mage::getModel('catalog/product');
    $produto->setTypeId('simple');
    $produto->setAttributeSetId(4);
    $produto->setData('tax_class_id', 0);
    $produto->setVisibility(1);
    $produto->setStatus(1);
    $produto->setData('sku', $sku);
    $produto->setData('color', $cor);
    $produto->setData('name', utf8_encode($descricao));
    $produto->setData('marca', $this->initAttribute(148, $marca));
    $produto->setData('codigo_barra', $codBarra);
    $produto->setData('price', $preco);
    if ($altura > 0)
        $produto->setData('volume_altura', $altura);
    if ($comprimento > 0)
        $produto->setData('volume_comprimento', $comprimento);
    if ($largura > 0)
        $produto->setData('volume_largura', $largura);
        $produto->setData('cost', $custo);
        $stock['qty'] = $quantidade;
        $stock['is_in_stock'] = $this->initStock($quantidade);
        $stock['manage_stock'] = 1;
        $stock['use_config_manage_stock'] = 1;
        $produto->setStockData($stock);
        $produto->setData('weight', $this->initWeight($peso));

        if ($produto->save()) {
            $this->showLog('<NEW> O produto com código [' . $codigo . '] foi adicionado com sucesso.', true);
            $this->writeLog('<NEW> O produto com código [' . $codigo . '] foi adicionado com sucesso.');
        } else {
            $this->showLog('<NEW> - Não foi possível adicionar o produto com código [' . $codigo . ']', false);
            $this->writeLog('<NEW> - Não foi possível adicionar o produto com código [' . $codigo . ']');
        }
}

已解决:

我在代码的开头发现了一个 OB_START(),但我没有使用 ob。当我删除脚本恢复工作正常。

【问题讨论】:

  • 这些查询是否针对这样的事情进行了优化?您能在日志文件中看到任何错误吗?
  • 您能提供您的查询吗?
  • 看来你得增加max_execution_time
  • @Epodax 我编辑并插入执行查询的代码。
  • 它总是停在 40,还是有时更多有时更少?

标签: php magento integration


【解决方案1】:

除非您有一个异常大/效率低下的数据库/查询运行 1400 个查询,否则不应花费太长时间以至于超时。

如果可能,将脚本作为 cli 脚本运行并查看输出内容和运行时间(cli 脚本没有最大执行时间)。

您至少需要包含伪代码,以便我们帮助调试它。

要进行更多调试,请在每次迭代中添加输出行并刷新输出缓冲区。这将确保页面不会超时。

【讨论】:

  • 我也试过cron作业,代码停在40~50之间。
  • 我会开始注销您正在处理的所有数据,看看您尝试保存的数据是否存在明显问题。
  • 您要检查 csv 文件吗?
猜你喜欢
  • 2020-08-12
  • 2022-06-16
  • 2011-06-25
  • 2013-03-16
  • 2012-06-27
  • 1970-01-01
  • 2011-10-30
  • 2017-05-22
  • 2016-09-14
相关资源
最近更新 更多