通过cron作业运行的PHP脚本冻结。找不到原因,请帮帮我

时间:2014-07-31 08:32:39

标签: php magento ftp cron

背景信息:

我有一个看似简单的任务,每小时将一个带有库存和价格数据的xml发送到ftp位置。所以带有cron作业的php脚本应该完成任务。

此数据正在从现有的magento商店中检索。 cron设置正在运行,因为我们将cron作业用于许多其他任务。要运行执行此任务,我设置一个简单的扩展结构,从模型运行以下代码。看到magento识别扩展并且正在安排cron作业我不相信在这种情况下问题是magento,而是在实际的php代码中。

问题:

以下代码在过去的两天里变得越来越好,搜索谷歌以及Stack Overflow都没有产生结果。 当我手动运行代码时,我得到一个结果,文件被创建,脚本需要大约1分钟才能完成。但是,如果我安排cron作业,脚本运行大约4个小时,之后我收到消息:

  

作业的运行时间超过配置的max_running_time

守则:

<?php
ini_set('display_errors',1); 
error_reporting(E_ALL);
set_time_limit(0);

class VuyaniSoftware_NeckConnection_Model_StockUpdate
{

    public function sendStock(){


        //get the relavent products:

        $attributeVarientId = 'Ja';
        $attributeCode = 'neck_active';

        $products = Mage::getModel('catalog/product')
                            ->getCollection()
                            ->addAttributeToSelect(array('sku','name','description','price','special_price',))
                            ->addFieldToFilter(array(
                               array('attribute'=>'neck_active','eq'=>'Ja'),
                               array('attribute'=>'type_id','eq'=>'configurable'),
                               array('attribute'=>'status','eq' => Mage_Catalog_Model_Product_Status::STATUS_ENABLED),
                            ))
                            ->load();


        //create the structure for the xml feed:

        $xmlDoc = new DOMDocument();

            $root = $xmlDoc ->appendChild($xmlDoc ->createElement("NECK_STOCK"));
            foreach ($products as $product) {
                $childProducts = Mage::getModel('catalog/product_type_configurable')->getUsedProducts(null,$product);
                foreach($childProducts as $childProduct){
                    $ARTICLE = $root->appendChild($xmlDoc->createElement("product"));
                    $ARTICLE->appendChild($xmlDoc->createElement("mpn", $childProduct->sku));    
                    $stock = Mage::getModel('cataloginventory/stock_item')->loadByProduct($childProduct)->getQty();

                    $ARTICLE->appendChild($xmlDoc->createElement("stock", round($stock,0)));
                    $special_price=$product->special_price;
                    $ARTICLE->appendChild($xmlDoc ->createElement("salesPrice",round($product->price,2)));
                    if(($special_price !== NULL) && ($special_price !== 0)){
                        $ARTICLE->appendChild($xmlDoc ->createElement("special_price",round($product->special_price,2)));
                    }else{
                        $ARTICLE->appendChild($xmlDoc ->createElement("special_price",round($product->price,2)));
                    }
                }

            }

        //Save the feed to memory:

        $xmlDoc->formatOutput = true;

        $nameoffile="Stock_Export_".date("Ymd_His", time()+120*60).".xml";
        $data = $xmlDoc->saveXML();
        $tempHandle = fopen('php://memory', 'r+');
        fwrite($tempHandle, $data);
        rewind($tempHandle);

        // Connect to server //Job was running longer than the configured max_running_time

        $conn = ftp_connect("ftp.example.com") or die("Could not connect");

        ftp_login($conn,"***","***") or die("invelid username or password");

        // move to path where you need to upload file
        ftp_chdir($conn, "/Team Folders/NeckData/StockData") or die("could not find dir");

        ftp_pasv($conn, true);
        // upload file to particular path
        $upload = ftp_fput($conn, $nameoffile, $tempHandle, FTP_BINARY);

        if (!$upload) { echo 'FTP upload failed!'; }

        ftp_close($conn);
    }
}
?>

我出于安全原因阻止了ftp用户名和密码以及更改ftp服务器。我确信脚本中的数据是正确的。

我尝试了什么:

  • 使用save($ nameOfFile)以及saveXML()保存dom文档。

  • 将文件保存到当前文件夹中的磁盘上作为临时位置 我可以连接到ftp。

  • fopen(php:// memory)以及fopen(php:// temp)。

  • 在使用ftp_put或ftp_fput的不同场景中。

  • 设置可能用于文件权限777的所有位置(除外 php://记忆和临时,我不相信这是必要的吗?)

修改

这是config.xml:

<?xml version="1.0" encoding="UTF-8"?>

<!-- The root node for Magento module configuration -->
<config>
    <modules>
        <VuyaniSoftware_NeckConnection>
            <version>0.0.1</version>
        </VuyaniSoftware_NeckConnection>
    </modules>
    <global>
        <models>
        <NeckConnection>
        <class>VuyaniSoftware_NeckConnection_Model</class>
        </NeckConnection>
    </models>
    </global>    
    <crontab>
        <jobs>
            <NeckConnection_StockUpdate>
                <schedule><cron_expr>52 */1 * * *</cron_expr></schedule>
                <run><model>NeckConnection/StockUpdate::sendStock</model></run>
            </NeckConnection_StockUpdate>
        </jobs>
    </crontab>
</config>

1 个答案:

答案 0 :(得分:1)

添加
exit;
之后 ftp_close($conn);

如果没有帮助,您需要从前端检查脚本:

在config.xml中添加下一部分:

<frontend>
    <routers>
        <sendstock>
            <use>standard</use>
            <args>
                <module>VuyaniSoftware_NeckConnection</module>
                <frontName>sendstock</frontName>
            </args>
        </sendstock>
    </routers>   
</frontend>

使用下一个内容创建文件app / code /../ VuyaniSoftware / NeckConnection / controllers / TestController.php:

<?php

class VuyaniSoftware_NeckConnection_TestController extends Mage_Core_Controller_Front_Action {

    public function runAction() {
        Mage::getModel('neck_connection/stock_update')->sendStock();        
        echo 'Done';
    }
}

清除Magento缓存并在浏览器中打开:

http://your_site.com/sendstock/test/run

如果一切正常,你可以通过cron测试它:

52 * * * * / usr / bin / wget --no-check-certificate -O /var/log/cron_result.log http://your_site.com/sendstock/test/run