13

I have application built in Zend Framework 2. I would like to set cron job for updating my products. I know scripts such as this should be run from outside of public folder, but unfortunately my script in cron needs to use framework files.
How can I do this?
The only way I figured out is to run script from outside of public folder then add some hash or password and redirect to

www.domain.com/cron/test

So I will have all framework functionality.
Will it be secure? Maybe there is a other way?

4

2 回答 2

25

I strongly recommend to use CLI for such requirement.

  1. Create a ConsoleController with an updateAction() inside the application module.
  2. Add a console route to your application module's module.config.php:

    array(
        'router' => array(
            'routes' => array(
            ...
            )
        ),
    
    'console' => array(
        'router' => array(
            'routes' => array(
                'cronroute' => array(
                    'options' => array(
                        'route'    => 'updateproducts',
                        'defaults' => array(
                            'controller' => 'Application\Controller\Console',
                            'action' => 'update'
                        )
                    )
                )
            )
        )
    )
    );
    
  3. Now open the terminal and

    $ cd /path/to/your/project
    $ php public/index.php updateproducts
    

Thats all. Hope it helps.

于 2013-11-03T11:21:23.753 回答
2

I found the solution at collabnet (Which is now dead).

I am copying the solution here as ColabEdit sometimes removes posts:

<?php
/*
Cron directory setup:

Cron
    config
        module.config.php
    src
        Cron
            Controller
                IndexController.php
    autoload_classmap.php
    Module.php                

NOTES: Remember to include the Cron module in the main config file (trunk/config/application.config.php)

Once you have the route in place, write your cron and call it from your webhost cron manager.

*/

// Cron/config/module.config.php
return array(
    // Placeholder for console routes
    'controllers' => array(
        'invokables' => array(
            'Cron\Controller\IndexController' => 'Cron\Controller\IndexController'
        ),
    ),
    'console' => array(
        'router' => array(
            'routes' => array(
                //CRON RESULTS SCRAPER
                'my-first-route' => array(
                    'type'    => 'simple',       // <- simple route is created by default, we can skip that
                    'options' => array(
                    'route'    => 'hello',
                    'defaults' => array(
                        'controller' => 'Cron\Controller\IndexController',
                        'action'     => 'index'
                        )
                    )
                )

            ),
        ),
    ),


);

<?php
// Cron/src/Cron/Controller/IndexController.php
namespace Cron\Controller;

use Zend\Mvc\Controller\AbstractActionController;

class IndexController extends AbstractActionControlle
{
    public function indexAction()
    {
        echo "hello";
        echo "\r\n";
    }
}

From the console navigate to trunk (or public_html) (the directory before public) and run:

path/to/trunk>php public/index.php hello

hello
path/to/trunk>
于 2014-05-22T10:43:15.093 回答