Asked  7 Months ago    Answers:  5   Viewed   31 times

I would like to run a Zend Framework action to generate some files, from command line. Is this possible and how much change would I need to make to my existing Web project that is using ZF?




It's actually much easier than you might think. The bootstrap/application components and your existing configs can be reused with CLI scripts, while avoiding the MVC stack and unnecessary weight that is invoked in a HTTP request. This is one advantage to not using wget.

Start your script as your would your public index.php:


// Define path to application directory
    || define('APPLICATION_PATH',
              realpath(dirname(__FILE__) . '/../application'));

// Define application environment
    || define('APPLICATION_ENV',
              (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV')
                                         : 'production'));

require_once 'Zend/Application.php';
$application = new Zend_Application(
    APPLICATION_PATH . '/configs/config.php'

//only load resources we need for script, in this case db and mail
$application->getBootstrap()->bootstrap(array('db', 'mail'));

You can then proceed to use ZF resources just as you would in an MVC application:

$db = $application->getBootstrap()->getResource('db');

$row = $db->fetchRow('SELECT * FROM something');

If you wish to add configurable arguments to your CLI script, take a look at Zend_Console_Getopt

If you find that you have common code that you also call in MVC applications, look at wrapping it up in an object and calling that object's methods from both the MVC and the command line applications. This is general good practice.

Wednesday, March 31, 2021
answered 7 Months ago

As @Aydin Hassan commented, I've tried with:

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$excelOutput = ob_get_clean();

And then simply passed $excelOutput to the response content, and it works simply great!

Saturday, May 29, 2021
answered 5 Months ago

If your Main class is in a package called FileManagement, then try:

java -cp . FileManagement.Main

in the parent folder of the FileManagement folder.

If your Main class is not in a package (the default package) then cd to the FileManagement folder and try:

java -cp . Main

More info about the CLASSPATH and how the JRE find classes:

  • How Classes are Found
  • Setting the class path (Solaris/Linux)
Wednesday, July 28, 2021
answered 3 Months ago

Run phpunit with the -stderr flag, (newer versions may use --stderr instead) e.g.

 phpunit -stderr mytest.php
 # or
 phpunit --stderr mytest.php

This directs phpunit's output to stderr, preventing it from interrupting HTTP header generation.

It's possible that the test works on your friend's machine because he has output buffering enabled (although I'm not sure if that's relevant in a CLI context).

Wednesday, July 28, 2021
answered 3 Months ago

Are you sure the script doesn't contain any errors? This is what normally makes "execution terminates very quickly".
First, append:

error_reporting(E_ALL); ini_set('display_errors', 1);

at the top of your script to display any errors it may have, then you can use:

nohup php filename.php &

nohup runs a command even if the session is disconnected or the user logs out.


nohup php filename.php >/dev/null 2>&1 &

Same as above but doesn't create nohup.out file.

You can also use:

Set whether a client disconnect should abort script execution


Limits the script maximum execution time, in this case it will run until the process finishes or the apache process restarts.


The php and the filename.php paths may be provided as a full-path, instead of php and filename.php, you can use /usr/bin/php and /full/path/to/filename.php.
Full Path is recommended to avoid file not found errors.

Wednesday, July 28, 2021
answered 3 Months ago
Only authorized users can answer the question. Please sign in first, or register a free account.
Not the answer you're looking for? Browse other questions tagged :