Accessing Model in CConsoleCommand

Hi all,

I set up a Command : "cron".

In my local server or in production (unix) server the very very basic command works

very very basic = just write in a file a timestamp whenever the command is called.

I was happy, creating a command was easy, and I decided to access models of my application in my "cron" command.

And then There is problem. Accessing Models seems to be a problem

my console config file contains all needed (i hope)


	

return array(

	'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',

	'name'=>'console',

    // preloading 'log' component

	'preload'=>array('log'),


	// autoloading model and component classes

	'import'=>array(

		'application.models.*',

		'application.components.*',

	),

	// application components

	'components'=>array(


		// uncomment the following to use a MySQL database

		'db'=>array(

			'connectionString' => 'mysql:host=localhost;dbname=yii_ama',

			'emulatePrepare' => true,

			'username' => 'root',

			'password' => 'root',

			'charset' => 'utf8',

            'enableProfiling'=>true,

            'enableParamLogging' => true,            

		),

		

        'log'=>array(

            'class'=>'CLogRouter',

            'routes'=>array(

                array(

                    'class'=>'CFileLogRoute',

                    'logFile'=>'cron.log',

                    'levels'=>'error, warning',

                ),

                array(

                    'class'=>'CFileLogRoute',

                    'logFile'=>'cron_trace.log',

                    'levels'=>'trace',

                ),

            ),

        ),        

	),


);



In my cron command :




class CronCommand extends CConsoleCommand {

    

    private $_mDateArray;

    

 

    public function run($args) {

        Yii::app()->setTimeZone("Europe/Paris");

		$this->_mDateArray = CTimestamp::getDate();        

        

        $myProfilcompte = new ProfilCompte;

        

        

    }

}



And when I launched the command I get:




PHP Error[2]: PDO::__construct(): [2002] No such file or directory (trying to connect via unix:///var/mysql/mysql.sock)

    in file /Volumes/HD2/travail/www/yii/db/CDbConnection.php at line 405

#0 /Volumes/HD2/travail/www/yii/db/CDbConnection.php(405): PDO->__construct()

#1 /Volumes/HD2/travail/www/yii/db/CDbConnection.php(356): CDbConnection->createPdoInstance()

#2 /Volumes/HD2/travail/www/yii/db/CDbConnection.php(313): CDbConnection->open()

#3 /Volumes/HD2/travail/www/yii/db/CDbConnection.php(291): CDbConnection->setActive()

#4 /Volumes/HD2/travail/www/yii/base/CModule.php(372): CDbConnection->init()

#5 /Volumes/HD2/travail/www/yii/base/CApplication.php(429): CConsoleApplication->getComponent()

#6 /Volumes/HD2/travail/www/yii/db/ar/CActiveRecord.php(609): CConsoleApplication->getDb()

#7 /Volumes/HD2/travail/www/yii/db/ar/CActiveRecord.php(2275): ProfilCompte->getDbConnection()

#8 /Volumes/HD2/travail/www/yii/db/ar/CActiveRecord.php(372): CActiveRecordMetaData->__construct()

#9 /Volumes/HD2/travail/www/yii/db/ar/CActiveRecord.php(387): model()

#10 /Volumes/HD2/travail/www/yii/db/ar/CActiveRecord.php(62): ProfilCompte->getMetaData()

#11 /Volumes/HD2/travail/www/amayiii/protected/commands/CronCommand.php(13): ProfilCompte->__construct()

#12 /Volumes/HD2/travail/www/yii/console/CConsoleCommandRunner.php(63): CronCommand->run()

#13 /Volumes/HD2/travail/www/yii/console/CConsoleApplication.php(88): CConsoleCommandRunner->run()

#14 /Volumes/HD2/travail/www/yii/base/CApplication.php(158): CConsoleApplication->processRequest()

#15 /Volumes/HD2/travail/www/yii/yiic.php(33): CConsoleApplication->run()

#16 /Volumes/HD2/travail/www/amayiii/protected/yiic.php(7): require_once()



Do you know where this problem comes from ?

Thanks

try to change db connection string to use TCP sockets not file one:

‘connectionString’ => ‘mysql:host=127.0.0.1;dbname=yii_ama’,

Thanks redguy,

but seems to be the same, error message,




$ php yiic.php cron

PHP Error[2]: PDO::__construct(): [2002] Connection refused (trying to connect via tcp://127.0.0.1:3306)

    in file /Volumes/HD2/travail/www/yii/db/CDbConnection.php at line 406

#0 /Volumes/HD2/travail/www/yii/db/CDbConnection.php(406): PDO->__construct()

#1 /Volumes/HD2/travail/www/yii/db/CDbConnection.php(356): CDbConnection->createPdoInstance()

#2 /Volumes/HD2/travail/www/yii/db/CDbConnection.php(313): CDbConnection->open()

#3 /Volumes/HD2/travail/www/yii/db/CDbConnection.php(291): CDbConnection->setActive()

#4 /Volumes/HD2/travail/www/yii/base/CModule.php(372): CDbConnection->init()

#5 /Volumes/HD2/travail/www/yii/base/CApplication.php(429): CConsoleApplication->getComponent()

#6 /Volumes/HD2/travail/www/yii/db/ar/CActiveRecord.php(609): CConsoleApplication->getDb()

#7 /Volumes/HD2/travail/www/yii/db/ar/CActiveRecord.php(2275): Pays->getDbConnection()

#8 /Volumes/HD2/travail/www/yii/db/ar/CActiveRecord.php(372): CActiveRecordMetaData->__construct()

#9 /Volumes/HD2/travail/www/yii/db/ar/CActiveRecord.php(387): model()

#10 /Volumes/HD2/travail/www/yii/db/ar/CActiveRecord.php(62): Pays->getMetaData()

#11 /Volumes/HD2/travail/www/amayiii/protected/commands/CronCommand.php(13): Pays->__construct()

#12 /Volumes/HD2/travail/www/yii/console/CConsoleCommandRunner.php(63): CronCommand->run()

#13 /Volumes/HD2/travail/www/yii/console/CConsoleApplication.php(88): CConsoleCommandRunner->run()

#14 /Volumes/HD2/travail/www/yii/base/CApplication.php(158): CConsoleApplication->processRequest()

#15 /Volumes/HD2/travail/www/yii/yiic.php(33): CConsoleApplication->run()

#16 /Volumes/HD2/travail/www/amayiii/protected/yiic.php(7): require_once()



error message seems different, here is a connection refused :blink:

is there MySQL server running on the same machine? I think it is impossible that web application on same server can connect to it and console application cannot… How is the web application configured (connection string)?

are there any differences in php.ini for CLI php and web (cgi/mod_php/other)?

When I access database through web application, it works fine.

The config main for web application and the console config have the same db connection information

Problem is coming from




$connection=new CDbConnection("mysql:host=127.0.0.1;dbname=yii_ama",'root','root');



And trying




$connection=new CDbConnection("mysql:host=localhost;dbname=yii_ama",'root','root');



Those 2 lines lead to error. But not the same

I think it is not a Yii problem (Or me using Yii), it would be a php, ini problem because when I write :


    public function run($args) {

        Yii::app()->setTimeZone("Europe/Paris");

		$this->_mDateArray = CTimestamp::getDate();        

       

        $link = mysql_connect('localhost', 'root', 'root');

        //$connection=new CDbConnection("mysql:host=127.0.0.1;dbname=yii_ama",'root','root');

        //$connection->active=true;

            

    }

it leads to error.

I read php.ini and I don’t find something strange.

But my knowledge regarding all info inside php.ini is weak … :-X

check also my.cnf (mysql configuration),

netstat -lpn (to check if mysql is listening on TCP socket, port and/or file socket and its location)

check if TCP port is default, or try to point to unix socket file in connection string:

mysql:dbname=testdb;unix_socket=/path/to/socket

(you musn’t specify host when using socket)

OK,

so I re install all the stuff in a PC/windows and all works fine. Accessing database, Yii’s model.

Conclusion: it is the set up in my Macintosh which is wrong.

When I see in php.ini : mysql.default_socket = /Applications/MAMP/tmp/mysql/mysql.sock and when I search mysql.sock this file is not present… :o

Then connection can’t be done

Solution:




sudo mkdir /var/mysql

sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock /var/mysql/mysql.sock




Thanks All for your help :)